C++ Thunk技术(初学版)

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

今天看到一篇关于Thunk技术的文章,特转过来。

这里想说的是:代码中的关键点为用指令jmp pFunc跳转到你想要执行的函数pFunc。

指令“jmp xxxx”占5个字节,代码中用了个一字节对齐的结构体struct Thunk ,

当然也可以用 unsigned char code[5]; 说另一个关键点就是地址计算了,jmp xxxx指令用了相对跳转地址,

相对地址 = 要跳转函数的地址 - “jmp xxxx”指令的下一条指令的地址。

下面代码中的class C 只有m_thunk一个数据成员,没有虚函数和在m_thunk前没有声明别的数据成员,

因此相对地址 = pFunc - [ (int)this + sizeof(struct Thunk) ]

如上所述,若有虚函数和在m_thunk前声明了别的数据成员,则相对地址的计算要做修改。

:)本来画个表会说得比较清楚,但本人嫌麻烦,就作罢了!

/////////////////////////////////////////////下面是所转的文章////////////////////////////////////////////////////////////////////////////////

C++中的Thunk技术和它的使用场景 阅读详情

相关推荐

Thunk技术

Thunk技术,一般认为是在程序中直接构造出可执行代码的技术(在正常情况下,这是编译器的任务)。《深度探索C++对象模型》中对这个词的来源有过考证(在中文的162页),说thunk是knuth的倒拼字。knuth就是大名鼎鼎的计算机经典名著《The Art of Computer Programming》的作者,该书被程序员们称为“编程圣经”,与牛顿的“自然哲学的数学原理”等一起,被评为“世界历...

晓晓梦 664

Thunk函数配合Generator函数使用,依次取上传文件

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> </head> <body> <button type="button">取文件</button> <inpu...

hohocj的博客 227

如何确定虚函数在虚函数表中的位置2 (Windows x64)

之前写了一篇blog,描述 Windows 在x86 下,如何确定Virtual Function在Table中的位置。我们第一步要获得这个thunk的地址,用伪代码就是: &Class::vfn_name。当然,我们为了获取所有地址,需要每一个函数都写一个这样的FunctionPointer。后来我在咨询deepseek的时候,他偶尔提了一嘴,说可以用Union的方法。我们发现他的逻辑和x86是一模一样的,只是指令变为了x64的本。没有写x64的情况,主要原因是x64不支持内联汇编。

norsd的专栏 363

C++ Thunk技术

一. 使用回调函数时遇到的问题 在使用Win32 API(如CreateThread等)时我们经常需要传入回调函数,这个回调函数不能是类的成员函数,只能是友元函数或静态函数。为了在回调函数中访问某个类的成员变量或函数,我们通常不得不通过某种方式将该类的This指针传入到回调函数中,从而实现在回调函数中访问类的公有的成员变量或函数。 如果有一种方式可以实现将类的成员函数作为回调函数来使用,那么就...

while(1) { smile(); } 5万+

C++虚函数调用底层机制:vcall thunk原理与调试实战

虚函数调用是C++实现多态的核心机制,其底层通过虚函数表(vtable)实现动态绑定。在多重继承和虚基类等复杂场景下,编译器需要生成名为“thunk”的胶水代码来调整this指针,确保函数能访问正确的对象内存布局。vcall thunk分为non-virtual thunk(固定偏移调整)和virtual thunk(动态偏移获取)两种,它们对理解对象模型和调试至关重要。掌握thunk机制能帮助开发者在遇到涉及复杂继承关系的崩溃或逻辑错误时,精准定位问题根源,例如识别this指针的“诡异”偏移。本文通过实战

weixin_34380948的博客 514

C++中的Thunk技术 / 非静态类成员函数作为回调函数 的实现方法

申明:本文非笔者原创,原文转载自:http://www.cnblogs.com/memset/p/thunk_in_cpp.html 用我的理解通俗地解释一下什么是C++中的Thunk技术吧!   Thunk技术就是申请一段可执行的内存, 并通过手动构造CPU指令的形式来生成一个小巧的, 具有明确作用的代码块.   小巧? 具有明确作用? 你曾经初学C++时, 如果我没猜

计算机视觉小菜鸟的专栏 3689

Thunk

一种实现Win32窗口过程函数(Window Procedure)的新方法   基于Thunk实现的类成员消息处理函数   JERKII.SHANG (JERKII@HOTMAIL.COM)   MAR.10th - 31st, 2006   Windows是一个消息驱动的操作系统,在系统中发生的所有消息均需要通过消息处理过程(或叫窗口过程)进行处理。由于C++给我们在程序设计中带

张金泉的专栏 2541

利用ThunkC++成员函数变回调函数

申明:本文非笔者原创,原文转载自:https://www.cnblogs.com/fangkm/archive/2009/05/25/1488727.html Windows API经常需要回调函数,而在C++开发中面向对象当行其道,若能让C++类的成员函数成为回调函数,简直就是大善!但是C++成员函数都隐含了一个this指针用于指向当前的对象.要实现回调确实不容易. 我大约一年前

计算机视觉小菜鸟的专栏 1900

THUNK

一种实现Win32窗口过程函数(Window Procedure)的新方法   基于Thunk实现的类成员消息处理函数   JERKII.SHANG (JERKII@HOTMAIL.COM)   MAR.10th - 31st, 2006   Windows是一个

csm120224267的专栏 2413

关于多继承第二虚函数表使用thunk跳转

到表2中找到Groundson::fun1直接调用,我们都知道,成员函数调用需要传如this,而这里的this = son2,由son2指向地址8,fun1中又对son1的变量有赋值,如果不对this指针做偏移,直接用son2指针(地址指向8)是操作不到son1的内存的。派生类C有两个基类A和B,其中A和B中存在虚函数show()(不管是继承而来还是原生的),且C类重写了虚函数show(),这样的C类中的第二张虚函数表(B类实例)里边保存的表项就不是D::show()虚函数地址。

ZHANG200906的博客 1200

一种实现Win32消息处理处理函数的新方法 - 基于Thunk实现的类成员消息处理函数...

Windows是一个消息驱动的操作系统,在系统中发生的所有消息均需要通过消息处理过程(或叫窗口过程)进行处理。由于C++给我们在程序设计中带来更多的灵活性(如继承、重载、多态等),所以我们都希望能够使用C++的类来封装Windows中的窗口过程函数,但是Windows规定了窗口过程函数必须定义为一个全局函数,也就是说需要使用面向过程的方法来实现,为了使用...

weixin_34355559的博客 259

一种实现Win32消息处理处理函数的新方法 - 基于Thunk实现的类成员消息处理函数

<br />转自:http://blog.csdn.net/JerKii/archive/2006/04/07/654188.aspx<br />一种实现Win32窗口过程函数(Window Procedure)的新方法<br />基于Thunk实现的类成员消息处理函数<br />JERKII.SHANG (JERKII@HOTMAIL.COM)<br />MAR.10th - 31st, 2006<br />Windows是一个消息驱动的操作系统,在系统中发生的所有消息均需要通过消息处理过程(或叫窗口过程

趁着年轻,希望我们不会让自己失望 1581
上一篇: VMware Linux RedHat 9.0 tftp server配置(修改)
下一篇: C/C++ call stack traces
maplewasp
博客等级 码龄22年 22粉丝 17原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值