我正在尝试修补处于保护模式的旧的 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 无法做到的事情,那很好,但我想先以这种方式尝试一下。我是汇编和逆向工程的初学者,因此我将此视为一个学习机会,因此学习解决这些远距离调用所需的各种细节可能会很有用。