我正在拆解打包的 16 位 DOS MZ EXE。
为了对其进行反混淆,我在解包例程结束时在 DOSbox 中设置了一个断点,让它运行,并进行内存转储。通过这种方式,我基本上得到了反混淆的 EXE 图像。
当我在 IDA 中加载图像时开始出现问题。你看,我不明白 IDA 的段概念。它们类似于 x86 段,但有许多我无法理解的差异。当IDA问我创建至少一个部分,我只是做了一个非常大段1 MB的长度,因为在程序的地址空间的代码和数据混在一起,但没有任何意义,介绍不同的领域,如CODE
,DATA
等。
在向 IDA 显示入口点后,一切正常:IDA 成功确定了函数、局部变量、参数等。唯一的问题是有些调用被标记为NONAME
,即使它们指向正确的子例程。最奇怪的是,这些子程序对“非法”调用具有正确的 XREF。下面是一个例子:
seg000:188FF 004 call 1AD9h:1 ; Call Procedure
此行是红色的,NONAME
在问题列表中有一个相关的问题。为什么?
在1AD9h:1
SEG:偏移地址对应于线性地址0x1ad91
,其具有这样的:
seg000:1AD91 ; =============== S U B R O U T I N E =======================================
seg000:1AD91
seg000:1AD91 ; Attributes: bp-based frame
seg000:1AD91
seg000:1AD91 sub_1AD91 proc far ; CODE XREF: sub_188F2+DP
注意外部参照。所以IDA实际上正确地处理了调用!为什么调用被认为是无效的?IDA 帮助文件是这样说的:
问题:找不到名字
描述
有两个原因可能导致此问题:
- 在被反汇编的程序中引用了非法地址;
- IDA 找不到地址的名称,但它必须存在。
该怎么办
如果此问题是由引用非法地址引起的
- 尝试手动输入操作数
- 或者通过创建新段使非法地址合法。
否则,数据库已损坏。
所以,我想问题是我有一个庞大的细分市场,而不是几个小的细分市场。但是,如何将地址空间正确划分为适当的段?
我知道寄存器值(包括DS
,CS
,SS
,IP
在入口点,等等)。假设我创建了一个CODE
段,该段从对应于入口点的 CS 寄存器值的段开始。但是这个段应该有多长?
IDA 中的段有什么意义?如果DATA段可以包含指令,CODE段可以作为数据读写吗?
请原谅我提出这样一个新手问题,但众所周知,官方 IDA 手册非常稀缺,而且 HexRays 论坛对我来说是关闭的,因为我使用的是免费软件版本。