При дизасме некоторых функций ntdll.dll можно увидеть код такого типа: Код (Text): mov eax, 101h mov ebx, 7FFE0300h call ebx Это для Nt/ZwTerminateProcess. Если я вставлю это в свою прогу то вырабатывается исключение по адрессу 7FFE0297h на доступ к ячейке 101h. Почему? Всё это в WinXP. В Win2k всё это сделано иначе.
Должно, но только если не реализовывать этот код как отдельную процедуру. вот весь мой код: Код (Text): push 0 push FFFFFFFFh mov eax, 101h mov ebx, 7FFE0300h call ebx ZwTerminateProcess(LONG; LONG);
n0name Правда. Но есть другой вопрос. Ты абсолютно точно уверен, что в твоей версии XP используются ИМЕННО ЭТИ СМЕЩЕНИЯ?
2 n0name Всё верно! Пишет. Если не видешь Int 2Eh, то не значит, что это не то! Попробуй ка глянь, что такое там сидит за ф-я по адресу 7FFE0300h?? А? SYSENTER. Всё верно. А теперь набери в SoftIce "ntcall", и увидешь что за ф-я там под номером 101h. Это и будет для все Win2K,XP 2 volodya Ради прикола - совпадения, но у меня тоже адрес 7FFE0300h ))))
n0name > Call тоже ложит DWORD в стек. Не call ebx, а тот которого как раз нет в твоём коде после push'ей. см. ntdll!NtTerminateProcess - ret 8 снимает 3 DWORD'а
2 volodya это смещение для всех SP под WinXP. 2 PavPS Мож показать код. Такой у меня не работает: Код (Text): .586p .model flat,stdcall .code start: ; push eax ; pseudo ret addr push 0h ; ExitCode push 0FFFFFFFFh ; ProcHndl mov eax, 101h ; 101h = ZwTerminateProcess ; mov edx, 7FFE0300h ; call edx int 02Eh end start 2 S_T_A_S_ Я знаю, что call ложит в стек адресс возврата. Но код не работает ни с дополнительным pushem, ни буз него.
n0name, сначала вызови... Код (Text): invoke ZwTerminateProcess, -1, 0 ...внимательно пройди под отладчиком и смотри на esp, потом делйа так: Код (Text): push 0 push 0FFFFFFFFh push 'Wasm' mov eax, 0101h mov edx, 7ffe0300h call edx
2 Four-F: tnx за направление в котором надо было копать. Такой код у меня работает: Код (Text): .386 .model flat, stdcall option casemap :none .code start: push 0 push 0FFFFFFFFh push eax mov eax, 0101h mov edx, 7ffe0300h call DWORD PTR ds:[edx] end start
IMHO этот код не рабочий - ОС просто прибивает процесс по-тихой из-за access violation при попытке выполнить несуществующий код по адресу 340FD48Bh
S_T_A_S_ сорри, инет совсем глючный Это не инет, это что-то с форумом, последние несколько дней днем оооочень тормозит :-(
Неа не прибивает =) Просто в SP2 всё переиначили =( Теперь вместо call edx надо писать call DWORD PTR ds:[edx] Тогда на SP2 работает а на SP1 и просто WinXP - нет. Из этого вопрос: Как сделать и для WinXP и для SP2? Пробовал через int 2Eh и через sysenter, но ничего не фурычит. Через sysenter я ret. address назначаю $+14. Это nop. Но процесс исполняется дальше!!! Хотя должен был завершиться. Код (Text):
Сорри код забыл =) Код (Text): .386 .model flat, stdcall option casemap :none .code start: push 0 ; push 0FFFFFFFFh push -1 push $+14 mov eax, 0101h ; int 2Eh ; mov edx, 7ffe0300h ; call DWORD PTR ds:[edx] mov edx, esp dw 340Fh ; sysenter ; nop end start
Знатоки асма не могли бы протестить плиз. На моём WinXP SP2 всё работает. А вот на других системах не знаю. Если можно проверьте на WinXP, WinXP SP1, Win2k, Win2k SP4, WinNT 4.0, Win9X. Код (Text): .386 .model flat, stdcall option casemap :none .code start: push 0 push -1 push 'WASM' push 'COOL' mov eax, 0101h mov edx, esp dw 340Fh ; sysenter end start
Ниже XP можно и не пытаться , там sysenter - привелигированная инструкция . Да и циферки другие , могут вообще левые сервисы быть .