ne_viens
Advanced Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Это делается при помощи hooking'а. Подыскивается длл, подгружаемая процессом (хорошие кандидаты msimg32.dll и wsock32.dll) и в нее добавляется код:
#include <windows.h> __declspec(dllimport) BOOL __stdcall GetSystemMetrics(int);
//////////////////////////////////////////////////////////////////////////////////// __declspec(naked) BOOL __stdcall myGetSystemMetrics(int idx) { __asm { cmp dword ptr[esp+4], SM_REMOTESESSION jnz L1 xor eax, eax ret 4 L1: push 00h push 11223344h mov eax, GetSystemMetrics add eax, 7 jmp eax } }
//original msimg32.dll routines are here //
//////////////////////////////////////////////////////////////////////////////////// int __stdcall DllMain(HMODULE h, int reason, void* x) { int oldp; char* ptr;
if(DLL_PROCESS_ATTACH == reason) { DisableThreadLibraryCalls(h); ptr = (char*)myGetSystemMetrics + 16; VirtualProtect(ptr, 8, PAGE_EXECUTE_READWRITE, &oldp); ptr[0] = *(char*)((char*)GetSystemMetrics + 1); *(int*)(ptr + 2) = *(int*)((char*)GetSystemMetrics + 3); VirtualProtect(ptr, 8, oldp, &oldp);
ptr = (char*)GetSystemMetrics; VirtualProtect(ptr, 8, PAGE_EXECUTE_READWRITE, &oldp); ptr[0] = 0xe9; *(int*)(ptr + 1) = (char*)myGetSystemMetrics - ptr - 5; VirtualProtect(ptr, 8, oldp, &oldp); } return 1; }
Модифицированная длл кладётся рядом с исполняемым файлом процесса и загружаятся при старте проги. DllMain() патчит GetSystemMetrics() так, чтобы все обращения к ней перенаправляются в myGetSystemMetrics(), где в случае SM_REMOTESESSION сразу возвращается 0.
|