我正在颠倒使用DirectX 7的旧DirectDraw游戏。

我有一个LPDIRECTDRAWSURFACE7 g_lpDDSBackg_lpDDSBack->BltFast被调用,但这是它在HexRays中的反编译方式:

(*(int (__stdcall **)(struct IDirectDrawSurface7Vtbl *, int, int, LPDIRECTDRAWSURFACE7, RECT *, MACRO_DDBLTFAST))((int (__stdcall **)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD))g_lpDDSBack->QueryInterface + 7))(
                                      g_lpDDSBack,
                                      x,
                                      y,
                                      pgf2->lpDDSrcSurface,
                                      &pgf2->rect,
                                      DDBLTFAST_SRCCOLORKEY);


作为参考,这里是接口:但是HexRays为什么不直接调用g_lpDDSBack->QueryInterface + 7

#1 楼

HexRays之所以没有调用它,是因为在通常情况下它不知道g_lpDDSBack->QueryInterface的值是什么。

通常来说,您可以将结构定义为QueryInterface类型,其中该结构的成员根据相关的函数名称进行命名,然后您将看到调用为g_lpDDSBack->QueryInterface->BltFast

#2 楼

原来这是IDA pro中的错误。我似乎无法编辑我的原始问题,所以首先,我想指出我在原始问题中犯的一个错误。


g_lpDDSBack定义为struct IDirectDrawSurface7Vtbl *g_lpDDSBack;时,这就是输出HexRays显示:

(*(int (__stdcall **)(struct IDirectDrawSurface7Vtbl *, int, int, LPDIRECTDRAWSURFACE7, RECT *, MACRO_DDBLTFAST))((int (__stdcall **)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD))g_lpDDSBack->QueryInterface + 7))(
                                      g_lpDDSBack,
                                      x,
                                      y,
                                      pgf2->lpDDSrcSurface,
                                      &pgf2->rect,
                                      DDBLTFAST_SRCCOLORKEY);



g_lpDDSBack定义为LPDIRECTDRAWSURFACE7 g_lpDDSBack;时,这就是HexRays显示的输出:
(*((int (__stdcall **)(int, int, int, _DWORD, int, signed int))g_lpDDSBack->lpVtbl + 7))(
                       g_lpDDSBack,
                       x,
                       y,
                       pgf2->lpDDSrcSurface,
                       &pgf2->rect,
                       DDBLTFAST_SRCCOLORKEY);


好了,现在这里是修复该错误的说明(g_lpDDSBack被定义为LPDIRECTDRAWSURFACE7 g_lpDDSBack;):将文本框的内容添加到记事本中。在这种情况下,内容为lpVtbl
将类型更改为g_lpDDSBack->lpVtbl,然后按OK
struct IDirectDrawSurface7::IDirectDrawSurface7Vtbl *lpVtbl上再次按y,并将类型更改回存储在记事本中的原始类型。在这种情况下,它是int lpVtbl。完成后,这就是HexRays中的样子(您可能必须先按F5键):

g_lpDDSBack->lpVtbl->BltFast(g_lpDDSBack,
                                      x,
                                      y,
                                      pgf2->lpDDSrcSurface,
                                      &pgf2->rect,
                                      DDBLTFAST_SRCCOLORKEY);