本帖最后由 北辰 于 2021-6-17 23:30 编辑
安卓逆向的话,smali是必学的,因为java源码编译成smali代码这个过程是不可逆的。
所需的工具:Mt管理器2代
先来了解一下一个apk的基本结构
•Assets里存放的是apk的资源文件,比如声音,视频
•META-INF是签名信息,apk必须签名才能用,除非你有核心破解
•Res文件夹存放的是apk的布局文件,图标,按钮样式等
•Androidmanifest.xml用来配置程序的入口,活动,服务,权限等
•classes.dex则是程序的逻辑主体,代码就保存在这里面
•resources.arsc则是res的索引,res内的文件都有一个十六进制id,dex通过这个id调用它们
用mt管理器打开dex文件
可以看到这样的结构
类就相当于txt文件,里面保存着代码
打开一个类
点击那个指南针图标
方法里保存的就是程序的逻辑
下面开始讲Smali的基本语法(只讲常见语法)
.source 表示这个类对应的 Java 文件的文件名,看这个可以大概知道这个类的作用,如果代码被混淆了,.source 可能会没有值。
v+数字是寄存器,用来存贮一些数据
const const/4 const/16都是用来存储数值的
const-string则是用来存储字符串的
比如const v0, "0x1"就是将1赋值给v0
const-string v0, "Hello World!"则是将Hello World这串字符串保存到v0
if则是用来作跳转的
if-eq vA, vB, :cond_** 表示如果vA等于vB则跳转到:cond_**
if-ne vA, vB, :cond_** 表示如果vA不等于vB则跳转到:cond_**
if-lt vA, vB, :cond_** 表示如果vA小于vB则跳转到:cond_**
if-ge vA, vB, :cond_** 表示如果vA大于等于vB则跳转到:cond_**
if-gt vA, vB, :cond_** 表示如果vA大于vB则跳转到:cond_**
if-le vA, vB, :cond_** 表示如果vA小于等于vB则跳转到:cond_**
if-eqz vA, :cond_** 表示如果vA等于0则跳转到:cond_**
if-nez vA, :cond_** 表示如果vA不等于0则跳转到:cond_**
if-ltz vA, :cond_** 表示如果vA小于0则跳转到:cond_**
if-gez vA, :cond_** 表示如果vA大于等于0则跳转到:cond_**
if-gtz vA, :cond_** 表示如果vA大于0则跳转到:cond_**
if-lez vA, :cond_** 表示如果vA小于等于0则跳转到:cond_**
gloto :cond_**则表示无条件跳转到:cond_**
cond_**就是一小段指令的合集
iget指令则是用来取得数值的
iget-boolean 是用于读取布尔值的,boolean只存在两种状态,0和1,即是和否
iput则相反
是用来写入的,和const的区别就是iput写入是对别的方法,类的寄存器进行的
move-result用于把前面运行的结果赋值
return则用于返回结果
.line无意义,用于表示该代码位于原java代码第几行
大概就这些,如果有需要补充的我会在评论区补充。 |