为什么 IDA 在段寄存器上积极假设“没有”?

逆向工程 艾达 拆卸 分割
2021-06-10 22:17:59

我正在拆解打包的 16 位 DOS MZ EXE。

为了对其进行反混淆,我在解包例程结束时在 DOSbox 中设置了一个断点,让它运行,并进行内存转储。通过这种方式,我基本上得到了反混淆的 EXE 图像。然后我在 IDA 中加载了这个图像。

显然,不再有 MZ 头,因此 IDA 无法知道应用程序的入口点和 CS、SS 和其他段寄存器的初始值。但是,我确实知道这些价值观,并且愿意将它们提供给 IDA。为此,我按Alt+G并键入寄存器的值。

但是assume ds:<value>,IDA 没有显示,而是显示

seg000:1AEBC                     assume es:nothing, ss:nothing, ds:nothing

为什么?

另一个问题。为什么没有设置CS寄存器值的选项?考虑包含近跳转的代码。如果不了解 CS 寄存器的值,IDA 将无法进行反汇编。但我确实知道 CS 在这个特定时刻的价值!如果Segment Register Value对话窗口没有 CS 选项,我该如何向 IDA 提供此信息

1个回答

DOS 程序使用段,IDA 被用来模仿这种行为。这就是为什么您不能更改 CS(因为在正确设置的数据库中 CS 只是段的基础)以及为什么现在显示对段寄存器的更改(因为没有与您输入的值相对应的段)。

我建议打开一个普通(未打包)的 MZ 文件,看看它应该是什么样子。如果您继续与 IDA 斗争而不是使用它,您将继续遇到问题。