在X86_64汇编中调用过程

时间:2015-07-09 19:54:36

标签: assembly ptrace opcodes

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

目标是通过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设置缓冲区,然后复制到其中以强制位符号为1.还有另一种方法吗?

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

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

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

0 个答案:

没有答案