IDA 修复,原因和方式

逆向工程 艾达 dos-exe
2021-06-27 06:08:23

我使用的是 IDA 7免费软件,而不是 Pro。我一直在使用 IDC 来重新发明轮子,但是我在学习的过程中学到了很多东西。

我有一个正在反转的 16 位 MSDOS exe。我在第一次尝试时去掉了标题和 reloc 表,以便正确解析所有 seg 引用。

现在我找到了 set_fixup() 和朋友,并且还通过 Google 从(旧)SDK 中看到了 doRelocs()。我对这一切感到有点困惑。

  1. set_fixup() 根据 IDA 帮助有 5 个参数。但是 set_fixup() 在我的 IDA 免费软件版本中需要 6 个参数。

  2. 我应该在 exe 头文件 reloc 表中的一个条目上还是在程序中的一条指令的 ea 上使用 set_fixup() ?(例如 mov ax, 0x2d0e - 其中 0x2d0e 需要调整为 0x2d0e + 0x160 - 代码从 0x1600+10 开始)。

  3. 我可以从实验中推断出 set_fixup() 看起来像:set_fixup(targetEa, fixupTypeFlag, ???, ???, ???,displacement)。似乎 p3 可能是一个 ea,而 p3 应该是 >p4(否则什么也不会发生)。p5 好像没有效果!

  4. doRelocs() - 在(ver?)dos_ovr 加载器中 - 更改由 exe 标头 reloc 表引用的指令字节,物理更改代码中的字节。然后它也调用 set_fixups()。我一定是错误地理解了修正,或者 IDA 修正的功能与 DOS exe 重定位不同。当然,如果您将字节更改为相对于文件的开头 ('mz'),那么您就不再需要应用修正?他们是通过改变来修复的!毕竟这就是 DOS 在丢弃标头之前加载代码时所做的。

请帮助我了解 IDA 修复程序!

我正在尝试使用此 IDC 代码:

//seg001:10 to_ea == 0x1610

//0x01610: mov ax, 0x02d0e (next: mov ds,ax)

//0x2d0e + 0x160 = 0x2e6e

set_fixup(0x1611, FIXUP_SEG16, 0x2e6e0, 0x2e6e, 0, 0) //对args的最佳猜测

提前致谢!

e:Ilfak Guilfanov 的部分回答(通过电子邮件)

~~~~ 7 月 18 日(1 天前)给我

谢谢,我们会解决这个问题。同时为 fixupf 传递 0:

void set_fixup(long ea, long type, long fixupf, long targetsel, long targetoff, long displ);

~~~~

也许我能解决剩下的问题,但仍然感谢任何进一步的帮助!

0个回答
没有发现任何回复~