Пытался перенести код из статьи Ms-Rem'a "Обнаружение скрытых процессов" на С/С++. При компиляции следующего кода (MS Visual Studio 2005): Код (Text): DWORD __declspec( naked ) XpZwQuerySystemInfoCall( DWORD dwASystemInformationClass, PVOID pASystemInformation, DWORD dwASystemInformationLength, PDWORD pdwAReturnLength) { __asm { pop ebp mov eax, 0xAD call SystemCall retn 0x10 SystemCall: mov edx, esp syscall } } получил ошибку вида: error C2400: inline assembler syntax error in 'opcode'; found 'newline' Не могу разобраться, в чём же проблема... Подскажите плиз, буду признателен =)
1) syscall - команда для x64. это раз я думаю тебе больше интересен SYSENTER, а не SYSCALL. 2) SYSENTER можно заменить на Код (Text): _asm { _emit 0x0f _emit 0x34 } 3) retn уже не нужен. возврат из sysenter'а будет отнюдь не на точку после sysenter, а на ntdll!KiFastSystemCallRet
Сорри, там действительно был сперва sysenter... это потом уже, пока экспериментировал, воткнул syscall - на нём, впрочем, вышла та же ошибка. Скомпилил через _emit - всё заработало, пасиба огромное Чисто из академического интереса - почему всё же могло не компилиться в обычном виде? ^__~
Хм, проследил выполнение в ольке - после sysenter'a переходит на retn 0x10.. так что всё же, видно, нужен ^__^
Вообще дело обстоит не так. пример: ZwTerminateProcess: Код (Text): 7C90E88E > B8 01010000 MOV EAX,101 7C90E893 BA 0003FE7F MOV EDX,7FFE0300 7C90E898 FF12 CALL DWORD PTR DS:[EDX] 7C90E89A C2 0800 RETN 8 DS:[EDX] (ntdll.KiFastSystemCall) Код (Text): 7C90EB8B > 8BD4 MOV EDX,ESP 7C90EB8D 0F34 SYSENTER после сисентера попадаем в: KiFastSystemCallRet( RET ), а потом в 7C90E89A C2 0800 RETN 8 (конец ZwTerminateProcess) а потом выходим обратно в программу. Но фишка в том, что куда мы попадаем после sysenter (точнее после sysexit в ядре) - этот адрес задается в ядре перед вызовом SYSEXIT в регистре EDX (селектор CS берется из SYSENTER_CS_MSR+16) и этот адрес всегда равен KiFastSystemCallRet. А только потом после RET мы попадаем туда, откуда была вызвана KiFastSystemCall, то есть в тело ZwTerminateProcess