关于 VESA 功能的 x86 反汇编混淆

逆向工程 艾达 反汇编者
2021-06-21 13:15:18

我试图反汇编一个旧的 DOS 应用程序,但在 VESA 图形处理的某个点上卡住了。

要调用的 VESA 函数将存储在一个全局变量中,例如vesa_fct_dword_749C8 = 0x4f00,0x4f01等。在检查返回值后,应用程序会做一些额外的魔术,坦率地说,我不明白。我的猜测是它会检查特定的错误返回值(0x01特别是 ),但我真的不太确定它以及它实际上是如何完成的。

这是相关的片段:

cseg01:000159D8 loc_159D8:                              ; CODE XREF: checkForVesa+D4↑j
cseg01:000159D8                 mov     eax, vesa_fct_dword_749C8
cseg01:000159DD                 mov     edx, vesa_fct_dword_749C8
cseg01:000159E3                 sar     edx, 1Fh
cseg01:000159E6                 shl     edx, 8
cseg01:000159E9                 sbb     eax, edx
cseg01:000159EB                 sar     eax, 8
cseg01:000159EE                 and     eax, 0FFh
cseg01:000159F3                 cmp     eax, 1
cseg01:000159F6                 jnz     short loc_15A01
cseg01:000159F8                 mov     [ebp+var_4], 0
cseg01:000159FF                 jmp     short loc_15A29

也许有人知道那部分是怎么回事,那将不胜感激!

1个回答

此代码采用EAX( msb(EAX))的最高有效位,然后将其减去AH并将结果与​​ 进行比较1根据此规范(“VBE 返回状态”部分):

  • AX = 014F=>AH = 1表示“函数调用失败
  • AX = 024F=>AH = 2表示“当前硬件配置不支持该功能

并且jnz指令将在 if msb(EAX) = 1andAH = 2或 when msb(EAX) = 0and执行AH = 1不幸的是,我不知道存储了哪些信息msb(EAX)(可能与 VBE 版本有关?)。