Доброго времени суток. Пытался оформить сплайсинг ZwCreateThread, руководствуясь этой статьей. Я не использовал библиотеку, но код перехвата функции и перехватчик оформлены примерно так же. В качестве теста, перехватчик просто восстанавливает функцию, запускает ее с оригинальными параметрами, возвращает выдаваемое оригинальной ZwCreateThread значение. Столкнулся с такой проблемой: любая попытка процесса-жертвы создать новый процесс заканчивается либо его вылетом без каких-либо сообщений об ошибках, либо ничем - причем независимо от содержимого перехватчика (даже int 3h). С адресами вроде не напутал - 1-е 6 байт заменяются jmp'ом на правильный адрес перехватчика. В чем может заключаться проблема?
Писать драйвер?:/ - нет, я не ленивый, просто далеко не профессионал. Но ведь данный способ должен хоть как-то работать? Прошу прощения - мой косяк, запутался. Именно 6 байт, так как переход выглядит так: Код (Text): db 68h ;push Hooker1 dd 0 ;Адрес перехватчика db 0c3h ;ret
Да, идиот, знаю Код перехода Код (Text): code9: db 68h Hooker9 dd 0 db 0c3h Перехват (в ebx дельта смещение) Код (Text): push 0 push 6 mov ecx, offset Old_CodeZwCreateThread add ecx,ebx push ecx push [ebx + offset RealAddrZwCreateThread] push [ebx+ offset Mhandle] mov eax, [offset _ReadProcessMemory+ebx] call eax mov ecx,ebx add ecx,offset HookerZwCreateThread mov [ebx+offset Hooker9], ecx push 0 push 6 mov ecx,ebx add ecx,offset code9 push ecx push [ebx + offset RealAddrZwCreateThread] push [ebx+ offset Mhandle] mov eax, [offset _WriteProcessMemory+ebx] call eax Перехватчик Код (Text): HookerZwCreateThread proc ThreadHandle1: DWORD, DesiredAccess: DWORD, \ ObjectAttributes: DWORD, ProcessHandle: DWORD, ClientId: DWORD, \ ThreadContext: DWORD, UserStack: DWORD, CreateSuspended: DWORD call GetCurrPosition add ecx, 5h jmp @F code9: db 68h Hooker9_1 dd 0 db 0c3h @@: call delta delta: pop ebx sub ebx,delta push 0 push 6 mov ecx,ebx add ecx,offset Old_CodeZwCreateThread push ecx push [ebx + offset RealAddrZwCreateThread] push [ebx+ offset Mhandle] mov eax, [offset _WriteProcessMemory+ebx] call eax push TRUE push UserStack push ThreadContext push ClientId push ProcessHandle push ObjectAttributes push DesiredAccess push ThreadHandle1 mov eax,[ebx+offset RealAddrZwCreateThread] call eax push eax mov ecx,ebx add ecx,offset HookerZwCreateThread mov [ebx+offset Hooker9_1], ecx mov ecx,ebx add ecx,offset HookerZwCreateThread mov [ebx+offset Hooker9_1], ecx push 0 push 6 mov ecx,ebx add ecx,offset code9 push ecx push [ebx + offset RealAddrZwCreateThread] push [ebx + offset Mhandle] mov eax, [offset _WriteProcessMemory+ebx] call eax pop eax ret HookerZwCreateThread endp GetCurrPosition proc mov ecx, [esp] ret GetCurrPosition endp
А ты отладчиком не пробовал пользоваться? Посмотри, что появляется вместо первых 6 байт настоящей функции после установки перехвата. Посмотри, правильный ли адрес обработчика указан. Находится ли обработчик по этому адресу. Если все правильно, поставь бряк на этот обработчик. После остановки на бряке, посмотри, правильные ли байты восстанавливаются. Посмотри, правильно ли ты передаешь управление... Вобщем, Олли тебе в руки И нафига ты вызываешь GetCurrPosition, если ecx ты потом нигде не пользуешь и затираешь его mov ecx,ebx???