Android反编译后重新打包apk

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

  • 人家比咱写的好,学习

  • 看中了人家的某个控件,抄袭

  • 看中了人家的本地数据库,想要

  • 但是人家的本地数据库加密了,要读源码才能解密

为什么要打包别人的apk?

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

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

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

分别对应得详细操作:

  1. apktool反编译apk

$ apktool d test.apk

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

详细操作,尽情的折腾吧,隐藏某个view,添加某个view。

  1. apktool 打包

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

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

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


第一步:生成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_zip.apk

-f 强制覆盖已有的文件

-v 输出详细内容

4 指定档案整理的字节数,一般为4,及32位。如果以后android的设备有64位的,可能要改成8吧。

test.apk 是未整理的apk文件名

test_zip.apk 是整理后的apk文件名

我的博客

你可能感兴趣的:(Android反编译后重新打包apk)