gpt4 book ai didi

C++ __usercall Hook

转载 作者:行者123 更新时间:2023-11-30 04:17:51 26 4
gpt4 key购买 nike

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

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

我想从我的 C++ 注入(inject)的 dll Hook /调用它这就是我尝试调用它但 .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 得到了错误的参数类型?

最佳答案

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

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

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

__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。

关于C++ __usercall Hook ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16815767/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com