c++逆向分析----返回对象
对象不使用默认析构函数
class Test
{
public:
char cNum1;
int iNum2;
int* pInt;
};
Test _ReturnObject()
{
Test stLocalObject;
stLocalObject.cNum1 = 0;
stLocalObject.iNum2 = 1;
stLocalObject.pInt = new int;
*stLocalObject.pInt = 0x55;
return stLocalObject;
}
int main(int argc, char* argv[])
{
Test stObject;
stObject = _ReturnObject();
return 0;
}
分析以上代码的反汇编代码,发现编译器并没有调用析构函数。其会将_ReturnObject()函数内的局部对象先保存到main函数的栈空间中(实际是在函数内部调用了拷贝构造函数,进行了对象的复制),返回值eax为其首地址,接着会将保存在此处的对象复制到另一处栈空间中,接着利用此栈空间对接收返回对象的实际对象赋值。

我们产生疑问!既然eax地址处和从eax复制的另一处栈地址处都保存着返回对象的数据,是否两处地址都可以认为是实际的对象。如果其是实际的对象那么其一定会再生命周期快结束时调用析构函数,因为这里编译器没有调用默认的析构函数所以我们无法判断,我们下面需要自己指定析构函数来分析。
对象使用析构函数
我们在上述代码的基础上加上自己的析构函数,此析构函数会将对象动态申请的内存释放掉。
~Test()
{
if(pInt != NULL)
delete pInt;
}
我们查看其对应的汇编代码,发现其在对象返回的过程中将对象保存到eax地址后,直接将eax地址对应的对象保存到stObject中,当然这两处的对象也会分别调用析构函数。此eax地址对应的对象被称为临时对象,临时对象的生命周期仅限当前语句,因此当执行完stObject = _ReturnObject();语句后临时对象就会调用析构函数。(我们可以看到在一开始其就会为临时对象在栈中申请内存空间,接着让临时对象的地址作为参数入栈从而在_ReturnObject函数内部对临时对象进行复制)

值得注意的是我们这里的代码是会报错的,因为返回对象在_ReturnObject函数结束时就会调用析构函数将int* pInt对应的内存给撤销了,当eax地址对应的临时对象在调用析构函数是就会报错。(因为我们没有定义拷贝构造函数,所以其在复制对象时使用默认的浅拷贝构造函数)要想避免这样的错误我们需要自己定义拷贝构造函数(深拷贝)。
临时对象
临时对象存在是为了可以使代码编写者像这样_ReturnObject().cNum1在返回对象后直接使用相关数据成员。

不使用临时对象
如果我们用此形式 Test stObject = _ReturnObject(); 直接调用返回对象的函数则会以定义的实际对象的地址为参数而不是以临时对象的地址为参数,从而不使用临时对象。

使用拷贝构造函数
Test(Test& Object)
{
cNum1 = Object.cNum1;
iNum2 = Object.iNum2;
pInt = Object.pInt;
}
我们来给类加上我们的拷贝构造函数,我们发现在_ReturnObject函数结束前会利用调用拷贝构造函数实现将返回对象保存到临时对象下(对象的复制),从而实现“返回对象”。

浅拷贝和深拷贝
浅拷贝和深拷贝主要是针对C++类中存在指针型数据成员而言的。浅拷贝就是单纯的进行成员值的复制,而深拷贝是对指针型变量所指向的内存重新申请新的内存,并将内存中的数据复制过去。上面我们所给出的拷贝构造函数就是一个典型的浅拷贝(默认拷贝构造函数也是浅拷贝)。

c++逆向分析----返回对象的更多相关文章
- HQL查询——查询返回对象类型分析
关于HQL查询,我们可以结合hibernate的API文档,重点围绕org.hibernate.Query接口,分析其方法,此接口的实例对象是通过通过session.对象的creatQuery(Str ...
- C++反汇编与逆向分析技术揭秘
C++反汇编-继承和多重继承 学无止尽,积土成山,积水成渊-<C++反汇编与逆向分析技术揭秘> 读书笔记 一.单类继承 在父类中声明为私有的成员,子类对象无法直接访问,但是在子类对象的 ...
- Android逆向分析(2) APK的打包与安装背后的故事
前言 上一次我们反编译了手Q,并遇到了Apktool反编译直接crash的问题,虽然笔者很想在这次解决这个问题,但在解决途中,发现该保护依赖于很多知识,所以本次先插入一下,正所谓知其然知其所以然,授之 ...
- Android逆向分析(2) APK的打包与安装
http://blog.zhaiyifan.cn/2016/02/13/android-reverse-2/ 2/18日增加对aidl和java编译的描述. 前言 上一次我们反编译了手Q,并遇到了Ap ...
- [Android Security] Smali和逆向分析
copy : https://blog.csdn.net/u012573920/article/details/44034397 1.Smali简介 Smali是Dalvik的寄存器语言,它与Java ...
- RE-1 逆向分析基础
逆向分析基础 0x01-0x0C 本笔记使用汇编指令为x86架构下汇编指令,ARM架构汇编指令不做介绍 0x01. 关于RE 逆向工程(Reverse Engineering RE) 逆向分析方法: ...
- 《C++反汇编与逆向分析技术揭秘》--认识启动函数,找到用户入口
<C++反汇编与逆向分析>和<程序员的自我修养>都是以VC6的代码作为例子讲解的.这里是在vs2017下,CRT代码有些区别,但整体流程上都是初始化环境,设置参数,最后转到用户 ...
- 病毒木马查杀实战第012篇:QQ盗号木马之逆向分析
前言 在本系列的文章中,对每一个病毒分析的最后一个部分,若无特殊情况,我都会采用逆向分析的手段来为读者彻底剖析目标病毒.但是之前的"熊猫烧香"病毒,我用了三篇文章的篇幅(每篇250 ...
- 【C++】从零开始的CS:GO逆向分析3——写出一个透视
[C++]从零开始的CS:GO逆向分析3--写出一个透视 本篇内容包括: 1. 透视实现的方法介绍 2. 通过进程名获取进程id和进程句柄 3. 通过进程id获取进程中的模块信息(模块大小,模块地址, ...
随机推荐
- Fishing Master HDU - 6709
题目链接:https://vjudge.net/problem/HDU-6709 题意:给出n条鱼的抓捕时间k和煮鱼时间a[i],你要在最短时间把所有鱼都煮了.(注意你只有一口锅) 思路:首先我们必须 ...
- codefoces B - Phoenix and Beauty
原题链接:https://codeforc.es/problemset/problem/1348/B 题意:告诉我们一个数组及其长度和k,判断是否可以构造一个新数组使得每K段长度和都相等. 思路:首先 ...
- 【PAT甲级】1119 Pre- and Post-order Traversals(前序后序转中序)
[题目链接] [题意] 根据二叉树的前序和后序序列,如果中序序列唯一,输出Yes,如果不唯一输出No,并输出这个中序序列. [题解] 众所周知,二叉树是不能够根据前序和中序建立的,为什么呢?首先需要明 ...
- OpenCV图像处理中的“机器学习"技术的使用
注意,本文中所指"机器学习"(ML)技术,特指SVM.随机森林等"传统"技术. 一.应用场景 相比较当下发展迅速的各路"端到端" ...
- Spring笔记(三)
Spring AOP 一.AOP(概念) 1. 什么是AOP 面向切面编程(方面),利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各个部分之间的耦合度降低,提高程序的可重用性,同时提高了 ...
- Kubernetes 部署策略详解-转载学习
Kubernetes 部署策略详解 参考:https://www.qikqiak.com/post/k8s-deployment-strategies/ 在Kubernetes中有几种不同的方式发布应 ...
- java面试一日一题:请讲下对mysql的理解
问题:请讲下对mysql的理解 分析:该问题主要考察对mysql的理解,基本概念及sql的执行流程 回答要点: 主要从以下几点去考虑, 1.mysql的整体架构? 2.mysql中每一个组件的作用? ...
- Vue3.0中引入地图(谷歌+高德+腾讯+百度)
1 概述 项目需求需要引入地图,对于目前最新的Vue3.0,无论是百度/高德/腾讯地图目前还没有适配,只有Vue 2.x版本的: 目前只有谷歌地图的Vue3.0适配: 但是没有适配并不代表不能使用,本 ...
- 通过Fiddler 远程 对 安卓手机 iPhone 苹果手机 访问请求抓包 Android IOS14.4 fiddler代理 无法联网
Fiddler 中的设置 1 查看 Fiddler所在 电脑的内网 ip地址. (cmd > ipconfig 查看本机ipv4地址) 2 Fiddler 设置 允许远程设备连接: Fiddl ...
- Go-15-flag.String 获取系统参数
场景: 启动应用程序时,需要传入系统参数.例如:./start --b /notebook --p true --n 8 package main import ( "fmt" f ...