繁体   English   中英

具有堆栈调整的Thunking __stdcall函数

[英]Thunking __stdcall function with stack adjustment

我想thunk(通过调整堆栈)__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到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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM