// 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技术是一种在编程中用于实现不同环境或架构之间调用的技术,主要应用于Windows操作系统下的API调用转换。在Windows API中,32位和64位应用程序之间存在接口不兼容的问题,Thunk技术就解决了这个问题,使得32位...
thunk技术实现窗口类的封装.rtf
为了解决这个问题,我们可以利用Thunk技术将窗口类的回调函数改写为窗口对象的成员函数,从而更好地封装和管理代码。 首先,让我们理解什么是Thunk。在Windows API中,Thunk是一种用于不同地址空间或不同代码段之间...
标题中的“vc开发框架”指的是基于Visual C++(VC)的软件开发框架,这通常是为了简化和标准化开发过程,提高代码复用性而构建的一系列类库和工具集。在这个特定的情况下,框架是作者自己编写的,这意味着它可能包含...
Thunk,你懂的,这么简单,就没写示例了。
在MinGW中,Thunk的实现涉及到汇编语言和C/C++的混合编程,以确保正确地处理参数传递和返回值。 在给定的资源中,`thunkgcc.cbp`是一个Code::Blocks项目文件,它包含了一个关于如何在MinGW下实现Thunk的示例项目。`...
在ATL中,thunk主要分为两种类型:STDMETHODCALLTYPE thunk和C++虚函数调用thunk。STDMETHODCALLTYPE是一种常见的COM调用约定,它与stdcall类似,参数由被调用者清理。而C++虚函数调用thunk则用于处理C++对象的多态...
Thunk v0.4 by intret 是一个C++实现的Thunk技术实例,它提供了一个简单的类,并包含使用示例,帮助开发者理解和应用Thunk技术。 首先,我们要理解什么是Thunk。在Windows编程中,Thunk通常被用来解决32位和64位...
非常好用的thunk,全面兼容32位和64位,msvc的各种调用方式,如__stdcall,__fastcall,_cdecl。例如: call_thunk::thunk<AFX_THREADPROC> thunk; void CMyClass::start() { thunk.bind(*this, &CMyClass::Run); ...
x64实现Thunk的新思路,兼容x86,目前能使用的第一份x64下的thunk代码。
C++ thunk是一种技术,用于在不同寻址模式或调用约定之间进行转换,这对于在32位和64位系统上处理函数指针尤其重要。 在MFC中,`CWinThread`是表示线程的基本类,它提供了创建和管理线程的功能。通常,Windows应用...
Thunk经典资料全集,收集几乎所有的Thunk资料。
网上对x86下的c++ thunk资源太多。本thunk包括x86和x64下的_stdcall调用方式进行了全面整合,在vc2017环境下,对x86和x64全面test过。考虑到微软的WIN32 api回调函数的参数大多数为32位或者64位无符号整数,一般在4...
在这个"redux-thunk 例子"中,我们将探讨如何结合React和Redux Thunk实现登录验证功能。 首先,让我们了解什么是中间件。在Redux中,中间件是能够拦截并处理 action 的函数。它们在 action 被 dispatch 到 store ...
thunk-redis, 基于 thunk/promise的redis客户端,支持所有redis特性 thunk基于 thunk/promise的redis客户端,支持所有redis特性。 插件实现:thunk RateLimiter 最快的抽象速率限制器。定时队列分布式计时作业队列,...
本主题主要探讨的是C++/CLI的源代码,特别是"Expert C++/CLI Source Code"中的实例,通过对Thunks、强命名程序集以及测试库的分析,来揭示C++/CLI在实际应用中的技术细节。 1. **Thunks**:在C++/CLI中,thunks是...
《纯净SDK与thunk技术在win32窗口编程中的应用》 在计算机编程领域,尤其是Windows平台下,Win32 API(Application Programming Interface)扮演着至关重要的角色,它提供了操作系统级别的接口,允许开发者构建功能...
本项目"前端项目-redux-thunk.zip"专注于介绍如何在Redux中集成并使用`redux-thunk`这个中间件,以解决异步操作的问题。 `redux-thunk`是Redux官方推荐的处理异步逻辑的中间件。在纯函数式的Redux中,原生的Action ...
这个程序采用了Thunk技术 来自看雪的一个牛人 这个技术用到标准的SDK创建窗口中 就可以在 回调函数中调用 类内 消息响应函数了 回调函数演示: LRESULT CALLBACK CSDK::WndProc HWND hWnd UINT message WPARAM ...
Thunk技术源于低级编程,尤其是在Windows操作系统中,它常用于解决不同代码段之间调用的问题,尤其是涉及到32位和64位API调用兼容性时。Thunk可以被认为是一种“中间人”或者“代理”,它在不同的地址空间或不同的...