-
-
[原创]基于函数虚拟机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
赞赏记录
参与人
雪币
留言
时间
又见飞刀z
为你点赞~
2022-3-16 17:45
Umiade
为你点赞~
2021-8-27 15:24
0x指纹
为你点赞~
2021-8-2 14:50
爱吃菠菜
为你点赞~
2021-8-1 18:06
赞赏
他的文章
看原图
赞赏
雪币:
留言: