使用 IDA Pro 在 MS-DOS 16 位可执行文件中查找代码参考字符串

逆向工程 艾达
2021-06-14 20:26:22

有一个具有检测串行端口模型的代码的应用程序。我正在尝试通过静态分析弄清楚它是如何工作的。我解压了 EXE,可以找到对字符串的引用:

dseg:2DA8 38 32 35 30 00           a8250     db '8250',0      ; DATA XREF: seg124:4EC1↑o
dseg:2DAD 31 36 34 35 30 00        a16450    db '16450',0     ; DATA XREF: seg124:4EC6↑o
dseg:2DB3 31 36 35 35 30 00        a16550    db '16550',0     ; DATA XREF: seg124:4ECB↑o
dseg:2DB9 31 36 35 35 30 41 46 00  a16550af  db '16550AF',0   ; DATA XREF: seg124:4ED0↑o
dseg:2DC1 31 36 35 35 31 00        a16551    db '16551',0     ; DATA XREF: seg124:4ED5↑o
dseg:2DC7 31 36 35 35 32 00        a16552    db '16552',0     ; DATA XREF: seg124:4EDA↑o
dseg:2DCD 38 32 30 35 30 00        a82050    db '82050',0     ; DATA XREF: seg124:4EDF↑o
dseg:2DD3 38 32 35 31 30 00        a82510    db '82510',0     ; DATA XREF: seg124:4EE4↑o

现在,当我x找到这些的外部参照时,我将使用字符串和字符串长度值:

seg124:4EC0 04                               db    4   
seg124:4EC1 A8 2D 26 6A                      dd a8250         ; "8250"
seg124:4EC5 05                               db    5   
seg124:4EC6 AD 2D 26 6A                      dd a16450        ; "16450"
seg124:4ECA 05                               db    5   
seg124:4ECB B3 2D 26 6A                      dd a16550        ; "16550"
seg124:4ECF 07                               db    7   
seg124:4ED0 B9 2D 26 6A                      dd a16550af      ; "16550AF"
seg124:4ED4 05                               db    5   
seg124:4ED5 C1 2D 26 6A                      dd a16551        ; "16551"
seg124:4ED9 05                               db    5   
seg124:4EDA C7 2D 26 6A                      dd a16552        ; "16552"
seg124:4EDE 05                               db    5   
seg124:4EDF CD 2D 26 6A                      dd a82050        ; "82050"
seg124:4EE3 05                               db    5   
seg124:4EE4 D3 2D 26 6A                      dd a82510        ; "82510"

IDA 没有自动找到对这些的引用。是否有我可以搜索的值或指令来缩小搜索范围。即引用seg124:4ECB

我还尝试使用实时调试器,但出现内存不足错误,这就是我尝试静态解决的原因

2个回答

我找到了使用SoftICE for MS-DOS访问字符串的代码要使用我做了以下事情:

  1. 添加 SoftICE 驱动程序作为 CONFIG.SYS 中的第一个条目

设备=C:\SICE\S-ICE.EXE /SYM 50

在此处输入图片说明

  1. 启动程序和 Alt+PrintScreen 触发闯入 SoftICE 窗口。(SoftIce 文档也提到了 Ctrl+D 但这对我不起作用)

  2. 在内存中搜索我的目标字符串:

s 0 L FFFFFFFF“16550AF

其中输出内存地址6AF0:2DB9

  1. 在该位置的读/写内存访问上设置断点:

bpm 6AF0:2DB9 RW

在此处输入图片说明

  1. X 继续程序执行

  2. 在断点处,指令mov al,ES:[BX]访问字符串位置

  3. 搜索 IDA pro 的字节即26 8A 07 25 FF 00 75 03以找到指令:

您似乎有一组以下格式的记录:

struct msg_rec
{
 char len;
 char __far *string;
};

(可能字段已交换)

在这种情况下,一个好的策略是向上滚动直到第一次读取或偏移外部参照 - 这应该是遍历或索引数组并检索字符串地址的代码。