如何在 Windows 3 16 位保护模式二进制文件中确定远调用的目标

逆向工程 部件
2021-06-14 23:28:04

我正在尝试修补处于保护模式的旧的 16 位 Windows 3 新可执行二进制文件。这是一个简单的安装可执行文件。此外,我正在 linux 上进行此反汇编,并且我使用Semblance反汇编了二进制文件,并且遇到了以下代码:

1:0f91 <no name>:
  1:0f91:       33 ed                   xor     bp, bp
  1:0f93:       55                      push    bp
  1:0f94:       9a ff ff 00 00          call    KERNEL.91
  1:0f99:       0b c0                   or      ax, ax
  1:0f9b:       74 5b                   jz      0ff8
  1:0f9d:       8c 06 fe 02             mov     [02FEh], es
  1:0fa1:       81 c1 00 01             add     cx, 0100h
  1:0fa5:       72 51                   jb      0ff8
  1:0fa7:       89 0e d0 02             mov     [02D0h], cx
  1:0fab:       89 36 d2 02             mov     [02D2h], si
  1:0faf:       89 3e d4 02             mov     [02D4h], di
  1:0fb3:       89 1e d6 02             mov     [02D6h], bx
  1:0fb7:       8c 06 d8 02             mov     [02D8h], es
  1:0fbb:       89 16 da 02             mov     [02DAh], dx
  1:0fbf:       e8 3c 00                call    0ffe
  1:0fc2:       e8 f9 01                call    11be
  1:0fc5:       e8 84 03                call    134c
  1:0fc8:       33 c0                   xor     ax, ax
  1:0fca:       50                      push    ax
  1:0fcb:       9a ff ff 00 00          call    KERNEL.30
  1:0fd0:       ff 36 d4 02             push    word [02D4h]
  1:0fd4:       9a ff ff 00 00          call    USER.5
  1:0fd9:       0b c0                   or      ax, ax
  1:0fdb:       74 1b                   jz      0ff8

有几个调用指令,我已经验证了非远调用地址都在文件中。但是,如果您注意到,这里有 3 个远调用,但都具有相同的 ptr16:16 参数!我将在这里重现它们:

  1:0f94:       9a ff ff 00 00          call    KERNEL.91
  1:0fcb:       9a ff ff 00 00          call    KERNEL.30
  1:0fd4:       9a ff ff 00 00          call    USER.5

9a 是远调用的操作码,但它们都有相同的参数!然而,Semblance 不仅确定了它调用的系统模块,而且可能确定了哪个功能,但我还没有弄清楚这个数字的意义。我应该指出,KERNEL 和 USER 都是 exe 的模块引用表中存在的模块。二进制文件中的所有远调用都已链接到参考表中的这些模块之一。

那么,semblance 是如何做到这一点的呢?所有的电话似乎都一样。我只想弄清楚正在调用哪些函数,并且我可以开始弄清楚如何修补我面临的错误。

如果这是 linux 无法做到的事情,那很好,但我想先以这种方式尝试一下。我是汇编和逆向工程的初学者,因此我将此视为一个学习机会,因此学习解决这些远距离调用所需的各种细节可能会很有用。

1个回答

由于外部模块可能会加载到运行时才知道的地址,因此无法使用特定地址,因此有关外部调用的信息并未编码在指令本身中(使用的字节只是占位符),而是在单独的部分中称为模块引用表的新可执行文件 (NE) 重定位修复数据相结合,该数据Per-segment 数据的一部分有关更多信息,请参阅参考资料和/或查找 Semblance 如何解析此信息。

顺便说一句,模块名称后面的数字是该模块使用的函数序数Win16 的序数是固定的,您可以查找哪个序数映射到哪个函数,例如 WINE: USER , KERNEL