Решил выложить старый способ, который сделал год назад. Не знаю, может кому и пригодится..
Если хотите править трафик в айфоновских приложениях, можно его пустить через самописный прокси вручную.
Берёте линкс-маршрутизатор с айпитейблес, прописываем на нём правила
Код:
LAN_IF="br0" тут имя интерфейса, у меня это имя вайфай модуля в маршрутизаторе
PROXY_IP="192.168.1.101" адрес нашего прокси
PROXY_PORT="8008" порт нашего прокси
TARGET_IP="123.123.123.123" адрес, куда коннектится программа, трафик которой хочем править
TARGET_PORT="80" порт, куда коннектится программа, трафик которой хочем править
iptables -t nat -A PREROUTING -i $LAN_IF -p tcp -s ! $PROXY_IP -d $TARGET_IP --dport $TARGET_PORT -j DNAT --to $PROXY_IP:$PROXY_PORT
iptables -t nat -A POSTROUTING -p tcp -s ! $PROXY_IP -d $PROXY_IP --dport $PROXY_PORT -j MASQUERADE
iptables -t nat -A POSTROUTING -p tcp -s $PROXY_IP --sport $PROXY_PORT -d ! $PROXY_IP -o $LAN_IF -j SNAT --to-source $TARGET_IP:$TARGET_PORT
Тем самым мы перенаправляем весь трафик на наш прокси.
Теперь и сам простенький прокси на пайтоне:
Код:
#-------------------------------------------------------------------------------
# Name: PyFilter
# Purpose: Proxy + modify (inject) packets.
# "Never trust to client" white paper example.
#
#
# Author: Noise
#
# Created: 12.02.2011
# Copyright: (c) Noise 2011
# Licence: Link to me
#-------------------------------------------------------------------------------
#!/usr/bin/env python
from socket import *
import socket
import sys
import time
import thread
import string
import threading
import os
import random
import asyncore
#Vars
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
proxyhost = '123.123.123.123' # Тут адрес, куда наша программа на айфоне коннектится
proxyport = 80 # Тут порт, -//-
HOST = '0.0.0.0'
PORT = 8008 # Порт который будем слушать
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def recvr (sock, addr, clsock) :
print "recv thread started"
while (1):
try:
data = sock.recv(250000)
except socket.error, msg:
print msg
if not data: break;
## Тут идёт фильтр входящих пакетов
if data.find('Ted')!=-1:
print data
data = data.replace('Ted','Ped')
print data
print 'HOOKED!'
print "[" + time.strftime("%H:%M:%S", time.gmtime()) + "] ~~ RECV ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
print len(data)
clsock.send(data)
data = ""
time.sleep(0.0001)
def handler (sock, addr) :
data = ''
dta = ''
print "got connection will try to connect"
s = socket.socket(AF_INET, SOCK_STREAM)
try:
s.connect((proxyhost,proxyport))
except socket.error, msg:
print "socket error\n"
print msg
thread.start_new_thread(recvr, (s, addr, sock))
print "connected"
while (1):
try:
data = sock.recv(250000)
except socket.error, msg:
print msg
if not data : break
## тут можно править исходящие
print "[" + time.strftime("%H:%M:%S", time.gmtime()) + "] ~~ SEND ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
print data
s.send(data)
data = ""
time.sleep(0.001)
def main():
PADDR = (proxyhost, PORT)
ADDR = (HOST, PORT)
serversock = socket.socket(AF_INET, SOCK_STREAM)
serversock.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
serversock.bind(ADDR)
serversock.listen(5)
print "Waiting for connections..."
while (1):
time.sleep(0.001)
clsock, addr = serversock.accept()
thread.start_new_thread(handler, (clsock,addr))
pass
if __name__ == '__main__':
main()
Всё это проделывалось год назад, так что если у кого-то что-то не получается, пишите в пм, вместе разберём ошибки.