1. 程式人生 > >Hook程式(植物大戰殭屍為例,未涉及提權)

Hook程式(植物大戰殭屍為例,未涉及提權)

// hookCode.cpp : 定義 DLL 應用程式的匯出函式。 //利用push retn hook 佔用8個位元組 可以達到jmp的效果 #include "stdafx.h" #include "hookCode.h" #include <Windows.h> //CE分析出以下程式碼 //0044BA45 - 01 87 78550000 - add[edi + 00005578], eax << 陽光增加地址 初始值為19 //0044BA4B - 8B 87 78550000 - mov eax, [edi + 00005578] //0044BA51 - 3D 06270000 cmp eax, 2706//這裡返回執行 //__declspec(naked)代表純彙編 不影響堆疊且不增加額外匯編程式碼 DWORD Base_hook = 0;//需要賦初始值 否則注入失敗 DWORD Base_hookAddr = 0x44BA45;//存放需要hook的地址 DWORD Base_oldAddr = 0x44BA51;//存放hook執行完後要跳轉到的地址 void __declspec(naked) myCode(void){ __asm{ add eax,0x50 add[edi + 0x005578], eax mov eax, [edi + 0x005578] mov Base_hook,eax//把想要物件地址儲存到全域性變數裡 這個全域性變數就是人造基址 jmp Base_oldAddr } } //修改hook後的程式碼內容 void __declspec(naked)hookCode(void){ __asm{ push myCode retn int 3 int 3 } } //安裝hook //push 地址 retn bool setHook(bool isHook){ //去掉相應程式碼地址的 頁面保護 //儲存之前的頁面保護屬性 DWORD oldProtect = 0; // 需要去保護的地址 位元組數 可讀可寫 儲存hook前的頁面保護屬性 VirtualProtect((LPVOID)Base_hook, 12, PAGE_EXECUTE_READWRITE, &oldProtect); //寫入Hook程式碼 對程式程式碼進行更改 __asm{ //將hook的程式碼寫到需要hook的程式碼段中 lea edx, hookCode mov ebx, Base_hookAddr mov ecx, [edx] mov[ebx],ecx//寫入的第1個4位元組 mov ecx, [edx+ 4] mov[ebx+4], ecx//寫入的第2個4位元組 mov ecx, [edx+ 8] mov[ebx+8], ecx//寫入的第3個4位元組 } //還原之前的頁面保護屬性 VirtualProtect((LPVOID)Base_hook, 12, oldProtect, &oldProtect); return TRUE; }