逆向流程梳理
使用apktool 进行反编译
apktool反编apk时报错
org.jf.dexlib2.dexbacked.DexBackedDexFile$NotADexFile: Not a valid dex magic value: cf 77 4c c7 9b 21 01 cd 1 提示很明显,就是非法Dex,这是因为apk里有加密过后的dex文件,比如有些apk的assets目录下有加密后的Dex文件,添加–only-main-classes参数即可
apksigner sign --ks 密钥库名 --ks-key-alias 密钥别名 xxx.apk
解包
apktool d /Users/xxx/work/game/lwcgc_v1.105.apk --only-main-classes
重新打包
apktool b /Users/xxx/work/game/lwcgc_v1.105 -o lwcgc.apk
apk重新签名
生成签名用测试key
keytool -importkeystore -srckeystore nsky.jks -destkeystore nsky.jks -deststoretype pkcs12
输入源密钥库口令:
已成功导入别名 nsky 的条目。
已完成导入命令: 1 个条目成功导入, 0 个条目失败或取消
Warning: 已将 "nsky.jks" 迁移到 Non JKS/JCEKS。将 JKS 密钥库作为 "nsky.jks.old" 进行了备份。
对apk进行重新签名
apksigner sign --ks nsky.jks --ks-key-alias nsky --ks-pass pass:999999 lwcgc.apk
若密钥库中有多个密钥对,则必须指定密钥别名
apksigner sign --ks 密钥库名 --ks-key-alias 密钥别名 xxx.apk
禁用V2签名
apksigner sign --v2-signing-enabled false --ks 密钥库名 xxx.apk
参数:
--ks-key-alias 密钥别名,若密钥库有一个密钥对,则可省略,反之必选
--v1-signing-enabled 是否开启V1签名,默认开启
--v2-signing-enabled 是否开启V2签名,默认开启
例如:
在debug.keystore密钥库只有一个密钥对
apksigner sign --ks debug.keystore MyApp.apk
在debug.keystore密钥库中有多个密钥对,所以必须指定密钥别名
apksigner sign --ks debug.keystore --ks-key-alias androiddebugkey MyApp.apk
查看keysotre签名
keytool -list -keystore nsky.jks
输入密钥库口令:
密钥库类型: jks
密钥库提供方: SUN
您的密钥库包含 1 个条目
nsky, 2021-2-23, PrivateKeyEntry, 证书指纹 (SHA1): 1E:83:53:E8:F9:64:EF:C2:D8:34:68:76:97:09:A4:A0:0B:82:11:52
查看apk签名
keytool -printcert -file /Users/xxx/work/game/lwcgc/META-INF/NSKY.RSA 所有者: CN=nsky, OU=nsky 发布者: CN=nsky, OU=nsky 序列号: 298557f9 有效期为 Tue Feb 23 14:50:37 CST 2021 至 Sat Feb 17 14:50:37 CST 2046 证书指纹: MD5: A9:01:64:74:D0:6A:89:4D:93:71:9D:95:7A:6B:98:6D SHA1: 1E:83:53:E8:F9:64:EF:C2:D8:34:68:76:97:09:A4:A0:0B:82:11:52 SHA256: AB:22:CB:3D:6C:1D:A7:1B:EC:98:F8:FA:F4:11:48:76:AF:CF:D2:97:7A:11:11:7A:92:FF:8F:5B:EA:8B:C2:73 签名算法名称: SHA256withRSA 主体公共密钥算法: 2048 位 RSA 密钥 版本: 3
扩展:
#1: ObjectId: 2.5.29.14 Criticality=false SubjectKeyIdentifier [ KeyIdentifier [ 0000: 80 43 20 2A 4E 6E 1A 54 A7 03 6F DD 5A 5A 97 48 .C *Nn.T..o.ZZ.H 0010: 7F DF 55 B1 ..U. ] ]
工具
jadx
它可以直接将 Apk 反编译成 Java 代码进行查看,毕竟 smali 代码不是那么人性化。我拿到一个 Apk,基本上第一件事就是丢到 JADX 中进行查看,它同时支持命令行操作和图形化界面。
smalidea
动态调试 smali 来的更加直截了当。不管是你自己写程序,还是做逆向,debug 永远都是快速理清逻辑的好方法。smali 也是可以进行动态调试的,依赖于 Smalidea 插件,你可以在 Android Studio 的 Plugin 中进行安装,也可以下载下来本地安装。
第一步,我们要保证我们的应用处于 debug 版本,在 AndroidManifest.xml 中加上 android:debuggable="true" 即可,重打包再安装到手机上。
第二步,将之前反编译得到的 smali 文件夹导入 Android Studio 或者 IDEA,并配置远程调试环境。选择 Run -> Edit Configurations,点击左上角 + 号,选择 Remote
root手机数据导出
adb shell
su
mkdir -p /mnt/sdcard/game
cp -r -f ./* /mnt/sdcard/game
adb pull /sdcard/game game