首页
社区
课程
招聘
[原创]基于函数虚拟机trace的开源实现(poc,半成品)
发表于: 2021-8-1 15:46 6703

[原创]基于函数虚拟机trace的开源实现(poc,半成品)

2021-8-1 15:46
6703

这是周末写的小玩意,不是我之前使用的trace。
当前只是进行概念验证,基本没有测试。
这个项目可以把指定的函数放到我们的解释器里面执行,使用解释器记录函数的执行过程。

 

下面是仓库里面测试代码

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
int g = 0;
int target_function(int a, int b, int &result) {
  result = a + b;
  g = result;
  return result;
}
 
int main(int argc, char *argv[]) {
  size_t buffer_size = getpagesize();
  size_t stack_size = 1 * 1024 * 1024;
 
  // 分配rwx的代码段
  uint32_t *code_buffer = (uint32_t *) mmap(nullptr,
                                            buffer_size,
                                            PROT_READ | PROT_WRITE | PROT_EXEC,
                                            MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
  assert(code_buffer != MAP_FAILED);
 
  // 分配模拟器使用的栈,模拟器与原函数运行在不同的栈中,在解释过程中会直接修改原始的栈。
  char *stack = (char *) mmap(nullptr, stack_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
  assert(stack != MAP_FAILED);
 
  void *sp = stack + stack_size - 256;
  size_t bridge_size = 0;
 
  // 创建进入模拟器的跳板代码,该代码作用有:
  //  * 栈切换
  //  * 保存,还原Cpu上下文
  //  * 进入模拟器等
  create_simulator_bridge((void *) target_function, code_buffer, buffer_size, sp);
 
  int (*f)(int, int, int &) = reinterpret_cast<int (*)(int, int, int &)>(code_buffer);
  int result;
  int n = f(3, 5, result);
 
  // 下面代码测试解释执行是否正确更新函数使用的外部变量,函数返回值是否正确。
 
  assert(n == 8);
  assert(result == 8);
  assert(g == 8);
  printf("stack result  = %d, register result = %d, global result = %d\n", result, n, g);
  return 0;
}

有兴趣的朋友可以下载回来玩玩。

 

仓库地址:sim-trace


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 4
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//