действительно ли функция принимает int*
или va_arg
с? в таких случаях вам необходимо предоставить исходный код вызова.
Из того, что я могу собрать, ваша обертка должна выглядеть следующим образом (я не использую фреймы стека, но ваш фрейм неправильный, так как вы не pop ebp
перед возвратом):
__declspec(naked) void func_hook()
{
__asm
{
push dword [esp + 4] //int* - pArgs
push ebx //int - nArgs
call func_hook_payload //you can even just jump to this, the stack should clean itself up correctly
retn
}
}
если это будет va_args
, вы можете сделать что-то вроде этого:
__declspec(naked) void func_hook()
{
__asm
{
lea eax,[esp + 4] //int* - &nArg[0]: here we abuse the way the windows stack grows, creating a stack based buffer
push eax //int* - pArgs
push ebx //int - nArgs
call func_hook_payload
retn
}
}
Вызов старого func тоже довольно прост, вы можете сделать это без функции nake, но на самом деле я предпочитаю голые funcs:)
void __declspec(naked) __stdcall CallTheOldVMFunc(int nArgs, int* pArgs)
{
__asm
{
push ebx //save ebx, its not a scratch register
mov ebx,[esp + 8] //set the number of args
push [esp + 12] //push the arg ptr
call TheOldVMFunc
pop ebx //restore ebx
retn 8 //ret and cleanup
}
}