Проблемы с подменой соединения.

Тема в разделе "WASM.BEGINNERS", создана пользователем flipper, 13 мар 2007.

  1. flipper

    flipper New Member

    Публикаций:
    0
    Регистрация:
    5 мар 2007
    Сообщения:
    17
    Не мог бы кто-нибудь помочь разобраться с такой проблемой: моя полезная программа =) по задумке должна подменять соединения в internet explorer и выводить страницу нужного нам сайта. На данный момент она перехватывает ws2_32!connect и ws2_32!send. Каждое соединение подменяется на соединение с нужным нам ip (допустим 85.249.139.254 -wasm.ru), то есть по всей логике с другим хостом браузер соединиться не может. После каждой новой попытки соединения первый посылаемый на хост запрос подменяется запросом вида:
    Код (Text):
    1. GET / HTTP/1.1  
    2. Accept: */*  
    3. Accept-Language: ru  
    4. Accept-Encoding: gzip, deflate  
    5. User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; MRA 4.8 (build 01709); InfoPath.1)  
    6. Host: www.wasm.ru  
    7. Connection: Keep-Alive
    Последующие запросы отсылаются в исходном виде, так как их содержание, как я понимаю, зависит от ответа целевого сервера на первый запрос. Перехват реализован так, что при каждой попытке использования ws2_32!connect выводится msgbox; при отсылке запроса его содержимое выводится таким же образом. Знаки "!" игнорируются и отсылаются в первоначальном виде.
    Проблема вот в чем: если в адресной строке набрать www.wasm.ru, то 1) Вызавается перехватчик connect и устанавливается соединение с 85.249.139.254 2) Send посылает знак "!" 3) Send посылает запрос, который мы подменяем на приведенный выше 4) Последующие запросы отсылаются в исходном виде (у всех Host: www.wasm.ru), загружается стартовая страница wasm.ru.
    Если же набрать например www.google.ru - то п.1,2 и 3 выполнятся, как и в предыдущем шаге. После - не будет отсылаться никаких запросов, а просто загрузится google. То есть по логике не может происходить соединений с хостами, кроме заданного в перехватчике; не посылается не единого запроса со значением google.ru заголовка Host, cookie и журнал посещений очищены - и всетаки google откуда-то подгружается. Подскажите пожалуйста - в чем может быть проблема?
     
  2. Consto

    Consto New Member

    Публикаций:
    0
    Регистрация:
    20 апр 2006
    Сообщения:
    79
    Сервер может ответить, что страница не изменилась с последнего посещения и тогда ie будет грузить из temprorary.. Придётся изменять ответ.
    Как сервер говорит что страница не изменилась не помню
     
  3. flipper

    flipper New Member

    Публикаций:
    0
    Регистрация:
    5 мар 2007
    Сообщения:
    17
    А с помощью чего можно посмотреть ответ сервера? Пробовал перехватывать ws2_32!WSAReсv и wsock32!recv - после вызова функций в буфере какая-то каша. На перехват ws2_32!recv браузер вообще не реагирует.
     
  4. Hmm

    Hmm New Member

    Публикаций:
    0
    Регистрация:
    22 ноя 2006
    Сообщения:
    162
    Поищи в сети плагин к ie(или фоксу) .Полезная штука. Лично я им смотрю .
    Или , как вариант можно загружать страницу из php , через fread. Оно тоже показывает заголовки , хотя не уверен , что все.

    Имхо , браузер вообще может не смотреть ответ сервера. А сразу лезет в кэш.
    Конкретно по indexу гугла :

    HTTP/1.1 200 OK
    Cache-Control: private
    Content-Type: text/html; charset=UTF-8
    Content-Encoding: gzip
    Server: GWS/2.1
    Content-Length: 2592
    Date: Thu, 15 Mar 2007 01:54:52 GMT

    Т е судя по Cache-control: private
    он кэшируется на какой то стандартный срок , а потом обновляется.
    (Нифига не помню , на какой).
     
  5. flipper

    flipper New Member

    Публикаций:
    0
    Регистрация:
    5 мар 2007
    Сообщения:
    17
    Но всетаки если надо не только посмотреть но и подправить ответ сервера, какую ф-ю перехватывать? На форумах говорят про перехват recv (не уточняется, из какой библиотеки). Но она, как ни пытаюсь, не возвращает ответ сервера, или я что-то не так делаю? Пробую идти на разные сайты, в том числе на те, где раньше никогда не был, после соединения браузер неоднократно вызывает ws2_32!WSAReсv и wsock32!recv, после вызова в буфере нет строки вида

    HTTP/1.1 200 OK
    Cache-Control: private
    Content-Type: text/html; charset=UTF-8
    ........

    только набор бесполезных для меня кодов, которые и как символы интерпретировать нельзя.
     
  6. Hmm

    Hmm New Member

    Публикаций:
    0
    Регистрация:
    22 ноя 2006
    Сообщения:
    162
    А . Ну насчет перехвата я тебе увы не советчик. Сам еще понимаю поменьше твоего . :)
     
  7. flipper

    flipper New Member

    Публикаций:
    0
    Регистрация:
    5 мар 2007
    Сообщения:
    17
    Все равно спасибо=) Вопрос остается в силе........до сих пор понять не могу - где ошибся.
     
  8. Consto

    Consto New Member

    Публикаций:
    0
    Регистрация:
    20 апр 2006
    Сообщения:
    79
    попробуй
    If-Modified-Since: Sat, 29 Oct 1900 19:43:31 GMT
    взято из RFC 2616

    а сколько в eax после Reсv
     
  9. flipper

    flipper New Member

    Публикаций:
    0
    Регистрация:
    5 мар 2007
    Сообщения:
    17
    C перехватом wsock32!recv стало немного понятнее: среди знаков "!" и прочей каши иногда вылезают вразумительные ответы. При при перехвате ws2_32!WSAReсv возникает определенная проблема: при выходе из перехватчика в регистре EIP оказывается значение FFFFFFFF и браузер, соответственно, падает. Для перехвата обеих функций использую такой код перехватчика:
    Код (Text):
    1. HookerRecv proc sockfd:DWORD, BufAddr:DWORD, BufLen:DWORD, Flags:Dword
    2.     push ebx
    3.     call GetCurrPosition   ; меняет только ecx
    4.     add ecx, 5h
    5.     jmp @F
    6.   code8:
    7.       db 68h
    8.       Hooker8_1 dd 0
    9.       db 0c3h
    10.     @@:      
    11.    call delta
    12. delta:
    13.    pop ebx
    14.    sub ebx,delta
    15.  
    16.    push 0
    17.    push 6
    18.    mov ecx,ebx
    19.    add ecx,offset Old_CodeRecv
    20.    push ecx    
    21.    push [ebx + offset RealAddrRecv]
    22.    push [ebx+ offset Mhandle]    
    23.    mov eax, [offset _WriteProcessMemory+ebx]
    24.    call eax
    25.  
    26.    push Flags
    27.    push BufLen
    28.    push BufAddr
    29.    push sockfd  
    30.    mov eax,[ebx + offset RealAddrRecv]
    31.    call eax  
    32.    push eax
    33.  
    34. .if eax!=1h
    35.             dodata <db "MessageBoxA",0>
    36.             push ecx
    37.             dodata <db "user32.dll",0>
    38.             push ecx
    39.             call EGetProcAddress
    40.            
    41.             push MB_OK
    42.             dodata <db "!!!",0>
    43.             push ecx                          
    44.             push BufAddr
    45.            
    46.             push 0
    47.             call eax
    48. .endif
    49.    mov ecx,ebx
    50.    add ecx,offset HookerRecv
    51.    mov [ebx+offset Hooker8_1], ecx
    52.    push 0
    53.    push 6
    54.    mov ecx,ebx
    55.    add ecx,offset code8
    56.    push ecx    
    57.    push [ebx + offset RealAddrRecv]
    58.    push [ebx+ offset Mhandle]    
    59.    mov eax, [offset  _WriteProcessMemory+ebx]
    60.    call eax  
    61.    pop eax
    62.    pop ebx
    63.    ret                      
    64. HookerRecv endp
    И еще вопрос, можно ли получать содержимое любой HTML страницы подобным образом и какая из 2-х функций в каком случае используется?