Hook程式(植物大戰殭屍為例,未涉及提權)
阿新 • • 發佈:2019-02-19
// 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;
}