65,211
社区成员
发帖
与我相关
我的任务
分享#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
void fun1()
{
printf("fun1\n");
}
void fun2()
{
printf("fun2\n");
}
typedef void (*FunProc)();
void SetHook(FunProc pOld, FunProc pNew);
int main(int argc, char* argv[])
{
SetHook(fun1, fun2);
fun1(); //这里实际上调用fun2,输出fun2
getchar();
return 0;
}
//该如何实现
void SetHook(FunProc pOld, FunProc pNew)
{
}
SetHook(fun1, fun2);
004010D0 68 10 10 40 00 push offset fun2 (401010h)
004010D5 68 00 10 40 00 push offset fun1 (401000h)
004010DA E8 41 FF FF FF call SetHook (401020h)
fun1(); //这里实际上调用fun2,输出fun2
004010DF 68 FC 70 40 00 push offset string "fun1\n" (4070FCh)
004010E4 E8 29 00 00 00 call printf (401112h)
void SetHook(FunProc pOld, FunProc pNew)
{
if (*(unsigned char*)pOld == 0xe9)
{
int data = *(int*)((char*)pNew+1) + (int)pNew - (int)pOld;
DWORD result;
WriteProcessMemory(GetCurrentProcess(), (char*)pOld+1, &data, 4, &result);
}
else if (*(unsigned char*)pOld == 0x55 || *(unsigned char*)pOld ==0x68)
{
int data = (int)pNew - (int)pOld - 5;
unsigned char jmp = 0xe9;
DWORD result;
WriteProcessMemory(GetCurrentProcess(), (char*)pOld, &jmp, 1, &result);
WriteProcessMemory(GetCurrentProcess(), (char*)pOld+1, &data, 4, &result);
}
else
{
printf("i can do it\n");
}
}