`
alanyuen
  • 浏览: 2224 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

Thunk技術C++ CallBack

    博客分类:
  • C++
c++ 
阅读更多
// callbackThunk.cpp : Defines the entry point for the console application.
//
#include "stdio.h"
#include "stdlib.h"
class A;
typedef unsigned long DWORD;
typedef unsigned char BYTE;
typedef void (*FuncA)(int a);
typedef void (A::*AFuncB)(int a);
typedef void (__stdcall *FuncB)(int a);
#pragma pack(push,1)
struct Thunk
{
    DWORD    _mov; //mov [esp+4]
    DWORD    _thisPtr; //this
    BYTE    _jump;    //call
    DWORD    _funcAdress; //adress
};
struct Thunk2
{
    BYTE    _mov; //mov ecx
    DWORD    _thisPtr; //this
    BYTE    _jump;    //call
    DWORD    _funcAdress; //adress
};
#pragma pack(pop)
class A
{
public:
    //方法: 取代第一個參數[esp+4]為this指針
    //限制: 原有的第一參數被取代, 如果funciton沒有參數就不能使用
    void init(FuncA func)
    {
        _thunk._mov = 0x042444C7;
        _thunk._thisPtr = (DWORD)this; //mov [esp+4], this
        _thunk._jump = 0xe9;
        _thunk._funcAdress = (int)func - ((DWORD)&_thunk._funcAdress + sizeof(DWORD));
    }
    //方法: 用stdcall取代thiscall,但模疑thiscall加入this指針至ecx
    void init2(AFuncB func)
    {
        _thunk2._mov = 0xb9;
        _thunk2._thisPtr = (DWORD)this; //mov ecx, this
        _thunk2._jump = 0xe9;
        DWORD memberFunction;
        __asm
        {
            push eax
            mov eax, func
            mov dword ptr [memberFunction], eax
            pop eax
        }
        _thunk2._funcAdress = memberFunction -((DWORD)&_thunk2._funcAdress + sizeof(DWORD));
    }
    static void funcA(int a)
    {
        printf("A::funcA called\n");
        A* instanceA = (A*)a; //參數其實已轉變為this指針
        instanceA->funcB(1);
    }
    void funcB(int a)
    {
        printf("A::funcB called\n");
    }
    Thunk        _thunk;
    Thunk2        _thunk2;
};
int main(int argc, char* argv[])
{
    A a;
    a.init(&A::funcA);
    FuncA func = (FuncA)(&a._thunk);
    func(1);
    a.init2(&A::funcB);
    FuncB func2 = (FuncB)(&a._thunk2);
    func2(1);
    system("pause");
    return 0;
}
分享到:
评论

相关推荐

    Thunk技术

    Thunk技术是一种在编程中用于实现不同环境或架构之间调用的技术,主要应用于Windows操作系统下的API调用转换。在Windows API中,32位和64位应用程序之间存在接口不兼容的问题,Thunk技术就解决了这个问题,使得32位...

    thunk技术实现窗口类的封装.rtf

    thunk技术实现窗口类的封装.rtf

    利用thunk技术改写窗口类回调函数为窗口对象成员函数

    为了解决这个问题,我们可以利用Thunk技术将窗口类的回调函数改写为窗口对象的成员函数,从而更好地封装和管理代码。 首先,让我们理解什么是Thunk。在Windows API中,Thunk是一种用于不同地址空间或不同代码段之间...

    自己写的vc开发框架,基于thunk技术

    标题中的“vc开发框架”指的是基于Visual C++(VC)的软件开发框架,这通常是为了简化和标准化开发过程,提高代码复用性而构建的一系列类库和工具集。在这个特定的情况下,框架是作者自己编写的,这意味着它可能包含...

    Thunk 代码

    Thunk,你懂的,这么简单,就没写示例了。

    MinGW对Thunk的实现

    在MinGW中,Thunk的实现涉及到汇编语言和C/C++的混合编程,以确保正确地处理参数传递和返回值。 在给定的资源中,`thunkgcc.cbp`是一个Code::Blocks项目文件,它包含了一个关于如何在MinGW下实现Thunk的示例项目。`...

    atl thunk

    在ATL中,thunk主要分为两种类型:STDMETHODCALLTYPE thunk和C++虚函数调用thunk。STDMETHODCALLTYPE是一种常见的COM调用约定,它与stdcall类似,参数由被调用者清理。而C++虚函数调用thunk则用于处理C++对象的多态...

    Thunk v0.4 by intret

    Thunk v0.4 by intret 是一个C++实现的Thunk技术实例,它提供了一个简单的类,并包含使用示例,帮助开发者理解和应用Thunk技术。 首先,我们要理解什么是Thunk。在Windows编程中,Thunk通常被用来解决32位和64位...

    c++ thunk for 32/64

    非常好用的thunk,全面兼容32位和64位,msvc的各种调用方式,如__stdcall,__fastcall,_cdecl。例如: call_thunk::thunk<AFX_THREADPROC> thunk; void CMyClass::start() { thunk.bind(*this, &CMyClass::Run); ...

    thunk_x64.zip_thunk _x64Thunk

    x64实现Thunk的新思路,兼容x86,目前能使用的第一份x64下的thunk代码。

    MFC,C++thunk,CWinThread工作线程,无ui定时器

    C++ thunk是一种技术,用于在不同寻址模式或调用约定之间进行转换,这对于在32位和64位系统上处理函数指针尤其重要。 在MFC中,`CWinThread`是表示线程的基本类,它提供了创建和管理线程的功能。通常,Windows应用...

    Thunk经典资料全集

    Thunk经典资料全集,收集几乎所有的Thunk资料。

    C++ -stdcall thunk for x86 and x64

    网上对x86下的c++ thunk资源太多。本thunk包括x86和x64下的_stdcall调用方式进行了全面整合,在vc2017环境下,对x86和x64全面test过。考虑到微软的WIN32 api回调函数的参数大多数为32位或者64位无符号整数,一般在4...

    redux-thunk 例子

    在这个"redux-thunk 例子"中,我们将探讨如何结合React和Redux Thunk实现登录验证功能。 首先,让我们了解什么是中间件。在Redux中,中间件是能够拦截并处理 action 的函数。它们在 action 被 dispatch 到 store ...

    thunk-redis, 基于 thunk/promise的redis客户端,支持所有redis特性.zip

    thunk-redis, 基于 thunk/promise的redis客户端,支持所有redis特性 thunk基于 thunk/promise的redis客户端,支持所有redis特性。 插件实现:thunk RateLimiter 最快的抽象速率限制器。定时队列分布式计时作业队列,...

    Expert C++/CLI Source Code

    本主题主要探讨的是C++/CLI的源代码,特别是"Expert C++/CLI Source Code"中的实例,通过对Thunks、强命名程序集以及测试库的分析,来揭示C++/CLI在实际应用中的技术细节。 1. **Thunks**:在C++/CLI中,thunks是...

    purelib.7z

    《纯净SDK与thunk技术在win32窗口编程中的应用》 在计算机编程领域,尤其是Windows平台下,Win32 API(Application Programming Interface)扮演着至关重要的角色,它提供了操作系统级别的接口,允许开发者构建功能...

    前端项目-redux-thunk.zip

    本项目"前端项目-redux-thunk.zip"专注于介绍如何在Redux中集成并使用`redux-thunk`这个中间件,以解决异步操作的问题。 `redux-thunk`是Redux官方推荐的处理异步逻辑的中间件。在纯函数式的Redux中,原生的Action ...

    类 SDK窗口程序

    这个程序采用了Thunk技术 来自看雪的一个牛人 这个技术用到标准的SDK创建窗口中 就可以在 回调函数中调用 类内 消息响应函数了 回调函数演示: LRESULT CALLBACK CSDK::WndProc HWND hWnd UINT message WPARAM ...

    Thunk 和 DEP

    Thunk技术源于低级编程,尤其是在Windows操作系统中,它常用于解决不同代码段之间调用的问题,尤其是涉及到32位和64位API调用兼容性时。Thunk可以被认为是一种“中间人”或者“代理”,它在不同的地址空间或不同的...

Global site tag (gtag.js) - Google Analytics