1

我正在编写一个跟踪另一个程序并列出函数调用(近调用、远调用、动态链接等)的小程序。

由于 dotty 框架,我们的目标是生成一个调用图。

我目前正在努力解码 ptrace(PEEK_TEXT) 给出的操作码。

我已阅读英特尔官方文档http://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-software-developer-instruction-set-reference -manual-325383.html )

以及其他十几本手册。

有几点我没有得到:

1)当我在 ptrace(PEEK_TEXT) 给出的单词中搜索 0xE8 操作码时,我发现了很多项目,我相信太多了。例如“objdump -d | grep call”给我:

400450: e8 4b 00 00 00          callq  4004a0 <__gmon_start__@plt>
4004d4: e8 b7 ff ff ff          callq  400490 <__libc_start_main@plt>
40055d: e8 7e ff ff ff          callq  4004e0 <deregister_tm_clones>
40058d: ff d0                   callq  *%rax
4005ae: e8 cd fe ff ff          callq  400480 <printf@plt>
4005b3: e8 b8 fe ff ff          callq  400470 <strlen@plt>
4005b8: e8 c3 fe ff ff          callq  400480 <printf@plt>
4005c9: 0f 05                   syscall 
4005fe: e8 3d fe ff ff          callq  400440 <_init>
400619: 41 ff 14 dc             callq  *(%r12,%rbx,8)

所以我的程序应该列出相同数量的调用?正确的 ?但是相反,我找到了数百个电话……我找到了正确的电话,上面列出的电话也有其他电话。所以我在想,那些实际上不是值 0xE8 的前缀?他们是吗?如果是这种情况,我如何区分操作码 0xE8 和值为 0xE8 的前缀?

2)当操作码0xE8之后的偏移量为负时,我发现的唯一解决方案是使用0xff来memset一个缓冲区,然后复制其中以强制位符号为1。还有另一种方法吗?

3)有人可以再解释一次Mod R / M以及如何解码它?

4) 另外,如何解释值为 0x41 的 Rex 前缀?我如何知道 0x41 0xE8 是否是带有前缀的调用,而不是带有随机值的另一个操作码?

抱歉,如果我不清楚,这些主题很有趣,但我有点迷失在那里

4

0 回答 0