逆向工程原理L2 内存分布与函数调用-程序员宅基地

技术标签: 网络安全  

逆向工程原理 L2 编译与二进制文件 I

前言

基于ARM汇编代码进行讨论

内存访问指令

LDR  	#加载内存
STR		#存入内存

如下示例了无内存偏移、有内存偏移以及有无寄存器值改变(intptr++)的不同情况
请添加图片描述

内存数据对齐

struct
  • 结构体整体对齐整体内最长字长
  • 字段初始地址满足自身对齐要求:如long对齐8字节,short对齐2字节

例如

struct{
    
	char a;
	short b;
	long c; 
}

假如结构体起始地址为0x0,a大小是1字节,所以a与1字节位置对齐,所以a存放在0x0;
同理,b与2字节位置对齐,所以其起始位置为0x2,注意a与b中间有1字节的空白;c与8字节位置对齐,所以其起始位置为0x8,注意b与c中间有4字节的空白;
最后,整体(结构体)与结构中最长的字长对齐,即8字节,所以结构体的长度为16字节
在这里插入图片描述

Union
  • 联合的大小为其最长字段大小

虚函数

形式:

virtual int fun(){
    return 0;}

特点:虚函数是可继承的,并且在子类中可以重载

虚函数表
特点
  • 每个实例化对象都持有一个独有的虚函数表(vtable)
  • 虚函数表是类的实例共享的
无继承的类
  • 虚函数表指针在对象内存开头一字长的位置
  • 成员变量内存布局与struct相同
    在这里插入图片描述
单继承的类
  • 从父类中继承的函数在前(有重载则为重载函数),子类新定义的虚函数在后
  • 从父类继承的成员变量在虚函数表指针后,在子类成员变量之前
    在这里插入图片描述
多继承的类
  • 按照继承顺序排布虚函数表和成员变量
  • 在所有父类数据之后存放子类成员变量
  • 子类新定义的虚函数被存放在第一个虚函数表中的最后位置请添加图片描述
RTTI机制

RTTI(Run Time Type Information)
使用typeid运算符来在运行时获取对象类型

type_info信息

可以辅助识别类的结构信息和继承关系
在这里插入图片描述

分支语句的机器级表示

跳转语句
B.cond label
BR/BLR Xm			#跳转到寄存器存储的地址

BL <address>		#函数调用,将next pc保存到LR寄存器
RET(Xm)			   #若未指定Xm,则将PC设置为LR寄存器内存					 储的地址,否则设置为Xm寄存器内的值
CBZ/CBNC X0,label			#判断寄存器是否为0
TBZ/TBNZ W0,#20,label		#寄存器某一位是否为1
跳转表

当switch语句分支过多时,在内存中会以跳转表的形式进行跳转;
跳转表定义在函数主体之外,当要使用时通过不同case产生不同的offset(偏移),以跳转到不同的分支
请添加图片描述

寄存器使用规范

一般寄存器
Register APCS Role
X0 返回值
X0…X7 函数参数
X8 间接结果地址寄存器
X9…X15 调用者保存寄存器
X16,X17(IP0,IP1) 函数内暂存寄存器
X18 平台寄存器
X19…X28 被调用者保存寄存器
X29(FP) 栈帧寄存器
X30(LR) 链接寄存器
SP 栈顶寄存器
浮点寄存器
Register APCS Role
V0 返回值
V0…V7 函数参数寄存器
V8…V15 被调用者保存寄存器
V16…V31 临时寄存器
栈空间使用约定
  • 当前函数栈空间范围由FP、SP规定
  • 函数调用时应当保存FP和LR,并申请函数所用的栈空间

C++函数调用

子类调用父类函数(继承函数)

例如这样的两个类A、B

// test.cpp
class A {
    
public:
	int x;
	A() {
     x = 0; }
	virtual void f() {
     x += 1; }
	virtual void g() {
     x += 2; }
	void h() {
     x += 3; }
} ;
class B: public A {
    
public:
	void f() {
     x += 5; }
};
int main() {
    
	B* b = new B();
	b->h();//调用
	return 0;
}
  • 需要将当前对象的地址放到第一个参数寄存器,即
    this->func(XXX)的调用实现实际上是func(this,xxx)

调用过程

ldr X0,[sp,40]	#X0存放对象地址
bl _ZN1A1hEv	#调用A类的h方法

C++ 命名方法

原因:C++支持函数重载,所以相同的函数名可能代表不同的方法

普通函数命名

1._Z4funci
2._Z4funcid

int func(int i){}		//1.
double func(int i,double d){}	//2.
  • _Z为GCC标准前缀,4代表该函数名有4个字符
  • i代表函数参数类型为int,f和d分别代表参数类型为float和double
  • 函数的返回值类型并没有体现在函数名中
复杂函数命名

复杂函数:命名空间内的函数或成员函数
1._ZN3Foo3barEv
2._ZN3Foo3barEd<

class Foo {
    
public:
	int bar() const {
    	//1.
	return 123;
	}
int bar(double x) {
    		//2.
	return x;
	}
};
  • _Z为GCC标准前缀,3代表该函数名有3个字符
  • N代表复杂函数命名,E标志复杂函数命名结束
  • 3Foo对应为Foo::
C++调用C函数

C函数中没有C++这种重载命名方法,所以C++调用C函数会出现找不到函数的问题

解决方法

使用extern "C"来在C++代码声明C
在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/2301_77729899/article/details/136501502

智能推荐

图像处理——过程全解析,配图超详细!-程序员宅基地

文章浏览阅读1.4k次。点击上方“小白学视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达摘自先进测控之家《长着眼睛的机械手》课题摘要——利用图像处理技术,在50*50CM的区域内识别出5枚硬币(硬币位置任意),并且控制机械手逐一拾取5枚硬币,然后把5枚硬币逐一叠放到指定位置(指定位置随机)。图像处理过程详解——LabVIEWVision Assistant硬币位置识别算法分析与设计硬币的识别是本系统软件设计最为关..._图像处理

[ MATLAB ] 傅里叶变换(三):傅里叶变换_傅里叶变换可视化,plot3函数,matlab-程序员宅基地

文章浏览阅读774次,点赞35次,收藏25次。专题的前两篇文章([ MATLAB ] 傅里叶变换(二):傅里叶级数(复指数表示)),我们讨论了连续周期信号傅里叶级数的两种表示形式,初步建立了频谱的概念。然而,就实际经验而言,非周期信号才是主流。因此,这篇文章将讨论非周期连续信号的谱密度(通常简称为频谱),即大名鼎鼎的傅里叶变换FT,并用Matlab仿真加强理解。可以采用物理中的密度的方式类比谱密度的概念,从而理解傅里叶变换中谱密度的意义。不需要再执着于分量幅值的绝对大小,而是聚焦于相对大小。_傅里叶变换可视化,plot3函数,matlab

5G手机回归,鸿蒙份额激增,将进一步夯实三大操作系统的地位-程序员宅基地

文章浏览阅读360次,点赞8次,收藏8次。市调机构给出的数据指11月份华为手机在国内手机市场的份额达到14%,远超此前鸿蒙系统在国内手机操作系统8%的市场份额,这意味着随着华为5G手机的回归,鸿蒙系统的市占率将快速上涨。此前鸿蒙系统主要依靠华为手机的存量用户支持,在华为的推动下,诸多华为存量手机用户都转为了鸿蒙系统,这成为鸿蒙系统的第一批种子。随后华为在自己的穿戴设备、汽车等诸多产品上发展鸿蒙系统,还通过与美的等国内家电企业合作推广鸿蒙系...

openstack pike单机一键安装shell的方法(后期会转为python)-程序员宅基地

文章浏览阅读183次,点赞9次,收藏2次。#VM虚拟机8G内存,安装完毕,半个小时左右#在线安装#环境 centos 7.4.1708 x86_64#在线安装openstack pikePS: 排版问题,还在研究。wangleideMacBook-Pro:Downloads wanglei$ cat pike.install.sh#!/bin/sh# openstack pike 单机 一键安装# 环..._ali-pike.repo

通过formData数据发送ajax请求-程序员宅基地

文章浏览阅读1.9k次。formData1.创建一个formData对象var fd = new FormData(‘form表单’);(创建formdtata对象的小括号里面,就是需要一个form表单dom对象)。2.往fd对象中添加对象fd.append(‘sex’,‘男’);3.formData里面就会有form表单中 有name属性的这些标签的取值。//键值对形式console.log(fd.ge...

监控神器Prometheus,开箱即用!-程序员宅基地

文章浏览阅读244次。文章来源:【公众号:云加社区】‍目录简介整体生态工作原理Metric 指标PromQLGrafana 可视化监控告警简介Prometheus 是一个开源的完整监控解决方案,本文将从指标抓取到查询及可视化展示,以及最后的监控告警,对 Prometheus 做一个基本的认识。Prometheus 是古希腊神话里泰坦族的一名神明,名字的意思是“先见之明”,下图中是 Promet..._dtm prometheus

随便推点

前端数据可视化ECharts使用指南——制作时间序列数据的可视化曲线_echarts 时间序列-程序员宅基地

文章浏览阅读3.7k次,点赞6次,收藏9次。我为什么选择ECharts ? 本周学校课程设计,原本随机佛系选了一个51单片机来做音乐播放器,结果在粗略玩了CN-DBpedia两天后才回过神,课设还没有开始整。于是懒癌发作,碍于身上还有比赛的作品没交,本菜鸡对硬件也没啥天赋,所以就直接把题目切换成软件方面的题目。写python的同学选择了一个时间序列数据的可视化曲线程序设计题目,果真python在数据可视化这一点性能很优秀。..._echarts 时间序列

ApplicationEventPublisherAware事件发布-程序员宅基地

文章浏览阅读1.6k次。事件类:/** * *   * @className: EarlyWarnPublishEvent *   * @description:数据风险预警发布事件 *   * @param: *   * @return: *   * @throws: *   * @author: lizz *   * @date: 2020/05/06 15:31 * */public cl..._applicationeventpublisheraware

自定义View实现仿朋友圈的图片查看器,缩放、双击、移动、回弹、下滑退出及动画等_imageview图片边界回弹-程序员宅基地

文章浏览阅读1.2k次。如需转载请注明出处!点击小图片转到图片查看的页面在Android开发中很常用到,抱着学习和分享的心态,在这里写下自己自定义的一个ImageView,可以实现类似微信朋友圈中查看图片的功能和效果。主要功能需求:1.缩放限制:自由缩放,有最大和最小的缩放限制 2居中显示:.若图片没充满整个ImageView,则缩放过程将图片居中 3.双击缩放:根据当前缩放的状态,双击放大两倍或缩小到原来 4.单指_imageview图片边界回弹

PreScan第二课:构建实验_prescan坐标系-程序员宅基地

文章浏览阅读5.5k次,点赞8次,收藏37次。为了自己和他人学习的需要,建了一个PreScan的QQ群:613469333(已满)/ 778225322(可加),加群前请私聊群主(QQ:2059799865)加入。群管理需要花费时间和精力,为了鼓励管理员和群成员积极互动,入群需交¥9.99的群费。目录1 Conventions坐标系统2 Roads3 Path&trajectories路径和轨迹3.1 Pat..._prescan坐标系

三分钟带你掌握 CSS3 的新属性_采用css转换,边框阴影等新特性完成css3偏光图像画廊设计-程序员宅基地

文章浏览阅读3.8w次,点赞9次,收藏10次。1. css3简介CSS 用于控制网页的样式和布局,CSS3 是最新的CSS标准,CSS3 完全向后兼容,因此您不必改变现有的设计。浏览器通常支持 CSS2,但是现在大部分浏览器也实现了css3的很多特性。CSS3 被划分为模块。其中最重要的 CSS3 模块包括:选择器框模型背景和边框文本效果2D/3D 转换动画多列布局用户界面2. css3边框2.1 边框圆角Internet Explorer 9+ 支持 border-radius 和 box-shadow 属性。Fir_采用css转换,边框阴影等新特性完成css3偏光图像画廊设计

设计模式--组合模式-程序员宅基地

文章浏览阅读47次。定义:允许将对象组成树形结构来表现 “整体/部分” 层次结构。组合能让客户以一致的方式处理个别对象及对象组合。说白了,就是类似于树形结构。 只是它要求子节点和父节点都具备统一的接口。类图如下:示例如下:比如我们常见的电脑上的目录,目录下面有文件夹,也有文件,然后文件夹里面还有文件及文件夹。这样一层层形成了树形结构。示例代码如下:#include <iostream>#include <stdio.h>#include "string"#includ..

推荐文章

热门文章

相关标签