问题描述
我想反汇编自己编写的 Turbo Pascal V3 程序的最终版本,即一个简单的 .COM 文件,为此我挖出了我的旧(公元 2004 年)注册 IDA Pro (V4.7.0.831) 的副本。没有使用它超过 10 年,并且不再访问他们的论坛,我现在被困住了。 .COM 文件加载,IDA 愉快地反汇编它,但它只创建一个单独的段,我没有(不再)关于如何创建数据段的线索。 TP3 手册中有一些信息,在 DOXBox-X 中使用 David Lindauer 的 GrdB 允许我单步执行 RTL 初始化代码,这向我显示它设置了 DS 和 SS,但它对我没有帮助在 IDA 中设置这些段。
我已经尝试了“创建段”选项,但是我无法输入起始地址、结束地址和基址所需的值,“类”可能是“数据”,这是单个“seg000”的一次IDA 创建的代码是 CODE,从 @ 0x0100 开始,到 @ 0xD623 结束,这让我假设要创建的“seg001”应该从 0x0000 开始,以 0xffff 结束,并且以 0xd63(段落)为基数,但结果是在“Bad segment base: segment will have bytes with a negative offset”弹出窗口中。
尝试开始@0xd630,结束@0x1d630,以0x0000为基数创建一个段,但它看起来像
seg000:D622
seg001:C8C00 ; ---------------------------------------------------------------------------
seg001:C8C00
seg001:C8C00 ; Segment type: Regular
seg001:C8C00 seg001 segment byte public '' use16
seg001:C8C00 assume cs:seg001
seg001:C8C00 ;org 0C8C00h
seg001:C8C00 assume es:nothing,ss:nothing,ds:nothing,fs:nothing,gs:nothing
这可能是正确的,但“org 0c8c00”对我来说完全没有意义。
如果你能帮助我,我将不胜感激,为了帮助你,我已经上传了一个包含完整源代码的 RAR 档案、生成的“lift.com”可执行文件和输入文件到我的谷歌驱动器@{{3 }},寻找lift16bit.rar 请注意,代码将不会编译任何比Turbo Pascal 3更高级的东西,在我的例子中它是用TP 3.01a编译的。
解决方法
以下 IDC 代码的 IDA 片段将为使用 Turbo Pascal V3.01a 编译的程序设置段寄存器:
//-------------------------------------------------------------------
// This code sets-up the Turbo Pascal segment registers
//-------------------------------------------------------------------
auto _rds;
auto _lds;
_rds = word(word(0x101) + 0x103 + 9);
_lds = word(word(0x101) + 0x103 + 11);
add_segm_ex(0X100,_rds * 16,1,2,ADDSEG_NOSREG);
SegRename(0X100,"cseg");
SegClass (0X100,"CODE");
SegDefReg(0x100,"ds",_rds);
SegDefReg(0x100,"es",0xFFFF);
SegDefReg(0x100,"ss","fs","gs",0xFFFF);
set_segm_type(0X100,2);
add_segm_ex(_rds * 16,(_rds + _lds) * 16,_rds,3,ADDSEG_NOSREG);
SegRename(_rds * 16,"dseg");
SegClass (_rds * 16,"DATA");
SegDefReg(_rds * 16,_rds);
SegDefReg(_rds * 16,0xFFFF);
SegDefReg(_rds * 16,0xFFFF);
set_segm_type(_rds * 16,3);
set_inf_attr(INF_LOW_OFF,0xffff);
set_inf_attr(INF_HIGH_OFF,0xffff);
它(很可能)适用于其他版本的 TP3,甚至可能适用于 TP1/2,但不能保证!
IDC 代码依赖于从 http://www.pcengines.ch/tp3.htm 反汇编的 TP3 代码,并使用调试器单步执行,我使用 David Lindauer 的 GRDB @ https://ladsoft.tripod.com/grdb_debugger.html