实现了一个简单的inline hook过程

实现了一个简单的hook过程,正常的程序执行流程应该是main()->add()->main(),通过修改内存中add()的首指令让程序跳转到hook()。distance理应是减5(指令的大小),调试时发现还要减去8,找出原因后会补坑。值得注意的是逆向过程中如果看见0xE9和-5这些标志,应该知道此处应该是hook了程序流。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int add(int x, int y)
{
	return x + y;
}
int hook(int x, int y)
{
	x += 500;
	y += 500;
	printf("Programe has been hooked!\n");
	return x + y;
}
int main()
{
	char* fn = &add;
	DWORD d1 = &hook;
	DWORD d2 = &add;
	DWORD distance = d1-d2;
	DWORD ignore;
	VirtualProtect(fn, 128, PAGE_EXECUTE_READWRITE, &ignore);
	*fn = 0xE9;
	fn++;
	*fn = distance-5-8;

	int a = 5, b = 5;
	while (1)
	{
		int ans = add(a, b);
		printf("%d+%d=%d\n", a, b, ans);
		Sleep(500);
	}
	return 0;
}