ress. HMODULE hGdi32 = ::LoadLibrary(_T("Gdi32.dll")); g_oriTextout = GetProcAddress(hGdi32, _T("TextOutA")); if (NULL == g_oriTextout) return FALSE; //Get the hooka address. HMODULE hModule = GetModuleHandle(_T("HookDLL.dll")); if (NULL == hModule) return FALSE; DWORD dwHookAddr = NULL; __asm { mov esi, offset HookLabel; mov edi, 0x10000000;//0x10000000 is the dlls base address. sub esi, edi; add esi, hModule; mov [dwHookAddr], esi; } //Get the NOPs address. DWORD dwNOPAddr = NULL; __asm { mov esi, offset NOPLabel; mov edi, 0x10000000;//0x10000000 is the dlls base address. sub esi, edi; add esi, hModule; mov [dwNOPAddr], esi; } //Save the first 5 byte of TextOutA to g_abOriCode __asm { mov esi, g_oriTextout; lea edi, g_abOriCode; cld; movsd; movsb; } //Generate the jmp Hook function. g_abJmpCode[0] = 0xe9; __asm { mov eax, dwHookAddr; mov ebx, g_oriTextout; add ebx, 5; sub eax, ebx; mov dword ptr[g_abJmpCode+1], eax; } //Write the jump instruction to the textoutA. DWORD dwProcessId = GetCurrentProcessId(); HANDLE hProcess = OpenProcess (PROCESS_ALL_ACCESS, FALSE, dwProcessId); if (NULL == hProcess) return FALSE; DWORD dwOldFlag; VirtualProtectEx(hProcess, g_oriTextout, 5, PAGE_READWRITE, &dwOldFlag); WriteProcessMemory(hProcess, g_oriTextout, g_abJmpCode, sizeof(g_abJmpCode), NULL
|