gpt4 book ai didi

c++ - Thunking __stdcall 函数与堆栈调整

转载 作者:行者123 更新时间:2023-11-30 02:28:12 24 4
gpt4 key购买 nike

我想 thunk(通过调整堆栈)__stdcall 函数。例如,调用者认为它有一个指向具有以下原型(prototype)的回调函数的指针:

int Func(int a);

我想编写一个 thunk(将作为回调传递)调整对以下函数原型(prototype)的调用:

int Func(char* ptr, int a);

我知道当我的 thunk 被调用时,堆栈布局是:

------------------
| a |
------------------
| return address | <-- Top of the stack
------------------

我想将卡住调整为:

------------------
| a |
------------------
------------------
| ptr |
------------------
| return address | <-- Top of the stack
------------------

然后相对跳转到相关函数(这样当被调用函数返回时栈是平衡的)

这是我最后的工作(当然它必须打包并动态加载到可执行内存),感谢 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;
}
}

最佳答案

由于您描述了堆栈布局,不确定您有什么问题。无论如何,如果您想使用 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

关于c++ - Thunking __stdcall 函数与堆栈调整,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41016196/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com