【问题标题】:Disassembly of old Turbo Pascal (V3) code - how to create data segment in IDA旧 Turbo Pascal (V3) 代码的反汇编 - 如何在 IDA 中创建数据段
【发布时间】:2021-07-12 03:36:36
【问题描述】:

我想反汇编一个自己编写的 Turbo Pascal V3 程序的最终版本,即一个简单的 .COM 文件,为此我挖出了我的旧 (AD 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 would have bytes with a negative offset”弹出窗口中。

尝试 start @ 0xd630,end @ 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”可执行文件和输入文件到我的 Google 驱动器@https://drive.google.com/drive/folders/0B0oygbfs7DsVVWNBZWpqaHRHX3c?usp=sharing , 查找 lift16bit.rar 请注意,该代码不会用比 Turbo Pascal 3 更高级的东西编译,在我的例子中,它是用 TP 3.01a 编译的。

【问题讨论】:

    标签: disassembly ida turbo-pascal


    【解决方案1】:

    IDC 代码的以下 IDA sn-p 将为使用 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 的反汇编 TP3 代码并使用调试器单步执行,我使用 David Lindauer 的 GRDB @https://ladsoft.tripod.com/grdb_debugger.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-25
      • 2022-12-04
      • 2010-09-18
      • 1970-01-01
      • 2015-02-14
      • 2012-03-15
      相关资源
      最近更新 更多