为什么要反编译别人的代码?

  • 人家比咱写的好,学习
  • 看中了人家的某个控件,抄袭
  • 看中了人家的本地数据库,想要
  • 但是人家的本地数据库加密了,要读源码才能解密

为什么要打包别人的apk?

  • 反编译后的代码有些地方读不通顺。想添加log。

一个基本的逆向工程的流程。

apktool反编译apk –> 修改图片等资源文件(或者smali源码)–> apktool 打包apk –> 对打包好的apk用jarsigner签名 [–> zipalign优化apk,最后这步可选操作]

分别对应得详细操作:

  1. apktool反编译apk

    $ apktool d test.apk

  2. 修改图片,填好string.xml,修改smali

    详细操作,尽情的折腾吧,隐藏某个view,添加某个view。
    一篇有用的文章,后来补充

  3. apktool 打包

    apktool b test 这里的test是反编译test.apk 后生成的文件夹。最终的生成的新的未签名的apk的路径为./test/dist/test.apk

  4. 用你自己的证书对别人的apk进行签名

    这是当然了,你反编译了别人的app,可定拿不到人家的证书,但是Android系统对没有用证书签名的apk是不允许安装的。这时候我们自己生成一个证书。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    第一步:生成RSA密钥对
    keytool -genkeypair -alias adorkable_alias -keyalg RSA -validity 400 -keystore adorkable.keystore
    -genkeypair 指定生成密钥对
    -alias 密钥对的别名
    -keyalg 密钥对用于的算法,这里用的是RSA
    -validity 密钥对的有效期,单位为天
    -keystore 密钥对存储的文件名
    输入后,根据提示输入相应的内容就好了。
    第二步:对未签名的apk进行签名
    jarsigner -verbose -keystore adorkable.keystore -signedjar result_singed.apk my_unsigned.apk adorkable_alias
    -verbose 输出签名详细信息
    -keystore 指定密钥对的存储路径
    -signedjar 后面三个参数分别是 签名后的APK包 未签名的APK包 和 密钥对的别名
    签名时,会要求输入密钥对的密码,这个是你在生成密钥时输入的密码

到这里就可以用adb install 将app安装到手机里了

  1. 优化apk包

    这一步是可选的,用来将apk包进行整理,以适应设备的读取等
    zipalign -f -v 4 test.apk test_zipaligned.apk

    -f 强制覆盖已有的文件
    -v 输出详细内容
    4 指定档案整理的字节数,一般为4,及32位。如果以后android的设备有64位的,可能要改成8吧。
    test.apk 是未整理(没有zipalign)的apk文件名
    test_zipaligned.apk 是整理后的apk文件名