Проблемы с кодом перехвата

Discussion in 'WASM.BEGINNERS' started by flipper, Mar 5, 2007.

  1. flipper

    flipper New Member

    Blog Posts:
    0
    Здравствуйте. Очень нужна чья-нибудь помощь. Перехватываю ws2_32!send в internet explorer, перехват проходит нормально. Сам перехватчик ничего не делает: только восстанавливает первые 6 байт функции, вызывает ее с оригинальными параметрами и возвращает себя на место. Если применять вышеописанный алгоритм, то при переходе по ссылке (любой, даже без запросов) IE пишет, что страницу открыть невозможно. Если перехватчик не восстанавливать, то переход осуществляется нормально. Подозреваю, что имеет место ошибка в передаче параметров - тогда логично, что при второй попытке передачи запроса (если не восстанавливать перехватчик) send() работает нормально. Только вот ошибку найти не могу. Вот код перехватчика:
    Code (Text):
    1. HookerSend proc  hS:DWORD, AddrB:DWORD, BufS:DWORD, Fl:DWORD
    2.     call GetCurrPosition ; небольшая процедурка для получения текущей позиции
    3.     add ecx, 5h
    4.     jmp @F
    5.  
    6. code2:
    7.     db 68h
    8.     Hooker2_1 dd 0
    9.     db 0c3h
    10.   @@:      
    11.  
    12.    call delta
    13. delta:
    14.    pop ebx
    15.    sub ebx,delta
    16.  
    17. ;восстанавливаем функцию
    18.    push 0
    19.    push 6
    20.    mov ecx,ebx
    21.    add ecx,offset Old_CodeSend
    22.    push ecx    
    23.    push [ebx + offset RealAddrSend]
    24.    push [ebx+ offset Mhandle]    
    25.    mov eax, [offset _WriteProcessMemory+ebx]
    26.    call eax  
    27.  
    28. ;вызываем
    29.    push Fl
    30.    push BufS
    31.    push AddrB
    32.    push hS
    33.    mov eax,[ebx + offset RealAddrSend]
    34.    call eax
    35.  
    36. ;восстанавливаем перехватчик
    37.      mov ecx,ebx
    38.      add ecx,offset HookerSend
    39.      mov [ebx+offset Hooker2_1], ecx
    40.      push 0
    41.      push 6
    42.      mov ecx,ebx
    43.      add ecx,offset code2
    44.      push ecx    
    45.      push [ebx + offset RealAddrSend]
    46.      push [ebx+ offset Mhandle]    
    47.      mov eax, [offset  _WriteProcessMemory+ebx]
    48.      call eax  
    49.  
    50.   ret                      
    51. HookerSend endp
    Пробовал сохранять значение eax после вызова оригинальной send() и возвращать его обратно перед выходом из перехватчика - все равно то же самое. Буду очень благодарен за любую помощь.
     
  2. flipper

    flipper New Member

    Blog Posts:
    0
    Я вроде как въехал в общую теорию сплайсинга. У сплайсинга send() есть какие-то особенности? Киньте хотябы ссылку - ведь есть где-то примеры, с которыми можно сравнить мой кривой код.
     
  3. asd

    asd New Member

    Blog Posts:
    0
    Попробуй сохранять ebx - ты его портишь - это нехорошо.
    Что такое GetCurrPosition? она не портит esi edi?
     
  4. flipper

    flipper New Member

    Blog Posts:
    0
    Не портит:
    Code (Text):
    1. GetCurrPosition proc
    2. mov ecx, [esp]
    3. ret
    4. GetCurrPosition endp
    Заходим на www.google.ru. В отладчике (Olly), после int 3 войдя в оригинальный send() получаем (в стеке, как я понимаю) дословно:

    socket = 2B4
    data = wininet.722AB18 (здесь наверно должен быть адрес строки запроса)
    DataSize = 1 (?)
    Flags = 0

    Если DataSize отвечает за размер строки запроса - вопрос, может ли он (запрос) весить 1 байт? На самом деле, у меня небольшой опыт в использовании отладчиков, как и в asm'е вообще - может, я не там копаю.
     
  5. Active

    Active New Member

    Blog Posts:
    0
    Может глупо, но попробуй передать параметры по зн-ю ([]) .
     
  6. flipper

    flipper New Member

    Blog Posts:
    0
    Сохраняю - та же лажа=( И параметры уже передавал по-разному.
     
  7. flipper

    flipper New Member

    Blog Posts:
    0
    Спасибо - все работает.