旧Turbo Pascal(V3)代码的反汇编-如何在IDA中创建数据段



我想拆解一个自己编写的Turbo Pascal V3程序的最终版本,即一个简单的.COM文件,为此,我挖出了IDA Pro(V4.7.0.831(的旧副本(AD 2004(。加载了.COM文件,IDA很乐意对其进行反汇编,但它只创建了一个单独的段,我(不再(知道如何创建数据段。TP3手册中有一些信息,在DOXBox-X中使用David Lindauer的GRDB可以让我一步完成RTL初始化代码,这表明它设置了DS和SS,但对我在IDA中设置这些段没有帮助。

我试过";创建段";选项,但我无法输入开始地址、结束地址和基址所需的值,";类";可能是";DATA";,单次";seg000";IDA创建的是CODE,起始@0x0100,结束@0xD623,这使我假设要创建的";seg001";应该从0x0000开始,在0xffff结束,并且具有0xd63的基(段落(,但这导致"0";错误的段基:段将具有负偏移量的字节";弹出窗口。

尝试在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";可执行文件和输入文件到我的谷歌驱动器@https://drive.google.com/drive/folders/0B0oygbfs7DsVVWNBZWpqaHRHX3c?usp=sharing,查找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, 0, 0, 1, 2, ADDSEG_NOSREG);
SegRename(0X100, "cseg");
SegClass (0X100, "CODE");
SegDefReg(0x100, "ds", _rds);
SegDefReg(0x100, "es", 0xFFFF);
SegDefReg(0x100, "ss", 0xFFFF);
SegDefReg(0x100, "fs", 0xFFFF);
SegDefReg(0x100, "gs", 0xFFFF);
set_segm_type(0X100, 2);
add_segm_ex(_rds * 16, (_rds + _lds) * 16, _rds, 0, 3, 2, ADDSEG_NOSREG);
SegRename(_rds * 16, "dseg");
SegClass (_rds * 16, "DATA");
SegDefReg(_rds * 16, "ds", _rds);
SegDefReg(_rds * 16, "es", 0xFFFF);
SegDefReg(_rds * 16, "ss", 0xFFFF);
SegDefReg(_rds * 16, "fs", 0xFFFF);
SegDefReg(_rds * 16, "gs", 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我使用David Lindauer的GRDB@https://ladsoft.tripod.com/grdb_debugger.html

最新更新