void __usercall sub_101A7850@<eax>(int a1@<edx>, int a2@<ecx>, int a3, int a4, int a5, int a6)
我的第一次尝试(崩溃):
__declspec(naked) void __stdcall callit(const int& a1, const int& a2, unsigned int a3, const int *a4, int a5, int *a6)
{
// void __usercall sub_101A7850@<eax>(int a1@<edx>, int a2@<ecx>, int a3, int a4, int a5, int a6)
__asm
{
mov ecx, [esp + 4] // a1
mov edx, [esp + 8] // a2
push [esp + 12] // a3
push [esp + 16] // a4
push [esp + 20] // a5
push [esp + 24] // a6
call funcaddr
retn 24
}
}
我已验证funcaddr有效。很确定它是一个__fastcall
答案 0 :(得分:2)
您已交换ecx
和edx
:您的func签名为a1<edx>
,但您将a1
置于ecx
和a2
至{{ 1}}。
此外:在推送edx
之后,a3
的{{1}}相对偏移变为更远的4个字节。推送esp
后,a4
的{{1}}相对偏移量变为8个字节更远,依此类推......(因此正确的偏移量为:a4
:esp
,a5
:a4
,[esp+20]
:a5
)