Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >安卓逆向:老司机带你回顾ARM和C/C++基本结构

安卓逆向:老司机带你回顾ARM和C/C++基本结构

作者头像
小道安全
修改于 2021-01-21 14:13:27
修改于 2021-01-21 14:13:27
1.5K0
举报
文章被收录于专栏:游戏安全攻防游戏安全攻防

引言:这还是一篇比较枯燥的和ARM打交道的文章。不过这也是为了后续能更好进行做so逆向而做铺垫。

Arm C/C++基本结构逆向结构图

掌握ARM汇编中基本结构前需要回顾和并熟记以下的条件指令

在熟悉下另外一个重要的ARM汇编指令:CMP

CMP指令:在汇编中就是将两个寄存器中的值做一个相减,再判断值是否大于0(它会设置对应状态寄存器),它的主要跳转方式与下一条指令相关联的。

进入主题

if...else结构

(注意:if在arm中的展示和源代码的实现是取反的操作)

C/C++代码结构

If...else结构

if(....)

{

.....

}

else if(....)

{

....

}

else

{

...

}

C/C++对应arm汇编结构提炼

判断指令cmp后面的跳转执行指令指向的地址都是往后跳的。

cmp r0,xx(这个xx可以是寄存器,可以是具体数据)

BNE loc_xxx(地址是往下指向)

cmp r0, xx(这个xx可以是寄存器,可以是具体数据)

BNE loc_xxx(地址是往下指向)

C/C++源代码

IDA中if..else结构的流程图

绿色箭头指向表示 : 跳转条件满足时候的走向。

红色箭头指向表示:跳转条件不满足时候的走向。

ARM汇编代码及解释

If...elseif....else 源代码

IDA中if...elseif...else结构的流程图

绿色箭头指向表示 : 跳转条件满足时候的走向。

红色箭头指向表示:跳转条件不满足时候的走向。

ARM汇编代码及解释

for结构

C/C++基本结构

for(int i = 0; i <j; i++)

{

.....

.....

}

for结构对应arm汇编结构提炼

for默认情况下都是从0开始,会先进行判断是否要跳出循环体,接着在执行循环体内容,并且在循环体的尾部+1的向上跳。

mov xx,xx

cmp xx,xx

BLT 地址(跳出整个结束循环体)

loc_xxx

mov xx,xx

add xx,1

BNE loc_xxx(向上跳到前面loc_xxx地址,继续执行循环的内容)

C/C++源代码:

IDA中for结构体的流程图

绿色箭头指向表示 : 跳转条件满足时候的走向。

红色箭头指向表示:跳转条件不满足时候的走向。

ARM汇编代码及解释

C/C++源代码2

IDA中for结构的流程图2

绿色箭头指向表示 : 跳转条件满足时候的走向。

红色箭头指向表示:跳转条件不满足时候的走向。

ARM汇编代码及解释2

while结构

(注意地址往上跳的情况)

C/C++基本结构

while(xxxx)

{

xxxxx

xxxxx

}

while对应arm汇编结构提炼

在arm汇编中for和while结构是一样的,两种没有差别

mov xx,xx

cmp xx,xx

BLT 地址(跳出整个结束循环体)

loc_xxx

mov xx,xx

add xx,1

BNE loc_xxx(向上跳到前面loc_xxx地址,继续执行循环内容)

C/C++源代码

IDA中while的结构流程图

绿色箭头指向表示 : 跳转条件满足时候的走向。

红色箭头指向表示:跳转条件不满足时候的走向。

ARM的汇编代码及解释

do..while结构

C/C++基本结构

do{

xxxxx

xxxxx

xxxxx

}while(xxx);

do...while对应arm汇编结构提炼

mov xx,xx

loc_xxx(循环体开始地址)

mov xx,xx

cmp xx,xx

BLT loc_xxx(向上跳到前面循环体,继续执行循环体内容)

C/C++源代码

IDA中do...while结构的流程图

绿色箭头指向表示 : 跳转条件满足时候的走向。

红色箭头指向表示:跳转条件不满足时候的走向。

ARM汇编代码及解释

Switch结构

C/C++基本结构

switch(xxx)

{

case xx:

xxxxx

xxxxx

break;

case xx:

xxxxx

xxxxx

break;

case xx:

xxxxxx

xxxxx

break;

....

...

default:

xxxx

xxx

break;

}

switch对应arm汇编结构提炼

switch最明显的特征就是存在TBB 后面跟上的是跳转表。

mov xx,xx

cmp xx,xx

BHI loc_xxx(往下跳的地址)

TBB {PC,xx} (TBB关键字)

DCB xxx (跳转表)

DCB xxx

...

....

loc_xxx

xxxx

xxxx

B loc_xxx(结束的地址)

loc_xxx

xxxx

xxxx

B loc_xxx(结束的地址)

loc_xxx

xxxx

xxxx

B loc_xxx(结束的地址)

C/C++源代码

IDA中switch结构的流程图

绿色箭头指向表示 : 跳转条件满足时候的走向。

红色箭头指向表示:跳转条件不满足时候的走向。

ARM汇编代码及解释

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 游戏安全攻防 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Rust语法入门
Rust 是一种系统级编程语言,它的设计目标是提供高性能、安全性和并发性。Rust 的主要优势包括:
码客说
2023/04/17
1.4K0
一网打尽 Rust 语法
大家好,我是「柒八九」。一个「专注于前端开发技术/Rust及AI应用知识分享」的Coder
前端柒八九
2024/04/30
2250
一网打尽 Rust 语法
🌱 Rust内存管理黑魔法:从入门到"放弃"再到真香
内存管理是程序世界的"隐形战场",而 Rust 用一套所有权系统直接重构规则——没有 GC、没有手动 malloc/free,却能在编译期拦截 90% 的内存错误!
Jimaks
2025/04/27
2650
rust闭包(Closure)
闭包在现代化的编程语言中普遍存在。闭包是一种匿名函数,它可以赋值给变量也可以作为参数传递给其它函数,不同于函数的是,它允许捕获调用者作用域中的值。Rust 闭包在形式上借鉴了 Smalltalk 和 Ruby 语言,与函数最大的不同就是它的参数是通过 |parm1| 的形式进行声明,如果是多个参数就 |param1, param2,…|, 下面给出闭包的形式定义:
zy010101
2023/04/27
7480
rust闭包(Closure)
Rust到底值不值得学--Rust对比、特色和理念
其实我一直弄不明白一点,那就是计算机技术的发展,是让这个世界变得简单了,还是变得更复杂了。 当然这只是一个玩笑,可别把这个问题当真。
俺踏月色而来
2019/10/14
2.8K0
Rust闭包的虫洞穿梭
闭包(Closure)的概念由来已久。无论哪种语言,闭包的概念都被以下几个特征共同约束:
袁承兴
2020/09/19
1.4K0
rust 上手很难?搞懂这些知识,前端开发能快速成为 rust 高手
在我的交流群里有许多人在讨论 rust。所以陆续有人开始尝试学习 rust,不过大家的一致共识就是:rust 上手很困难。当然,这样的共识在网上也普遍存在。
用户6901603
2024/03/20
1.6K1
rust 上手很难?搞懂这些知识,前端开发能快速成为 rust 高手
Rust 入门 (Rust Rocks)
做区块链的基本几乎没有人不知道 Rust 这门编程语言,它非常受区块链底层开发人员的青睐。说来也奇怪,Rust 起源于 Mazilla,唯一大规模应用就是 Firefox,作为小众语言却在区块链圈子里火了。这其中应该和以太坊的发起人 Govin Wood 创建的 Parity 项目有关,Parity 是一款用 Rust 编写的以太坊客户端。
lambeta
2019/09/24
2.5K0
Rust学习:如何解读函数签名?
在Rust中,函数签名类似“讲故事”。经验丰富的Rust程序员,只需浏览一个函数的签名,就可以知道该函数大部分的行为。
MikeLoveRust
2019/09/03
2.3K0
Rust入坑指南:智能指针
在了解了Rust中的所有权、所有权借用、生命周期这些概念后,相信各位坑友对Rust已经有了比较深刻的认识了,今天又是一个连环坑,我们一起来把智能指针刨出来,一探究竟。
Jackeyzhe
2020/03/12
9480
rust的高级特性
rust中的表达式是什么{}包围的部分,函数,impl,match里面,if else表达式,通过这些功能分割系统
李子健
2022/05/10
6870
rust的内存管理
内存管理是rust最有意思的事情了。rust的内存管理有三条准则。 let分配资源 分配会转移所有权,比如赋值直接move了 值和变量在作用域末尾会被清理,释放 drop方法会在释放前调用 rust支持移动语义和复制语义,为此抽象出了两个trait,clone和copy 非堆内存可以使用copy,隐式转化,clone需要显示调用 关于借用的规则,使用& 一个引用的生命周期不能超过其被引用的时间 如果存在一个可变借用,不允许存在其他值 如果不存在可变借用,允许存在多个不可变借用 借用规则方法类型 &self
李子健
2022/05/08
8040
【翻译】Rust生命周期常见误区
我曾经有过的所有这些对生命周期的误解,现在有很多初学者也深陷于此。我用到的术语可能不是标准的,所以下面列了一个表格来解释它们的用意。
MikeLoveRust
2020/07/28
1.7K0
听GPT 讲Rust源代码--library/alloc(2)
在Rust源代码中,rust/library/alloc/src/vec/mod.rs这个文件是Rust标准库中的Vec类型的实现文件。Vec是一个动态大小的数组类型,在内存中以连续的方式存储其元素。
fliter
2024/02/26
2560
听GPT 讲Rust源代码--library/alloc(2)
Rust中的关键字
原始标识符(Raw identifiers)允许你使用通常不能使用的关键字,其带有 r# 前缀
fliter
2023/10/05
2740
Rust中的关键字
【Rust】005-Rust 结构体
在Rust中,元组结构体是一种特殊的结构体形式,它结合了元组和结构体的特性。元组结构体类似于普通的结构体,但它没有字段名称,只有字段类型。这种结构体更像是带标签的元组,通常用于需要对某些数据进行简单封装而不需要命名每个字段的场景。
訾博ZiBo
2025/01/06
1790
《Rust避坑式入门》第1章:挖数据竞争大坑的滥用可变性
赵可菲是一名Java程序员,一直在维护一个有十多年历史的老旧系统。这个系统即将被淘汰,代码质量也很差,每次上线都会出现很多bug,她不得不加班修复。公司给了她3个月的内部转岗期,如果转不出去就会被裁员。她得知公司可能会用Rust重写很多系统,于是就报名参加了公司的Rust培训,希望能够转型。
程序员吾真本
2024/08/29
6960
《Rust避坑式入门》第1章:挖数据竞争大坑的滥用可变性
【译】为 嵌入式 C 程序员编写的 Rust 指南
这是来自 Google OpenTitan 团队,给嵌入式 C 程序员专门打造的一份 Rust 指南。
张汉东
2021/10/13
5.5K0
Rust 总结
所有权是用来管理堆上内存的一种方式,在编译阶段就可以追踪堆内存的分配和释放,不会对程序的运行期造成任何性能上的损失。
谛听
2022/06/04
1.8K0
Rust入门之严谨如你
Rust作为一门快速发展的编程语言,已经在很多知名项目中使用,如firecracker、libra、tikv,包括Windows和Linux都在考虑Rust【1】。其中很重要的因素便是它的安全性和性能,这方面特性使Rust非常适合于系统编程。
Radar3
2020/11/25
1.8K2
相关推荐
Rust语法入门
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档