作者vocaloid (dump吃到飽)
看板C_and_CPP
標題[問題] API hooking
時間Sun Feb 21 17:37:42 2010
DWORD HookFunction(LPCSTR lpModule, LPCSTR lpFuncName, LPVOID lpFunction,
unsigned char *lpBackup)
{
DWORD dwAddr = (DWORD)GetProcAddress(GetModuleHandle(lpModule), lpFuncName);
BYTE ReplaceCode[6] = { 0xe9, 0x00, 0x00, 0x00, 0x00, 0xc3 };
ReadProcessMemory(GetCurrentProcess(), (LPVOID)dwAddr, lpBackup, 6, 0);
DWORD dwCalc = ((DWORD)lpFunction - dwAddr - 5);
memcpy(&ReplaceCode[1], &dwCalc, 4);
WriteProcessMemory(GetCurrentProcess(), (LPVOID)dwAddr, ReplaceCode, 6, 0);
return dwAddr;
}
以上是網路找來的一段程式
就自己理解的部分, replace code中的0xe9是jmp的opcode, 0xc3是ret
dwCalc看起來是要計算 目標函式 跟 要跳過去的函式 之間的距離以帶進jmp
但是不太確定後面為什麼要-5
請問jmp跳的距離是從下一個intruction開始算嗎? 想不到其他原因...
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.59.0.65
推 vizshala:你去看一下jmp真正的意思就知道了 02/21 18:37
推 firose:E9XXXX = 目標位址 - call的下一個指令的位址 02/21 18:52
→ WPC001:要先扣掉jmp指令的長度喔... 剛好在你這邊就是5 02/21 23:23