使用 IDA Pro 在 16 位 Windows 中查找目标以调用 Dword Ptr

逆向工程 艾达 视窗
2021-07-05 10:24:19

寻找有关步骤的建议,这些步骤可用于从静态分析中确定调用 dword ptr es:[bx+0Ch] 时将执行哪些代码。

cseg04:3044 loc_105D4:                              ; CODE XREF: cseg04:2F10↑j
    cseg04:3044                 push    0
    cseg04:3046                 push    34h ; '4'
    cseg04:3048                 les     bx, ppMalloc
    cseg04:304C                 push    es
    cseg04:304D                 push    bx
    cseg04:304E                 les     bx, es:[bx]
    cseg04:3051                 call    dword ptr es:[bx+0Ch]
    cseg04:3055                 add     sp, 8
    cseg04:3058                 mov     si, ax
    cseg04:305A                 mov     [bp-6], dx
    cseg04:305D                 or      dx, ax
    cseg04:305F                 jnz     short loc_105F8

ppMalloc 部分:

eg70:3612 ppMalloc        dd 0                    ; DATA XREF: cseg04:3048↑r
dseg70:3612                                         ; sub_145C0+24↑r ...
dseg70:3616 ; ATOM word_10CA26
dseg70:3616 word_10CA26     dw 0                    ; DATA XREF: sub_4637E:loc_463B1↑r
dseg70:3616                                         ; sub_4637E+3A↑r ...
dseg70:3618 word_10CA28     dw 0                    ; DATA XREF: sub_CE2A+1↑o
dseg70:3618                                         ; cseg03:2F9C↑o ...
dseg70:361A                 db    0
dseg70:361B                 db    0
dseg70:361C                 db    0
dseg70:361D                 db    0
dseg70:361E                 db    0
dseg70:361F                 db    0
dseg70:3620                 db    0
dseg70:3621                 db    0
dseg70:3622                 db    0
dseg70:3623                 db    0
dseg70:3624                 db    0
dseg70:3625                 db    0
dseg70:3626 unk_10CA36      db    0                 ; DATA XREF: sub_CE2A+A↑o
dseg70:3626                                         ; cseg03:2F93↑o ...
dseg70:3627                 db    0
dseg70:3628                 db    0
dseg70:3629                 db    0
dseg70:362A                 db    0
dseg70:362B                 db    0
dseg70:362C                 db    0
dseg70:362D                 db    0
dseg70:362E                 db    0
dseg70:362F                 db    0
dseg70:3630                 db    0
dseg70:3631                 db    0
dseg70:3632                 dw 0
2个回答

我的猜测是,这ppMalloc是一个指向IMallocCOM 接口实例的指针(例如,它是通过调用 初始化的CoGetMalloc),这意味着其中的第一个指针(由les指令加载)是 VTable,它具有以下方法。

前三个继承自 IUnknown,它是所有 COM 对象的父对象:


+00 查询接口

+04 添加引用

+08 发布


其次是IMalloc本身的方法:


+0C分配

+10 分配分配

+14 免费

+18 获取大小

+1C 堆最小化

+20 重新分配


因此,代码可能正在调用IMalloc::Malloc分配 0x34 字节,在ax:dx寄存器对中返回指向该字节的指针

我们无法从您提供的代码片段中推断出它(当然,除非我们是 @Igor Skochinsky)。但是,我们可以注意到以下几点:

  • ppMalloc 包含动态分配的函数指针数组的地址
  • 调用的函数call [bx+0Ch]采用堆栈传递的三个参数:0, 34h(偏移量?)和一个指向动态分配数组地址的ppMalloc指针(即指针的地址
  • at line3051 es:bx指向该数组的第一个元素,es:[bx+0Ch]是其中的第四个元素
  • 取决于(在返回的值dx:ax)将会或将不执行在最后一行的跳跃(or dx, ax检查是否dx:ax0与否)

如果您有任何疑问,下面给出的反汇编评论应该会澄清它们。

cseg04:3044                 push    0 ; push first argument
cseg04:3046                 push    34h ; '4' ; push the second one
cseg04:3048                 les     bx, ppMalloc ; es:bx = ppMalloc
cseg04:304C                 push    es
cseg04:304D                 push    bx ; push es:bx (ppMalloc)
cseg04:304E                 les     bx, es:[bx] ; es:bx = *ppMalloc (that is the value stored at dseg70:3612, i.e. pointer to array of function pointers, i.e. pointer to the first element of that array)
cseg04:3051                 call    dword ptr es:[bx+0Ch] ; call arrayOfFunctionPointers[3] - fourth entry as each entry is probably of dword size
cseg04:3055                 add     sp, 8 ; restore previous sp value
cseg04:3058                 mov     si, ax ; si = (returned result) % 2^16
cseg04:305A                 mov     [bp-6], dx ; [bp-6] = (returned result) / 2^16
cseg04:305D                 or      dx, ax ; will be 0 <=> (dx = 0 and ax = 0)
cseg04:305F                 jnz     short loc_105F8