【发布时间】:2015-10-12 15:27:21
【问题描述】:
测试在32-bit x86 Linux 上进行。
所以基本上我试图通过在汇编代码中插入检测指令来记录执行的基本块的信息。
我的策略是这样的:将执行的基本块的索引写入一个全局数组,当数组满时(16M)将数组从内存刷新到磁盘。
这是我的问题。当检测二进制文件的执行结束时,我需要将数组刷新到磁盘,即使它没有达到 16M 边界。但是,我只是不知道在哪里可以找到assembly 程序的出口。
我试过了:
grep exit来自目标汇编程序,并在call exit指令之前刷新内存。但是根据一些调试经验,目标 C 程序,比如md5sum二进制文件,在执行完成时不会调用exit。在
main函数结束时刷新内存。但是,在汇编代码中,我只是不知道main函数的确切结尾在哪里。我可以采取一种保守的方法,比如查找所有ret指令,但在我看来,并非所有main函数都以ret指令结尾。
所以这是我的问题,如何识别 assembly code 的确切执行结束,并在那里插入一些检测指令?挂钩一些库代码对我来说很好。我理解不同的输入,二进制可能会在不同的位置退出,所以我想我需要一些保守的估计。我清楚了吗?谢谢!
【问题讨论】:
-
您的仪器是免费软件吗?我很乐意看看你的代码....
-
我不认为那总是很好的定义。一旦优化器完成了它的工作,甚至可能在函数之间甚至在
main()和在它之前调用的 libc 中的东西(程序的入口点)之间都没有定义边界。一个可能的线索是跟踪堆栈是如何被使用的,但我认为,当程序退出时堆栈将完全反转,这并不一定是真的。