aboutsummaryrefslogtreecommitdiffhomepage
path: root/sample/protect-re.cpp
blob: a8f77cd80098946c92c5f22fd2e853905585133a (plain)
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <xbyak/xbyak.h>

struct Code1 : Xbyak::CodeGenerator {
	Code1()
		: Xbyak::CodeGenerator(4096, Xbyak::DontSetProtectRWE)
	{
		mov(eax, 123);
		ret();
	}
	void update()
	{
		db(0);
	}
};

void test1(bool updateCode)
{
	Code1 c;
	c.setProtectModeRE();
	if (updateCode) c.update(); // segmentation fault
	int (*f)() = c.getCode<int (*)()>();
	printf("f=%d\n", f());
	
	c.setProtectModeRW();
	c.update();
	puts("ok");
}

struct Code2 : Xbyak::CodeGenerator {
	Code2()
		: Xbyak::CodeGenerator(4096, Xbyak::AutoGrow)
	{
		mov(eax, 123);
		ret();
	}
	void update()
	{
		db(0);
	}
};

void test2(bool updateCode)
{
	Code2 c;
	c.readyRE();
	if (updateCode) c.update(); // segmentation fault
	int (*f)() = c.getCode<int (*)()>();
	printf("f=%d\n", f());
	
	c.setProtectModeRW();
	c.update();
	puts("ok");
}

int main(int argc, char *argv[])
{
	if (argc < 2) {
		fprintf(stderr, "%s <testNum> [update]\n", argv[0]);
		return 0;
	}
	bool update = argc == 3;
	int n = atoi(argv[1]);
	printf("n=%d update=%d\n", n, update);
	switch (n) {
	case 1: test1(update); break;
	case 2: test2(update); break;
	default: fprintf(stderr, "no test %d\n", n); break;
	}
}