【问题标题】:C++ __usercall hookingC++ __usercall 挂钩
【发布时间】:2013-05-29 13:50:58
【问题描述】:

你好,在 IDA 中我有一个函数

void __userpurge Test(int a1<eax>, int a2, int a3, int a4, char a5)

我想从我的 C++ 注入的 dll 中挂钩/调用它 这就是我尝试调用它的方式,但是 .exe 崩溃了

DWORD CALL_ORIGINAL = 0x00EAF6D0;
__declspec(naked) void  myHookedFunc(int a1,int a2,int a3,int a4,char a5) {
    __asm
 {

    push a5
    push a4
    push a3
    push a2
    push eax
    call  CALL_ORGIGINAL //maybe use JMP?
    retn

   }
}

这就是exe调用这个函数的方式

mov     eax, [ebp+arg_4]
add     esp, 8
push    eax
push    ecx
mov     ecx, [edi+2138h]
mov     edx, [ecx+4]
mov     ecx, [edx+30h]
mov     edx, [ecx]
mov     eax, esp
mov     [eax], edx
mov     eax, [edi+20h]
mov     [esp+40h+var_24], esp
push    eax
push    eax
mov     eax, edi
call    Test
pop     edi
pop     esi  
retn

在功能上似乎有几次

add     esp, 24h
retn    10h

这意味着有更多参数或 IDA 有错误的参数类型?

【问题讨论】:

  • 不要相信来自 IDA 的函数签名。有时,IDA 不会产生正确的签名。您需要手动分析它。

标签: c++ assembly wrapper reverse-engineering usercall


【解决方案1】:

__userpurge 函数使用类似于__usercall 的调用约定,只是调用者负责清理堆栈。但是,查看您发布的 IDA 附加代码很可能会提供不正确的参数数量不正确的调用约定。我建议您通过在call CALL_ORGIGINAL 的位置放置一个断点来验证这一点,并在调用前后观察 ESP 的值。如果 ESP 在返回时不同,则 CALL_ORIGINAL 正在清理堆栈,您无需再做任何事情。如果CALL_ORIGINAL 确实清理了堆栈,您可能可以通过将差值除以 4 来确定传递的参数数量(假设每个参数都是 32 位)。

另一个问题是您不应该将eax 推入堆栈(根据您编辑中包含的调用代码)。调用此函数的现有代码将第一个参数放在eax 中,但不会将其压入堆栈。

根据您问题中的代码并假设参数的数量是正确的,您的钩子函数应该类似于下面的示例。

__declspec(naked) void  myHookedFunc(int a1,int a2,int a3,int a4,char a5) {
    __asm
 {

    push a5
    push a4
    push a3
    push a2
    // eax is not pushed onto the stack
    call CALL_ORGIGINAL
    retn
   }
}

如果调用约定和参数个数是正确的,ESP 前后应该是相同的值,所有到CALL_ORIGINAL。如果不是,则需要进一步调查以确定正确的调用约定和参数。

简而言之,永远不要相信 IDA,除非您自己验证。

【讨论】:

  • 在函数中有几次 add esp, 24h retn 10h 所以我猜还有更多的参数和 IDA 是错误的?
  • @user1422473 这是一个很好的假设。我已经编辑了我的答案以反映您发布的附加代码。注意call Test 之后的行,以确保正确清理堆栈。如果您可以在通话后包含代码,我会在必要时更新我的​​答案。
  • 我检查了函数,它的第一行是 sub esp, 24h 这意味着它自己清理堆栈
猜你喜欢
  • 1970-01-01
  • 2013-02-17
  • 1970-01-01
  • 1970-01-01
  • 2016-08-08
  • 2011-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多