Желателен конструктивный флейм Код (Text): BOOL NAKED CompareCurrentProcess(PCHAR pszName) { /* 1. Found PEB 2. Found _RTL_USER_PROCESS_PARAMETERS 3. Found _RTL_USER_PROCESS_PARAMETERS->ImagePathName 4. Convert UNICODE to ANSI 5. compare strings */ __asm { MOV ESI,ESP // SAVE STACK PTR MOV EAX,DWORD PTR FS:[0x30] // eax == PEB MOV EAX,DWORD PTR DS:[EAX+0x10] // eax == _RTL_USER_PROCESS_PARAMETERS ADD EAX,0x38 // eax == _RTL_USER_PROCESS_PARAMETERS->ImagePathName XOR EDX,EDX // XOR ECX,ECX // XOR EDI,EDI // MOV CL, BYTE PTR [EAX] // CL = UNICODE_STRING.Length in bytes SUB ESP,ECX // reserve in stack CL bytes ADD EAX,4 // EAX ptr to WCHAR ImagePathName MOV EAX,DWORD PTR [EAX] // EAX = PWCHAR next_char: CMP CL,0 // WCHAR end JZ end; MOV DL,BYTE PTR [EAX] // DL == *(PCHAR)WCHAR ADD EAX,2 // GOTO next WIDEchar MOV BYTE PTR [ESP],DL // SAVE char in memory reserved in stack INC ESP // pStr++ INC EDI // pStrLen++ SUB CL,2 // Length--; jmp next_char // goto_next; end: MOV BYTE PTR [ESP],0 // *pStr = 0; null terminated SUB ESP,EDI // pStr = (PCHAR)(pStr - pStrLen) XOR EDX,EDX XOR ECX,ECX mov ecx,esp // ecx = pStr mov edx,esp // edx = pStr // // HERE FOUND image file name m_loop: cmp edi,0 jz file_founded cmp byte ptr [edx],0x5C // '\' JZ founded; inc edx dec edi jmp m_loop founded: dec edi mov ecx,edx inc edx jmp m_loop file_founded: push esi inc ecx push ecx push dword ptr [esi+4] call my_strcmp pop esi mov esp,esi ret } }
1. ассемблерные вставки не прокатят на x64 2. find - неправильный глагол; "founded" означает совсем не то, что хотел сказать аффтар.
1. systeminfo|grep "based" > Тип системы: x64-based PC. Отлично работает код. 2. Я думаю это всего лишь метки founded наверное имелось ввиду что найден символ '\' p.s. тестировал на x86/x64 Win7/XP
1. Инлайновый асм там, где он совершенно не нужен (как следствие - не соберётся нативно под x86_64). 2. Hardcoded смещения полей в PEB (на разных архитектурах они будут отличаться из-за разной размерности указателей). 3. Ошибки в английском.
1. Она написана на asm. Его следует использовать только когда без него уже никак не выйдет. 2. Почему она ANSI? 3. Зачем все эти извращения с харкодом? На виста и выше будет достаточно NtQueryInformationProcess, а затем RtlEqualUnicodeString.
или __readfsdword для x86, __readgsqword для x64, плюс правильно объявленная структура PEB, если уж так хочется через пеб решить задачу, или если нужно решить задачу без таблицы импорта))) а так еще проще - GetProcessFileName из kernel32.dll))) ЗЫ http://govnokod.ru/6075