c++反汇编与逆向分析技术揭秘_C++反汇编与逆向分析技术揭秘
一、单类继承
- 在父类中声明为私有的成员,子类对象无法直接访问,但是在子类对象的内存结构中,父类私有的成员数据依然存在。C++语法规定的访问限制仅限于编译层面,在编译过程中进行语法检查,因此访问控制不会影响对象的内存结构。
- 子类未提供构造函数或析构函数,而父类却需要构造函数与析构函数时,编译器会为子类提供默认的构造函数与析构函数。但是子类有构造函数,而父类不存在构造函数,且没有虚函数,则编译器不会为父类提供默认的构造函数。1. 内存结构:
①先安排父类的数据
②后安排子类新定义的数据说明:基于上述的内存排列方法,即父类数据成员被安排前面。不管是父类的对象,还是子类的对象,父类的数据成员在内存中相对于对象的首地址的偏移值都是一样的。而且成员数据访问都是基于this指针间接寻址的。所以,对于子类对象而言,使用父类指针或者子类指针都可以正确访问其父类数据。2. 虚表:
虚表的排列顺序是按虚函数在类继承层次中首次声明的顺序依次排列的。只要继承了父类,其派生类的虚函数表中的父类部分的排列就与父类一样。子类新定义的虚函数会按照声明顺序紧跟其后。 3. 构造函数:
①先调用父类构造函数
②然后按照声明顺序调用成员数据变量的构造函数和初始化列表中指定的成员
③最后再执行子类构造函数的函数体。说明:
①父类构造函数,虚表指针修改为指向父类的虚表,所以在父类构造函数内调用虚函数,调用的是父类的虚函数。
②子类构造函数,虚表指针修改为指向子类的虚表4. 析构函数:
①先调用子类析造函数
②然后成员对象的析构函数,按照声明的顺序以倒序方式依次调用成员对象的析构函数。
③再执行父类构造函数说明: - 析构函数执行会首先设置虚表指针为自身虚表,再调用自身的析构函数。防止父类析构函数内调用子类对象的虚函数。
- 类有派生与继承关系,需要声明析构函数为虚函数。若析构函数不是虚函数时,当使用父类指针指向堆中的子类对象,并使用delete释放对象空间时,编译器会按照指针类型调用父类的析构函数,从而引发错误。
识别类之间的关系:
先定位构造函数,根据构造先后顺序得到与之相关的其他类。
再根据虚表,利用IDA中使用引用参考功能可得到所有的构造和析构函数。
二、多重继承1. 内存排列:
- 数据成员的排列顺序由继承父类的先后顺序所决定,从左向右依次排列。
- 子类虚表指针的个数取决于所继承的父类的个数,有几个父类便对应几个虚表指针(虚基类除外)。
- 将一个子类对象赋值给某个父类指针时,该父类指针便指向该父类所对应的虚表指针。
三、单类继承与多重继承比较:
- 单继承类
- 在类对象占用的内存空间中,只保存一份虚表指针
- 只有一个虚表指针,对应的也只有一个虚表
- 虚表中各项保存了类中各虚函数的首地址
- 构造时先构造父类,再构造自身,并且只调用一次父类构造函数
- 析构时限析构自身,再析构父类,并且只调用一次父类析构函数
- 多重继承类
- 在类中所占用的内存空间中,根据继承父类的个数保存对应的虚表指针
- 根据所保存的虚表指针的个数,对应产生相应个数的虚表。
- 转换父类指针时,需要跳转到对象的首地址。
- 构造时需要按照继承顺序调用多个父类构造函数。
- 析构时先析构自身,然后以与构造函数相反的顺序调用所有父类的析构函数
- 当对象作为成员时,整个类对象的内存结构和多重继承相似。当类中无虚函数时,整个类对象内存结构和多重继承完全一样,可酌情还原;当父类或成员对象存在虚函数时,通过过观察虚表指针的位置和构造函数、析构函数中填写虚表指针的数目及目标地址,来还原继承或成员关系。
四、工程案例分析
1. 单类继承:
#include <iostream>
using namespace std;
class Base {
public:
Base(){ nBase= 1;printf("CBase"); }
~Base(){ printf("~CBase"); }
virtual void f() { printf("Base:f()");}
virtual void g() { printf("Base:g()");}
private:
int nBase;
};
class Derive : public Base {
public:
Derive(){ nDerive=2;printf("Derive"); }
~Derive(){ printf("~Derive"); }
virtual void g(){ printf("Dervie:g()");}
virtual void h(){ printf("Dervie:h()");}
private:
int nDerive;
};
int main()
{
Derive d;
Base *b = &d;
b->g();
return 0;
}
1. 内存分布
类Derive对象
0019FD30 0139583C =>.rdata:const Derive::`vftable'
0019FD34 00000001 =>Base.nBase
0019FD38 00000002 =>Derive.nDerive
虚函数表
0139583C 01391163 Base::f(void)
01395840 0139110E Derive::g(void)
01395844 013911AE Derive::h(void)
2. 构造函数
pop ecx ;=>this指针出栈
mov [ebp+this], ecx ;=>保存this指针
mov ecx, [ebp+this]
call j_??0Base@@QAE@XZ ;=>调用基类构造函数Base::Base(void)
mov eax, [ebp+this] ;=>eax=this指针
mov dword ptr [eax], offset ??_7Derive@@6B@ ;=>初始化虚表指针为const Derive::`vftable'
3. 析构函数
pop ecx ;=>this指针出栈
mov [ebp+this], ecx ;=>保存this指针
mov eax, [ebp+this]
mov dword ptr [eax], offset ??_7Derive@@6B@ ;=>重置虚表指针为const Derive::`vftable'
mov esi, esp
push offset aDerive ; "~Derive"
call ds:__imp__printf
add esp, 4
cmp esi, esp
call j___RTC_CheckEsp
mov ecx, [ebp+this] ;=>ecx传参this指针
call j_??1Base@@QAE@XZ ; =>调用基类析构函数 Base::~Base(void)
c++反汇编与逆向分析技术揭秘_C++反汇编与逆向分析技术揭秘相关推荐
- CTF--信息技术对抗赛ISCC之安卓逆向分析
0x01 题目介绍 本题目是一道信息安全大赛上的安卓逆向题目,主要考察选手,逆向分析能力, 反汇编能力,安卓程序结构分析能力,以及常见的安全加密编码算法得能力.题 目下载 http://downloa ...
- [安全攻防进阶篇] 二.如何学好逆向分析、逆向路线推荐及吕布传游戏逆向案例
从2019年7月开始,我来到了一个陌生的专业--网络空间安全.初入安全领域,是非常痛苦和难受的,要学的东西太多.涉及面太广,但好在自己通过分享100篇"网络安全自学"系列文章,艰难 ...
- [安全攻防进阶篇] 一.什么是逆向分析、逆向分析应用及经典扫雷游戏逆向
从2019年7月开始,我来到了一个陌生的专业--网络空间安全.初入安全领域,是非常痛苦和难受的,要学的东西太多.涉及面太广,但好在自己通过分享100篇"网络安全自学"系列文章,艰难 ...
- 图形测试分析毫无头绪?HarmonyOS图形栈测试技术帮你解决
作者:huangran,图形图像技术专家 应用开发以后无法知道性能瓶颈的根因是什么?滑动卡顿.白块产生的原因是什么?代码写完之后,不知道如何优化让它表现地更好-- 我们发现,如今测试人员的需求已经不只 ...
- 恶意软件分析诀窍与工具箱——对抗“流氓”软件的技术与利器
为什么80%的码农都做不了架构师?>>> 基本信息 作者: (美)Michael Hale Ligh Steven Adair Blake Hartstein ...
- 康复治疗学可以考计算机吗,【大揭秘】2018“人机对话”康复医学治疗技术专业技术资格考试...
原标题:[大揭秘]2018"人机对话"康复医学治疗技术专业技术资格考试 昨天,关于"2018年康复医学治疗技术专业技术资格考试采用人机对话考试方式"的通知一经发 ...
- 揭秘高效协作工具背后的技术架构
揭秘高效协作工具背后的技术架构 发表于2015-12-08 10:50| 1731次阅读| 来源CSDN| 4 条评论| 作者蒲婧 CTOCTO俱乐部CTO讲堂管理实践团队协作Worktile wid ...
- 【技术】DTEmpower核心功能技术揭秘(4)- MDI/MDA特征选择技术
概述 "DTEmpower核心功能技术揭秘"系列文章分享了天洑软件多年来工业数据实战所遇到的难题挑战和针对性的技术解决方案,如HierarchicalStratify分层分类技术 ...
- 2019-2020-2 20175227张雪莹《网络对抗技术》 Exp1 PC平台逆向破解
2019-2020-2 20175227张雪莹<网络对抗技术> Exp1 PC平台逆向破解 目录 0. 实验目标 1. 实验内容 1.1 直接修改程序机器指令,改变程序执行流程 1.2 通 ...
最新文章
- TYVJ P1080 N皇后 Label:dfs PS:以前做的一道题,贴出来防忘
- linux并发控制之原子操作
- [云炬ThinkPython阅读笔记]2.7 注释
- Spring AOP capabilities and goals
- java面试四 运算符测试
- 致我们终将逝去的39%“峰值性能”!
- 如何批量更改Mac视频帧速率
- python北风网培训班视频
- 用c++编写的植物大战僵尸
- 微信小程序---点餐小程序左侧滑动菜单实现
- 外包公司是做什么的?
- C -- OC with RunTime
- AI岗位平均月薪2.58w,如何抓住这波人才红利?
- webpack和脚手架
- QQ空间代码. 教你如何快捷的把空间弄的超漂亮
- 《互联网+流通——F2R助力传统产业创新与转型》一一1.1 “互联网+”的本质、演进与发展趋势...
- 暗猝灭剂BHQ-2 氨基,BHQ-2 amine,CAS:1241962-11-7
- SpringCloud GateWay 万字详解
- C51学习笔记:基于STC89C52的超声波测距与LCD1602显示
- 开发要不要做测试,怎么做?
热门文章
- 轻松上手系列教程java_小白也能轻松上手的Prometheus教程
- 深度学习之基于AlexNet实现猫狗大战
- python 字典 内存_Python 字典(联合内存、联合数组)
- 【计算机组成原理】补码的加减运算方法
- opencv java库_【OpenCV】java资源
- jmeter 循环使用csv数据_如何通过jmeter读取csv文件行数来设置循环控制器的总数...
- USACO 2.1 海明码 Hamming Codes (模拟+位运算+黑科技__builtin_popcount(n))
- 《TCP/IP详解》笔记----第二章 链路层
- 最容易被忽视的学习材料--技术标准 (z)
- Socket 编程 windows到Linux代码移植遇到的问题