Android逆向笔记

733 阅读3分钟

逆向流程梳理

使用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.apkdebug.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

bitbucket.org/JesusFreke/…

动态调试 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