游戏安全实验室 首页 游戏漏洞 查看内容

【游戏漏洞】安卓手游逆向必须基础

发布于:2018-1-11 11:28   |    139514次阅读 作者: 外部投稿    |   原作者: 外部投稿

我们知道android 的原生程序是运行于linux内核上的 ,并且处理器基于arm

那么我们想要学习安卓手游逆向就要学习arm汇编的基础知识,在安卓手游逆向的过程中我们使用最多的工具是IDA,同样我们要先学习IDA的使用

 

学习的前提是你已经掌握了一定的0x86汇编基础,掌握了一定的端游逆向基础,在0x86汇编基础和端游逆向基础上对比学习即可,如果没有一定的端游逆向基础,可以回去看看我之前的端游逆向基础

 

.arm 寄存器

1.r0 函数返回值 ,对应eax的作用

 

2.arm函数约定中r0-r3来传递参数,多于4个参数再用push传递参数 ,对应fastcall函数约定寄存器传参以及push 传参,不过寄存器传参数量不同

 

3.r4-r11 来保存局部变量,进入更内层函数时一样要保存,出来前还原,对应0x86堆栈指针表示的局部变量,以及进更内层函数push ebp

  Thumb 指令集 通常只是r4-r7 来保存局部变量

 (ARM模式每条指令4字节,Thumb模式每条指令2字节

  那么Thumb 指令集是什么呢?Thumb 指令可以看作是 ARM 指令压缩形式的子集,是针对代码密度的问题而提出的,它具有 16 位的代码密度但是它不如ARM指令的效率高

 

4.r12既ip寄存器是内部调用暂存寄存器

 

5.r13既sp寄存器是栈顶指针,它不能用于任何其它用途,对应esp寄存器

 

6.r14既lr寄存器,保存函数的返回地址,也可以用作他用,对应[ebp+4]里存放的返回EIP,调用函数,自动把返回地址放入r14中,例如    BLxxxx(对应call xxxx) 子程序通过把r14复制到PC(对应EIP)来    实现返回

    例如: MOV PC, LR 或则 BX LR

 

7.r15 pc 是程序计数器,它不能用于任何其它用途,对应EIP

   arm是流水线优化,pc和EIP不完全相同,EIP时刻指向准备执行的代码地址 而PC值=当前程序执行位置+8 Thumb模式下等于当前指令地址加4,因为流水线优化,有3个过程,取指,译指,执行,PC指向取指的代      码,PC-4指向译指的代码,PC-8指向译指的代码

 

8.r16 CPSR  当前程序状态寄存器   助记符后面跟的S 就是影响这个寄存器  例如add 和 adds ,adds就是影响状态寄存器的操作,而add不影响

 

9.r7 常用于保存系统调用号

 

10.r11  FP  用于保存栈帧  对应EBP 但是由于返回地址不用EBP负责, 这个寄存器很多时候用做通用寄存器 对应0x86 地位明显降低

 

11.R0~R12是通用寄存器(R11,R12不完全是),它们可以在常规操作中使用,来存储临时变量或地址。

 

 

.arm汇编指令

 

1.ldr 和mov的区别

mov只能传递寄存器之间的值

例如 mov r0,r1

ldr 传递内存地址里的值到寄存器

例如 ldr r1,[r3]

例如 ldr r0,[r1,#4]

这在0x86里都是mov负责的工作,现在被分工了

ldr伪指令可以当mov一样使用

例如 ldr r0,=ffff  操作数前加一个等号

操作数大小在mov指令范围内的话会自动编译成mov指令

 

2.str 和 ldr

str是传递寄存器里的值到内存地址中

例如 str r0,[r1]  r0寄存器的值写入到r1所表示的内存地址里

这跟我们以往见到的汇编指令是相反的,第一个操作数是源操作数,第二个操作数是目标操作数,这里应该注意一下.

理解一str 是ldr反操作

对比 ldr r0,[r1] 和 str r0,[r1]  是相反的执行过程

理解二可以理解str为写内存 ldr 为读内存

这些在0x86里都是MOV 负责的工作,现在被分工了

 

3.stm和ldm 批量读写 后面往往会跟着ia ib da db等等条件

i表示 加4 d表示减4 a表示赋值后 b表示赋值前 都是对应的英文单词的缩写

例子:

STMIA r0!,{r1,R3,R5} 

IA表示赋值后加4,也就是先存后增

产生的结果是:

r1存至r0

R3存至r0+4

R5存至r0+8

r0最后指向的地址是r0(初)+0xC

因为是先存后增,所以寄存器组存数据也是递增的,从r1递增取至R5

成对使用的取数据操作是:

LDMDB r0!,{r1,R3,R5} 

这个时候r0指向的地址已经是r0(初)+0xC,先减后取,所以产生的结果是:

r0+8取至R5

r0+4取至R3

r0取至r1

这两句命令相当于保存和还原的操作  类似PUSHAD POPAD的功能

 

4.跳转

B 无条件跳转指令  对应JMP  

    mov pc ,xxxx 相当于B(PC 之前我们说了 相当于EIP)

    ldr pc,_xxxx往往都是异常处理 

    例如 ldr pc, _data_abort 数据异常

BEQ相等跳转指令 对应JE

BL保存PC到LR再跳转 相当于CALL

     也就是 mov lr,pc 然后B 

     mov pc,lr 可以返回 相当于retn

BLX和BX 中的X表示跳转切换指令集 arm和thumb

 

5.状态寄存器

我们看到很多指令后面跟个S

例如 adds 带s 表示影响状态寄存器

 

6.立即数 前面要加#

 

7.SWP 后面跟B交换字节否则交换32位

SWP 指令举例如下

SWP R1,R1,[R0]  将R1 的内容与R0 指向的内存地址里的值交换

SWPB R1,R2,[R0]  将R0指向的内存地址里的值读取一字节数据到R1中(高 24位清零) 并将R2的内容写入到该内存单元中

实际上这个过程可以拆分成3句代码 来赋值,相当于C++里的变量交换

 

8.异或 E0R 对应 XOR

lsl,lsr 左右移

例如 mov r0,r1,lsl #2  结果 r0=r1*4

 

9.Ball对应Call 省略成 BL      Ball=B+All(条件)+保存LR

 

10.mvn 取反然后mov

例如 mvn r0,#0  结果 r0=ffffffff

 

汇编指令很多不是我们几天能够完全掌握的 可以在逆向的学习过程中慢慢吸收

这里面只是给大家列举比较常用的一些指令而已

 

 

.IDA入门

IDA是一个功能十分强大的反汇编工具,是逆向人员安全人员的必备工具

安卓手游逆向静态调试动态调试也多是在该环境下进行

那么我们就来从安装打开到基本操作进行入门学习

1.ida安装完毕以后有两个版本 分别用于反编译32程序和64程序

2.打开IDA出现三个选项

new选择一个文件打开

go直接进入主界面  要分析什么文件再手动拖文件进入或则打开

previous打开历史文件

如果是第一次分析我们直接点go,把要分析的文件拖入即可

如果是再次分析 我直接双击之前的idb文件 直接打开

3.加载的时候选择正常加载还是二进制加载 一般不需要修改配置 直接点OK即可

4.分析文件的时候需要一点时间

上方导航条不再动  左下角不再变地址  调试输出结束 都代表加载完成

 

5.加载成功以后 导航条有各种颜色,代表着不同的含义

蓝色Regular function代表代码函数段

灰色data代表数据段

粉色External symbol代表外部导入符号和函数

暗黄色Unexplored代表未识别

黑色代表界线

浅蓝色 Library function 库函数

棕色 Instruction 指令

代码段前面都是.text其他段也有对应的格式

shift+f7可以查看

 

6.界面

函数列表里有很多 sub-xxxx的函数 xxxx函数地址 自定义函数是没有办法反汇编出名字的,而有名字的函数都是系统函数

 

IDA有很多窗口 ,可以自由切换

 

7.在ida view窗口点空格可以在汇编代码和流程图两种模式间切换

绿色代表true 红色代表 false 蓝色代表顺序执行

 

8.我们可以点F5  把汇编代码翻译成伪代码  进入Pseudocode窗口

 

快捷键 /可以在伪代码后加注释

 

9.hex窗口 动态调试下F2修改内存值   其他情况winhex等工具修改内存值

 

10.常用的快捷键

回车进入

ESC退回上一步

ctrl+x查看交叉引用

G直接跳转到地址

CTRL+F搜索字符串

alt+m添加标签 ctrl+M搜索标签

N重命名

结构体窗口 insert插入一个结构

d加入一个成员,成员上继续点d 改变成员数据类型

 


 

 来源:外部投稿

*转载请注明来自游戏安全实验室(GSLAB.QQ.COM)

分享到:
踩0 赞0

收藏

上一篇:【游戏漏洞】安卓U3D逆向从Assembly-CSharp到il2cpp

下一篇:【游戏漏洞】基于CE的AutoAssemble LUA注入

最新评论
B Color Image Link Quote Code Smilies

发表评论

top 问题反馈

返回顶部