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

问题描述

我想反汇编自己编写的 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