首页 > 解决方案 > 反汇编程序在分析目标文件时如何维护寄存器的值?

问题描述

当我们使用gdb或任何反汇编程序分析目标文件时,我们会在其中放置断点。它随时显示寄存器的当前状态。可以有许多程序在后台运行。这些程序中的每一个也将使用这些寄存器并可以更改它们的值。

当其他进程可能不断更改它时,反汇编程序如何维护我们程序的寄存器值?

标签: debuggingassemblygdbreverse-engineering

解决方案


反汇编程序objdump -d不运行程序并且没有寄存器值。他们所拥有的只是机器代码,因此他们可以打印每条指令使用哪些寄存器,但不能打印指令运行时它将保存的值。

任何给定的指令(如dec edx)都可以在程序的生命周期内多次运行,EDX 具有多个不同的值。因此,显然您不能只为反汇编列表中的指令静态打印单个寄存器值。


您在询问debuggers,它们确实运行程序以及在断点或单步处停止程序。

在 Linux、MacOS 或 Windows 等多任务操作系统中,操作系统提供系统调用来跟踪另一个进程,例如 Linux ptrace。这让 GDB 可以插入断点或单步。并且当目标进程停止时,GDB 可以使用ptrace读取保存的架构状态(寄存器值)。

在一个 CPU 上运行多个任务由操作系统完成,使用“上下文切换”保存旧任务的寄存器状态,并恢复新任务的状态。 每个任务都有自己的寄存器状态,只要它实际运行,就会加载到架构寄存器中。

这是基本的操作系统内容,如果您想了解更多信息,请获取教科书或搜索其中一些关键字。


推荐阅读