包装来自 Hex-Rays 的用户调用

逆向工程 艾达 部件 六线谱
2021-06-12 10:09:41

我试图通过注入 DLL 来调用由 Hex-Rays 生成的函数,但到目前为止只设法使进程崩溃。

这是 Hex-Rays 生成的代码

int __usercall sub_54C3A0@<eax>(int a1@<esi>, void *a2@<ecx>)
{
  char *v2; // eax@1
  char *v3; // edx@1
  char v4; // cl@2
  int result; // eax@4
  char v6[84]; // [sp+0h] [bp-58h]@1

  sub_432BA0(a2);
  dword_81D7CC = 1;
  sub_432B40("xxx_");
  v2 = (char *)sub_431620(55);
  v3 = (char *)(v6 - v2);
  do
  {
    v4 = *v2;
    v2[(_DWORD)v3] = *v2;
    ++v2;
  }
  while ( v4 );
  sub_4330E0(*(_DWORD *)v6);
  sub_437270();
  dword_81D7CC = 0;
  result = 0;
  if ( v6[0] )
  {
    dword_81DAE0 = 0;
    if ( sub_54C480(100, a1) || dword_81DAE0 || sub_54C480(75, a1) || dword_81DAE0 || sub_54C480(50, a1) )
      result = 1;
  }
  return result;
}

这是我的代码

static DWORD hook_address = 0x54C3A0;
__declspec(naked) int hook()
{
    __asm {
        push esi // a1
        push ecx // a2
        call hook_address
        retn 4
    }
}

正确的包装器是什么样子的,为什么?

1个回答

你的钩子是错误的,因为retn 4是为__stdcalls,而不是__usercalls,并且因为你必须将参数移动到寄存器,而不是推送它们。像这样做:

mov esi, a1
mov ecx, a2
call hook_address
ret

retn 4将从堆栈中清除 4 个字节,但您没有推送任何内容,因此这是不正确的,这就是您使用的原因ret