X86 挂接一个"用户清除函数c++;
我想从x86可执行文件钩住一个函数。这是使用用于IDA的hex-rays插件反编译的函数原型:X86 挂接一个"用户清除函数c++;,x86,hook,reverse-engineering,ida,X86,Hook,Reverse Engineering,Ida,我想从x86可执行文件钩住一个函数。这是使用用于IDA的hex-rays插件反编译的函数原型: int __userpurge sub_43CE70<eax>(int a1<eax>, int a2, char a3, int a4, int a5, int a6) 由于某些原因,每次调用函数时,它都不工作并崩溃。您需要使用与您尝试包装的函数相同的包装器来声明您的包装器 根据约定(最常见的是cdecl和stdcall,但也取决于包装代码的编译器),清除堆栈的是调用者或被
int __userpurge sub_43CE70<eax>(int a1<eax>, int a2, char a3, int a4, int a5, int a6)
由于某些原因,每次调用函数时,它都不工作并崩溃。您需要使用与您尝试包装的函数相同的包装器来声明您的包装器 根据约定(最常见的是
cdecl
和stdcall
,但也取决于包装代码的编译器),清除堆栈的是调用者或被调用者。如果不使用正确的约定,则很容易发生堆栈损坏和崩溃
int the_wrapper(int a2, unsigned a3, int a4, int a5, int a6)
{
int a1;
_asm
{
mov [a1], eax
};
char bString[50];
sprintf(bString,"a1: %u, a2: %u, a3: %d, a4: %d, a5: %d, a6: %d",a1,a2,a3,a4,a5,a6);
logs(bString);
int rtn;
_asm{
push a6
push a5
push a4
push a3
push a2
mov eax, [a1]
call the_function
mov [rtn], eax
};
return rtn;
}