我正在编写一个跟踪另一个程序的小程序并列出函数调用(近呼叫,远程呼叫,动态链接等)。
目标是通过dotty框架生成一个调用图。
我目前正在努力解码ptrace(PEEK_TEXT)给出的操作码。
以及其他十几本手册。
有些要点我不明白:
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是否是带前缀的调用而不是具有随机值的另一个操作码?
很抱歉,如果我不清楚,那些主题很有意思,但我有点迷失在那里