APK篡改与重新打包
这里分享的是安全技术,切忌,破解属于侵权行为(毕竟这个技术必然会被人用于破解他人软件),这里只做技术分享和说说最简单的反编译APK思路。示例软件不公开,也不用找我要,只是普通APK,没有什么破解价值。(这里的示例是一个未加固的APK,若APK已加固则处理起来会很麻烦,这里不做过多解释,避免被别有用心之人利用,毕竟市面上其实大部分APK都加固了)
先准备好今天的主角,一个待篡改的APK安装包文件。(此APK未加固)

在此之前,我们需要准备好几个工具。
- apktool
用于反编译apk文件为smali - Android Build Tools
这个在安装安卓SDK时会附带,在你的sdk文件夹下的build-tools文件夹下,加入PATH即可
后面提到的jarsigner、zipalign等全部出自这个包 - APK Editor Studio
如果你只是想改名称、logo等基础内容,这个软件足够你用
- apktool
下面正式开始
解包APK
在apk文件所在文件夹下,打开CMD,执行如下指令:
apktool d base.apk -o base输出

- 这样,我们就得到的反编译的结果(位于base文件夹下)


- 这里面有所有的安装包下的文件,至于已被编译的class.dex等dex文件,则位于smali文件夹及其他两个以此开头的文件夹内,是一堆类似汇编的源代码(我也没学过这个,看着像汇编,所以大致其实可以看懂,并进行修改)。我们这里使用
vscode打开它。
篡改apk
实现免登录
直接搜索isLogin发现这里有个方法实现。打开它(方法名不一定,基本靠猜,若加固了,这里全是混淆过的,猜不出来的)

这里有个return v0,很简单嘛,直接在最后,把true赋值给v0不就好了,新增一行(放在return前面即可):const/4 v0, 0x1改永久会员
这里就得靠猜了,我试了半天,发现有一个isLifetime的方法,看看:
- 这里发现还有里面的一个
isVip方法里的被调用方法is_expired方法,顺着找
果然有这个方法
这里直接把返回值赋值为0
- 这里发现还有里面的一个
增加登录数据
这里都已经免登录了,为了避免bug,所以我们得伪造一个登录信息出来。这个就容易猜了,直接搜userInfo,发现里面有个getuid方法,我们给他直接赋值返回一个数字(类型是字符串,但是为了确保安全,还是用数字型字符串吧)。

到这里,所有的篡改都差不多结束了,接下来我们试验下吧,第一步,当然是把它重新打包回apk,在终端下执行命令:
apktool b base -o new.apk
这里编译有点慢,需要等一会儿。

此时,我们就得到了一个已经篡改好的apk文件了,当然,到这里远没有结束,篡改后的apk是没有签名的,需要先签名。
APK签名
先生成一个jks签名文件:
keytool -genkey -v -keystore release.jks -alias myapp -keyalg RSA -keysize 2048 -validity 36500跟着流程走完,我们就得到了一个
release.jks签名文件了。

这里需要设置口令,务必记住,这是后面签名所需的,信息可以随便填,之后是否正确输入y即可。这里先科普一个坑,我们的apk是篡改的,如果直接签名的话,安装时会报
packageInfo is NULL,后来发现,这里需要先对齐,所以第一步,当然是对齐。执行APK对齐操作
zipalign -p -f -v 4 new.apk aligned.apk
最后输出Verification succesful就成功了,如果不放心,可使用zipalign -c -p -v 4 aligned.apk验证对齐。最后一步,执行签名,这里小心,建议使用apksigner进行签名,否则还是容易报前面那个报错。
apksigner sign --ks release.jks --out app.apk aligned.apk按照要求输入签名的签名文件的口令,即可完成签名。

我们便得到了最终的安装包:app.apk文件
接下来就可以安装测试了,再根据具体情况做调整修复即可。
