为什么要反编译别人的代码?
人家比咱写的好,学习
看中了人家的某个控件,抄袭
看中了人家的本地数据库,想要
但是人家的本地数据库加密了,要读源码才能解密
为什么要打包别人的apk?
- 反编译后的代码有些地方读不通顺。想添加log。
一个基本的逆向工程的流程。
apktool反编译apk --> 修改图片等资源文件(或者smali源码)--> apktool 打包apk --> 对打包好的apk用jarsigner签名 [--> zipalign优化apk,最后这步可选操作]
分别对应得详细操作:
- apktool反编译apk
$ apktool d test.apk
- 修改图片,填好string.xml,修改smali
详细操作,尽情的折腾吧,隐藏某个view,添加某个view。
- apktool 打包
apktool b test
这里的test是反编译test.apk 后生成的文件夹。最终的生成的新的未签名的apk的路径为./test/dist/test.apk
- 用你自己的证书对别人的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安装到手机里了
- 优化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文件名