我想(通过调整堆栈)__stdcall函数。例如,调用者认为有一个指向回调函数的指针,其中包含以下原型:
int Func(int a);
我想编写一个thunk(将作为回调传递),调整对以下函数原型的调用:
int Func(char* ptr, int a);
我知道当我的thunk被称为堆栈布局时:
------------------
| a |
------------------
| return address | <-- Top of the stack
------------------
我想调整卡住:
------------------
| a |
------------------
------------------
| ptr |
------------------
| return address | <-- Top of the stack
------------------
然后执行相对跳转到相关函数(这种方式当被调用函数返回堆栈时是平衡的)
这是我最后的thunk工作(当然它必须打包并动态加载到可执行内存中),Kudo to Jester帮助组装十六进制代码以获取所需的指令!
struct Thunk
{
BYTE m_popRet;
BYTE m_pushPtr;
DWORD m_ptr;
BYTE m_pushRet;
BYTE m_jmp;
DWORD m_relProc;
BOOL Init(DWORD_PTR proc, void* ptr)
{
m_popRet = 0x58;
m_pushPtr = 0x68;
m_ptr = PtrToUlong(ptr);
m_pushRet = 0x50;
m_jmp = 0xE9;
m_relProc = DWORD((INT_PTR)proc - ((INT_PTR)this + sizeof Thunk));
return TRUE;
}
}
答案 0 :(得分:3)
由于您描述了堆栈布局,因此不确定您遇到了什么问题。
无论如何,如果您想使用JMP
,您的代码可能如下所示:
pop eax ; 58 return address
push ptr ; 68 xx xx xx xx
push eax ; 50 put return address back
jmp proc ; E9 xx xx xx xx
请注意,这将更改堆栈对齐方式,因此如果您处于重要的环境中,则必须调整代码。一个更文明的版本可能是:
push edx ; 52 align stack
push [esp+8] ; FF 74 24 08 "a"
push ptr ; 68 xx xx xx xx
call proc ; E9 xx xx xx xx
pop edx ; 5A
ret 4 ; C2 04 00