C++反汇编-结构体和类
学无止尽,积土成山,积水成渊-《C++反汇编与逆向分析技术揭秘》 读书笔记
对象的内存布局
一般计算公式:
- 空类:空类的长度为1字节,如果不占用字节的话,this指针会悬空。考虑到类可以仅有成员函数,没有数据成员。
- 内存对齐:在VC中,类和结构体中的数据成员是根据在类或结构中出现的顺序来依次申请空间的,由于内存对齐原因,可能不会连续的排列,数据成员之间可能有间隙。
- 静态变量:与静态全局变量类似,存在的位置和全局变量一致,只是编译器增加了作用域的检查,作用域之外不可见。
访问对象中的数据成员时,一般采用寄存器间接相对寻址,表达式esp±n±offset,或ebp±n±offset(其中esp±n或ebp±n是对象的首地址,offset 为数据成员相对对象首地址的偏移)。由于n和offset在编译阶段时属于常量,采用编译器优化时,表达式可能简化为 ebp±n 或 esp±n。
this指针
- thiscall并不属于关键字,是C++成员函数特有的调用方式。
- thiscall的参数压栈顺序也是从右至左
- thiscall的栈平衡方式与_stdcall相同,由被调用方平衡。
- 并不是所有的this指针的传递都是通过寄存器ECX,可以强制改用其他调用方式(_如stdcall)
class CTest { public: void __stdcall SetNumber(int nNumber){ m_nInt = nNumber; } int nNumber; }
lea ecx, [mem] ;取对象地址 call FUN_ADDRESS ;调用成员函数
函数内部:
mov XXX, ecx ;发现函数内使用ecx中的数据,证明确是通过ecx来传递参数 mov [reg + ], XXX
静态数据成员
- 静态数据成员是常量地址,而普通数据成员一般存储在栈空间。
- 静态成员通过立即数间接寻址访问,而普通数据成员一般通过寄存器相对间接寻址访问。
- 静态成员访问时不需要this指针,而普通数据成员访问时需要使用this指针。
对象作为函数参数
1 class CReturn{ 2 public: 3 int m_nNumber; 4 in m_nArry[]; 5 }; 6 CReturn GetCReturn() 7 { 8 CReturn RetObj; 9 RetObj.m_nNumber = ; for(int i=; i< ; i++) { RetObj.m_nArry[i] = i + ; } return RetObj; } void main(int argc, char *argv[]) { CReturn objA; objA = GetCReturn(); printf("%d %d %d", objA.m_nNumber, objA.m_nArry[], objA.m_nArry[]); }
C++反汇编-结构体和类的更多相关文章
- (五)羽夏看C语言——结构体与类
写在前面 由于此系列是本人一个字一个字码出来的,包括示例和实验截图.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇 ...
- C#中结构体和类的区别
结构体和类同样能够定义字段,方法和构造函数,都能实例化对象,这样看来结构体和类的功能好像是一样的了,但是他们在数据的存储上是不一样的 C#结构体和类的区别问题:这两种数据类型的本质区别主要是各自指向的 ...
- Swift结构体与类
在面向过程的编程语言(如C语言)中,结构体用得比较多,但是面向对象之后,如在C++和Objective-C中,结构体已经很少使用了.这是因为结构体能够做的事情,类完全可以取而代之.而Swift语言却非 ...
- C C++ 中结构体与类
先来说说C和C++中结构体的不同 a) C语言中的结构体不能为空,否则会报错 1>d:\myproject\visual studio 2013\projects\myc++\main.c(71 ...
- 浅析C#中的结构体和类
类和结构是 .NET Framework 中的常规类型系统的两种基本构造. 两者在本质上都属于数据结构.封装着一组总体作为一个逻辑单位的数据和行为. 数据和行为是该类或结构的"成员" ...
- 10 结构体和类 - —— 《Swift3.0 从入门到出家》
Swift中的面向对象5个要素:枚举.结构体.类.协议.扩展 面向对象研究的是对象,完成一件事情需要多个对象参与,是生活的映射 Swift中结构体和类非常相似,也就是结构体能完成类的所有功能.结构体是 ...
- C++中 结构体和类的异同
在C++中,结构体是一种特殊形态的类. 结构体和类的唯一区别就是: 结构体和类具有不同的默认访问控制属性. 类中,对于未指定访问控制属性的成员,其访问控制属性为私有类型(private) 结构体中, ...
- 介绍C#结构体与类区别
1. 结构体与类定义方式 结构体定义使用struct类定义使用class 结构体: struct testDemo{ int num; void action(){ } } 类: class test ...
- C#中结构体与类的区别
一.结构体和类非常相似 1,定义和使用非常相似,例子如下:public struct Student{ string Name; int Age;}public class Questio ...
随机推荐
- [HBase]mem store flusher 流程
- csslint在前端项目中的使用
大家都听说过jslint,eslint,不过你可能没见过csslint,你可能会问csslint有什么用,为什么今天要说csslint,是因为我在开发中遇到一个坑,其实之前不怎么使用csslint的, ...
- ASP .Net Core系统部署到Ubuntu 16.04 具体方案
.Net Core 部署到Ubuntu 16.04 中的步骤 1.安装工具 1.apache 2..Net Core(dotnet-sdk-2.0) 3.Supervisor(进程管理工具,目的是服务 ...
- java基础56 HTML5的标签知识(网页知识)
本文知识点(目录): 1.html常用标签 2.html实体标签 3.html媒体标签 4.html超链接标签 5.html图片标签 6.html标个标签 7.html框 ...
- GreenPlum学习笔记:split_part与string_to_array字符截取
偶遇一个需求:想按某个指定符号分割之后,提取字符. 例如:tag = '休闲,娱乐,运动,玩耍',想提取"休闲"这个词. 方法一:string_to_array select st ...
- linux c获取本地时间
在标准C/C++中,我们可通过tm结构来获得日期和时间,tm结构在time.h中的定义如下: #ifndef _TM_DEFINED struct tm { int tm_sec; /* 秒–取值区间 ...
- 虚拟机的安装以及Linux的学习
安装虚拟机 对虚拟机的认识 其实初中的时候我就听说过虚拟机这个名词,当时的我还小,也不知道虚拟机是个什么东西,那时我傻傻的认为虚拟机只不过是电脑中的一个虚拟的计算机,没有什么实在的作用.后来随着大学课 ...
- sublime text配置make工具
sublime text配置make工具 Linux下许多项目是用makefile来管理的,是用gcc+make等方式来编译和运行. 在只有tty的场合或年代,使用vim或emacs是不二选择:但在L ...
- hiho 1227 找到一个恰好包含n个点的圆 (2015北京网赛 A题)
平面上有m个点,要从这m个点当中找出n个点,使得包含这n个点的圆的半径(圆心为n个点当中的某一点且半径为整数)最小,同时保证圆周上没有点. n > m 时要输出-1 样例输入43 2 0 0 1 ...
- AndroidStudio3.0到3.1遇到的坑
原文:https://blog.csdn.net/qq_36676433/article/details/80361064 本以为3.0到3.1仅仅是界面的优化,万万没想到的是这个坑比起2.0到3.0 ...