GDB的一个奇妙而有用的功能是过程记录,它允许分析人员在执行过程中向前和向后前进,编写程序状态更改的连续日志,从而可以非常准确地回放程序代码。尽管我们都可以肯定地说,过程记录日志包含可执行文件对各种数据和控制寄存器的更改,但是该功能远不止于保留一些当前延续的序列化表示。例如,我已经能够验证使用线程修改共享内存的可执行文件的状态。

当然,我们不能指望时间相关的代码起作用,但是如果线程代码修改了共享状态通常,可以向后移动,并且仍然可以再次可靠地工作,过程记录除了文档中指定的纯粹的体系结构挑战(即位移步进)之外,还有哪些限制?

评论

这真的是反向工程吗?在我看来,由于GDB源代码是开放的,因此它与正向工程和读取代码的关系更大。

正确地说,我认为该主题肯定是反向工程师感兴趣的,因此我认为它是适当的。
AFAIK基于Intel x86 CPU中相对较新的CPU功能。它与VMware中用于“记录”的功能相同。

我认为我们都可以同意,这个问题(通常)是反向工程师的当务之急。此外,与StackOverflow相比,在这里收到与此特定问题相关的周到且明智的答案的机会要大得多,我认为值得Peter考虑。

尽管这个问题并不直接与做RE有关,但对从事RE的人们特别感兴趣,它与以一种有助于理解RE技术的方式了解RE的工具有关。因此,我认为它是此网站上的主题。

#1 楼

该功能在GDB Wiki上有更详细的描述:

它的工作方式
通过记录子进程中每条
机器指令的执行情况,过程记录和重播工作(
,以及机器状态的每个相应更改(内存和寄存器的值)。通过以相反的顺序依次“撤消”机器状态中的每个更改,可以将程序的状态恢复到执行早期的任意点。然后,通过
“重做”原始顺序的更改,可以使程序状态再次
向前移动。

本演示文稿甚至介绍了更多的内部结构。 >除上述内容外,对于某些远程目标,GDB可以通过发送远程串行协议数据包bc(向后继续)和bs(向后步骤)来利用其“本机”反向执行。这些目标包括:

moxie-elf模拟器
Simics
VMware Workstation 7.0
SID模拟器(xstormy16架构)
使用valgrind的chronicle-gdbserver
UndoDB