我的用户调用函数的 stdcall 包装器是否正确?
我需要将下面的 __usercall 函数包装到 _cdecl/_stdcall:
char __usercall sub_4017B0<al>(int a1<ebx>, int a2)
a1 是整数, a2 实际上是一个整数数组 ('int args[10]')
这是正确的吗? sub_4017B0 后面的
是什么意思?
int __stdcall func_hook_payload(int callnum, int* args);
// Wrapper for
// char __usercall sub_4017B0<al>(int callnum<ebx>, int a2)
__declspec(naked) void func_hook()
{__asm{
push ebp
mov ebp, esp
push dword ptr[ebp + 0x28] // args[9]
push dword ptr[ebp + 0x24] // args[8]
push dword ptr[ebp + 0x20] // args[7]
push dword ptr[ebp + 0x1C] // args[6]
push dword ptr[ebp + 0x18] // args[5]
push dword ptr[ebp + 0x14] // args[4]
push dword ptr[ebp + 0x10] // args[3]
push dword ptr[ebp + 0x0C] // args[2]
push dword ptr[ebp + 0x08] // args[1]
push dword ptr[ebp + 0x04] // args[0]
push ebx // callnum
call func_hook_payload
leave
ret // note: __usercall is cdecl-like
}}
调用 sub_4017B0 的包装器会是什么样子?
包装器应该有这个签名:
int sub_4017B0_wrapper(int callnum, int* args);
I need to wrap the below __usercall function to _cdecl/_stdcall:
char __usercall sub_4017B0<al>(int a1<ebx>, int a2)
a1 is integer,
a2 is actually an arry of ints ('int args[10]')
Is this correct? What does the <al>
mean behind sub_4017B0 ?
int __stdcall func_hook_payload(int callnum, int* args);
// Wrapper for
// char __usercall sub_4017B0<al>(int callnum<ebx>, int a2)
__declspec(naked) void func_hook()
{__asm{
push ebp
mov ebp, esp
push dword ptr[ebp + 0x28] // args[9]
push dword ptr[ebp + 0x24] // args[8]
push dword ptr[ebp + 0x20] // args[7]
push dword ptr[ebp + 0x1C] // args[6]
push dword ptr[ebp + 0x18] // args[5]
push dword ptr[ebp + 0x14] // args[4]
push dword ptr[ebp + 0x10] // args[3]
push dword ptr[ebp + 0x0C] // args[2]
push dword ptr[ebp + 0x08] // args[1]
push dword ptr[ebp + 0x04] // args[0]
push ebx // callnum
call func_hook_payload
leave
ret // note: __usercall is cdecl-like
}}
How would a wrapper look like for calling sub_4017B0 ?
The wrapper should have this signature:
int sub_4017B0_wrapper(int callnum, int* args);
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
该函数是否采用实际的
int*
还是采用va_arg
s?在这种情况下,您需要提供原始的调用代码。据我所知,您的包装器应该如下所示(我不使用堆栈帧,但您的框架是错误的,因为您在返回之前没有
pop ebp
):应该是
va_args
你可以这样做:调用旧的 func 也非常简单,你可以在没有 nake 函数的情况下完成它,但实际上我更喜欢裸函数:)
does the function take an actual
int*
or does it takeva_arg
s? in cases like this you need to provide the original calling code to.from what I can gather, your wrapper should look like this(I don't use stack frames, but your frame is wrong as you don't
pop ebp
before returning):should it be
va_args
you can do something like this:Calling the old func is pretty simple too, you can do it without a nake function, but really I prefer naked funcs :)