安卓逆向入门笔记(七)—— ARM汇编和so层动态调试

查看 55|回复 9
作者:sigewangdaiduie   
ARM汇编指令
在进行so层的动态调试前需要学习些知识点,比如说arm汇编,我们在用ida反编译so文件可以看到arm汇编指令,这个指令是CPU机器指令的助记符。这是什么意思呢?首先CPU机器指令其实也就是那由1和0组成的二进制,如果要我们通过CPU的机器指令来编程那是非常难且枯燥无聊了的,反正我是做不到。但我使用汇编代码来编程就还是可以编写些简单的程序的,嘿嘿!我们先来看一段反编译出来的简单的汇编代码:


image-20250321170415206.png (61.06 KB, 下载次数: 0)
下载附件
2025-5-11 14:22 上传

我们可以在图中看到汇编指令的左边有所对应的机器码,如push    rbp这条指令所对应的机器码就是55,这个55是用十六进制表示的,它最终会被转换成二进制,也就是0和1,55占一个字节也就是8位,转换为二进制为01010101,而这串01010101就可以表示push    rbp这段汇编指令出来。这里多提一嘴,从机器码01010101到汇编指令push    rbp的过程就是反汇编,而从汇编指令到机器码的过程就是汇编。
arm的CPU是支持四种指令集的,分别是ARM32指令集(32-bit)、Thumb指令集(16-bit)、Thumb2指令集(16-bit&32-bit)、ARM64指令集(64-bit),但是ARM32的CPU是只支持前三种指令集的。在同一个函数中是不会出现多种指令集的,也就是某一个函数不会出现既有ARM32指令集又有Thumb指令集的情况。不过在不同的函数中可以,也就是这个函数是一个指令集,另一个函数是另外一个指令集的情况。Thumb2指令集大致情况如图所示:


image-20250322005322529.png (505.14 KB, 下载次数: 0)
下载附件
2025-5-11 14:23 上传

在Thumb指令集中一条指令用两个字节就可以表示了,并且和arm指令集中用四个字节表示的效果是一样的。这时有些朋友可能会疑惑,那对比arm指令集节省了不少的字节,那为什么不都用Thumb指令集呢?其实原因很简单,因为有些东西并不能两个字节搞定,比如说异常处理,异常处理在arm的CPU中是要占四个字节的,遇到这种情况Thumb指令集就需要用两条Thumb指令去搞定异常处理,这么一来就需要用到两条指令,从而导致所花时间比起一条指令解决的arm指令集就更长了。所以后来就出现了Thumb2指令集,该指令集就有用两字节和四字节来表示指令,Thumb2 支持 16位和32位混合编码,处于两个字节和四个字节共存的状态。
不过怎么说Thumb2指令集的本质还是Thumb指令集,所以我们在对Thumb和Thumb2指令集进行hook时地址是需要加一的,而arm指令集则不需要,因为由LSB标识指令集状态,Thumb系地址末位为1。总之Hook 地址处理大概是这样的:
Thumb 函数地址:0x1000 → Hook 地址为 0x1001。
ARM 函数地址:0x2000 → Hook 地址为 0x2000。
这里多提一嘴,arm的CPU是向下兼容的,所以arm64的CPU依旧会支持这三种指令集。
ARM架构本质上是RISC,而RISC是精简指令集,指令复杂度是简单且单操作的,内存访问是仅通过 LDR/STR 指令实现的,寄存器使用一般通用寄存器数量多(如ARM32有16个)
因为精简指令减少晶体管数量和动态功耗,所以适合移动设备。X86的CPU是可以直接操作内存中的数据,但ARM的CPU是没法直接操作内存中的数据,就是因为ARM架构是精简指令集。
我们先来看两段arm汇编代码,第一段:


image-20250322180708375.png (84.47 KB, 下载次数: 0)
下载附件
2025-5-11 14:24 上传

第二段:


image-20250322180547343.png (103.71 KB, 下载次数: 0)
下载附件
2025-5-11 14:25 上传

这两段汇编代码中可以看到些看似一样却又有些不一样的指令,比如说ADD和ADDS这两种指令,这两种指令有什么区别吗?其实ADDS中的S就是指令后缀,ARM汇编是很喜欢给指令加后缀的,这样一来同一指令加不同的后缀就会变成不同的指令,但功能是差不多的啦!
下面罗列了 ARM 汇编指令中常见的后缀:
一、条件执行后缀(Condition Codes)
ARM 指令可通过条件后缀实现 条件执行(根据 CPSR 状态寄存器中的标志位决定是否执行指令):
[table]
[tr]
后缀[/td]
全称[/td]
触发条件[/td]
典型应用场景[/td]
[/tr]
[tr]
[td]EQ

指令, 指令集

mw26973   

学习学习,支持一下
li083m   

学习了,感谢分享
zhuxingcheng   

学习了学习了
BonnieRan   

so层逆向入门哎,收藏啦~
debug_cat   

太详细了,我都已经忘差不多了
hcsson   

学习学习
springOfSummer   

很详细,感谢分享
offerking   

坚持打卡保留账号不被删就是为了安卓逆向,啥时候能出个完整版的
ab19950220   

很不错的学习贴
您需要登录后才可以回帖 登录 | 立即注册

返回顶部