Здравствуйте. Очень нужна чья-нибудь помощь. Перехватываю ws2_32!send в internet explorer, перехват проходит нормально. Сам перехватчик ничего не делает: только восстанавливает первые 6 байт функции, вызывает ее с оригинальными параметрами и возвращает себя на место. Если применять вышеописанный алгоритм, то при переходе по ссылке (любой, даже без запросов) IE пишет, что страницу открыть невозможно. Если перехватчик не восстанавливать, то переход осуществляется нормально. Подозреваю, что имеет место ошибка в передаче параметров - тогда логично, что при второй попытке передачи запроса (если не восстанавливать перехватчик) send() работает нормально. Только вот ошибку найти не могу. Вот код перехватчика: Код (Text): HookerSend proc hS:DWORD, AddrB:DWORD, BufS:DWORD, Fl:DWORD call GetCurrPosition ; небольшая процедурка для получения текущей позиции add ecx, 5h jmp @F code2: db 68h Hooker2_1 dd 0 db 0c3h @@: call delta delta: pop ebx sub ebx,delta ;восстанавливаем функцию push 0 push 6 mov ecx,ebx add ecx,offset Old_CodeSend push ecx push [ebx + offset RealAddrSend] push [ebx+ offset Mhandle] mov eax, [offset _WriteProcessMemory+ebx] call eax ;вызываем push Fl push BufS push AddrB push hS mov eax,[ebx + offset RealAddrSend] call eax ;восстанавливаем перехватчик mov ecx,ebx add ecx,offset HookerSend mov [ebx+offset Hooker2_1], ecx push 0 push 6 mov ecx,ebx add ecx,offset code2 push ecx push [ebx + offset RealAddrSend] push [ebx+ offset Mhandle] mov eax, [offset _WriteProcessMemory+ebx] call eax ret HookerSend endp Пробовал сохранять значение eax после вызова оригинальной send() и возвращать его обратно перед выходом из перехватчика - все равно то же самое. Буду очень благодарен за любую помощь.
Я вроде как въехал в общую теорию сплайсинга. У сплайсинга send() есть какие-то особенности? Киньте хотябы ссылку - ведь есть где-то примеры, с которыми можно сравнить мой кривой код.
Попробуй сохранять ebx - ты его портишь - это нехорошо. Что такое GetCurrPosition? она не портит esi edi?
Не портит: Код (Text): GetCurrPosition proc mov ecx, [esp] ret GetCurrPosition endp Заходим на www.google.ru. В отладчике (Olly), после int 3 войдя в оригинальный send() получаем (в стеке, как я понимаю) дословно: socket = 2B4 data = wininet.722AB18 (здесь наверно должен быть адрес строки запроса) DataSize = 1 (?) Flags = 0 Если DataSize отвечает за размер строки запроса - вопрос, может ли он (запрос) весить 1 байт? На самом деле, у меня небольшой опыт в использовании отладчиков, как и в asm'е вообще - может, я не там копаю.