破解前准备
安装好Android开发环境(SDK,Android studio)
安装插件 smalidea, smali support
下载最新的apktool.jar
使用apktool解包,打包
1. 执行命令 java -jar apktool.jar d xxx.apk
如果apk没有加固,执行完命令,就能看到反编译后的smali文件,可以阅读这些smali文件.
2. 打包命令 java -jar apktool.jar b 解包后的目录 >xxx.apk
可以执行打包命令,将解包,修改后的smali再打包. 如果需要调试,需要在AndroidManifest.xml文件中,加上debugable.
<application android:[debuggable](https://developer.android.com/guide/topics/manifest/application-element#debug)="true">
</application>
此时得到的apk包没有签名,需要签名后才能安装
3. 签名 jarsigner -verbose -keystore .\xxx.jks -signedjar signed.apk xxx.apk 'benzhuo'
输入密码后,签名完毕,签名后的包是signed.apk,安装这个包.
smali调试
1. 执行 java -jar apktool.jar d signed.apk. 解压刚才签名的安装包
2. 用Android Studio 打开解压后的文件夹,此时需要设置一下工程的SDK.
3. 连接上测试手机, 执行命令 adb shell am start -D -W -n 包名/LauncherActivity ,以debug模式打开应用,此时手机上打开应用会弹出提示框, Waiting For Debugger.
4. 点击Android Studio的Attach Debugger 按钮.
5. 选择调试的程序,然后就可以调试了
6. 修改了Smali文件之后,需要重新打包,然后安装在手机上,再调试.
smali语言
1. 原始类型
|smali类型|java类型|
|----|---|
|B|byte|
|C|char|
|D|double|
|F|float|
|I|int|
|J|long|
|S|short|
|V|void|
|Z|boolean|
|[x| x类型数组|
|Lpackage/Object|对象|
2. 方法
- 第一行 .locals 11 表示这个方法使用了多少个寄存器, 从0开始,v0- v10
.locals 11
方法中 p0,p1表示参数的寄存器.
invoke-virtual 表示调用函数方法, {} 中的第一个参数是调用对象的寄存器,后面参数表示方法的参数,方法名后面的是返回值
invoke-virtual {p1}, Ljava/lang/Double;->doubleValue()D
- invoke-static 是调用静态方法,{}中的都是方法参数.
invoke-static {v1, v2, v3, v4}, Lcom/meituan/retail/c/android/utils/v;->a(DD)Z
invoke-direct 调用私有方法
invoke-super 调用父类方法
move-result 是将前面方法的返回值赋值给某个寄存器.
move-result v1
- move-object 从寄存器v9赋值到寄存器v3
move-object v3, v9
- const-string 将字符串赋值给v10寄存器
const-string v10, "5e6d"
- const-class 将类对象赋值给v2寄存器
const-class v2, Context
- const/4 将int值赋值给v1寄存器
const/4 v1, 0x1