逆向实用干货分享,Hook技术第二讲,之虚表HOOK
逆向实用干货分享,Hook技术第二讲,之虚表HOOK
正好昨天讲到认识C++中虚表指针,以及虚表位置在反汇编中的表达方式,这里就说一下我们的新技术,虚表HOOK
昨天的博客链接: http://www.cnblogs.com/iBinary/p/8001749.html
PS: 今天所讲内容和昨天没有管理,不过理解了昨天的帖子结合今天的知识,你就可以找东西练手了,比如你可以结合的知识,随便找一款C++写的游戏,将它的虚表HOOK了,这样你想干啥就干啥 ^_^
一丶认识虚表指针以及虚表
讲解之前我们要认识一下类在内存中的表现形式,以及认识虚表指针.
1.首先我们知道,当类中有虚函数的时候,则会生成虚表指针,虚表指针指向了虚表,虚表中保存的则是当前类中所有虚函数的函数地址.
内存结构图:
第一个是类的内存结构,第二个是虚表.
那么我们就有想法了,当我们调用虚函数的时候,会通过虚表指针,找到虚表,而后找到虚函数地址
那么现在我们是否可以将虚函数的地址改为我们的函数地址.
聪明: 其实就是很简单,理解了内存结构,理解了虚表指针,虚表那么就可以进行操作了.
我们只需要将虚表中的虚函数地址更改成我们的即可.
上面都是原理,下面说一下步骤
总共分为三个步骤 1.获得虚表指针 2.修改虚表的内存保护属性 3.修改虚表中的虚函数地址为我们的函数地址. 很简单三步
高级代码:
#include "stdafx.h" #include <windows.h> class MyTest { public: MyTest(); ~MyTest(); void print(); virtual void ShowHelloWorld(); int m_Number; }; MyTest::MyTest() { printf("MyTest::MyTest()\r\n"); } MyTest::~MyTest() { printf("MyTest::~MyTest()\r\n"); } void MyTest::ShowHelloWorld() { printf("Hello World!\n"); } void ShowData() //我们将虚表中的函数地址换为我们的函数地址 { printf("有木有被坑的感觉\r\n"); } void MyTest::print() { printf("void MyTest::print()\r\n"); } int main(int argc, char* argv[]) { MyTest test; MyTest &obj = test; //可以虚调用 int DwAddress = *(int *)&test; //第一步,获取自己的虚表指针 obj.ShowHelloWorld(); //虚函数调用,测试作用 DWORD dwOld = 0; //第二步修改虚表指针的内存保护属性,下方更改虚表 VirtualProtect((void *)DwAddress,0x1000,PAGE_EXECUTE_READWRITE,&dwOld);//修改内存保护属性,其地址是虚表指针地址 (*(int *)DwAddress) = (int)ShowData;//第三步,HOOK,也就是将我们的函数地址,写入到虚表中. obj.ShowHelloWorld(); //重新调用,看看是否被HOOK return 0; }
上面代码可以直接拷贝粘贴, VS2013测试成功.
贴上测试图:
这里只是简单的HOOK了一下自己类的虚表,你可以通过自己的分析,找到别的进程中的虚表,然后更改.
当然这个HOOK很简单,也有自己的适用场合,俗话说,各种HOOK,注入等等一系列的操作,都在最适合自己的场合能发挥出最大的作用.
作者:IBinary
坚持两字,简单,轻便,但是真正的执行起来确实需要很长很长时间.当你把坚持两字当做你要走的路,那么你总会成功. 想学习,有问题请加群.群号:725864912(收费)群名称: 逆向学习小分队 群里有大量学习资源. 以及定期直播答疑.有一个良好的学习氛围. 涉及到外挂反外挂病毒 司法取证加解密 驱动过保护 VT 等技术,期待你的进入。
详情请点击链接查看置顶博客 https://www.cnblogs.com/iBinary/p/7572603.html
本文来自博客园,作者:iBinary,未经允许禁止转载 转载前可联系本人.对于爬虫人员来说如果发现保留起诉权力.https://www.cnblogs.com/iBinary/p/8012394.html
欢迎大家关注我的微信公众号.不定期的更新文章.更新技术. 关注公众号后请大家养成 不白嫖的习惯.欢迎大家赞赏. 也希望在看完公众号文章之后 不忘 点击 收藏 转发 以及点击在看功能. QQ群: