最近做的apk检测,随便讲一讲修改apk重新打包以获取输出方便调试的方法。参考
起因
在做apk检测的时候,已经发现了app通信的数据包是明文(https协议但未校验证书),但窝火的是数据包没办法修改,有一个sign校验值
修改了内容就会说校验值不通过
当下就起了歹心,这明显就一个md5加密字符串嘛,大致上肯定也就是请求包里各个字段拼接起来在加密,加上这个app甚至各个历史版本都可以在更新的服务器下载,想说这也太不安全了,一定有问题,怎么能被一个区区的sign值困住?于是开始了反编译之路。反编译自然不说了,apktool、Android Killer之类的。先用jd-gui看看java代码找到签名算法的大致位置和大致思路,搜索到sign字符串,大致定位为其中一个文件。
一开始还把App的log打印出来看,不过到底还是开发人员的调试日志,没有自己想要的结果,不如自己加的爽。
参考吾爱破解的文章,自己做了一个crack类,调用toString方法打印对象到/sdcard/debug.txt,毕竟像smali源码中StringBuilder这样的对象就不能通过多态,以打印String的方法打印;另外数组需要特别地使用Array.toString方法,如果直接调用toString方法,打印出来会是像[B@c618d72这样的乱七八糟的东西(“[”表示数组,“B”表示Byte,“@c618d72”表示地址)
当然最后通过调试也是把sign签名的算法搞出来了,其实也就是请求里的一些字符串拼接过后生成sign,用了一个2019的时间戳证明一下sign被我搞出来了~~
使用方法
文件在此。在apktool反编译出的smali、smali_classes2这些随便一个文件夹下直接放入crack.smali,调用的时候按照crack.smali的main方法里那样调用。然后再使用apk重新编译再用signapk等工具重新签名。
需要注意的是如果需要添加tag,在函数的寄存器个数声明处,一般是在函数开头的第一行,给寄存器个数加一,比如将.registers 5
改成.registers 6
,毕竟tag字符串需要一个寄存器存储。
实际上我想这个技术应该不算新鲜,毕竟众厂商早就开发出了在apk中植入广告的技术,而且现在大家都提高了安全意识,想必重打包、重签名都畅通无阻的App也应该不多,不过对于一个新上手的人来说,这样玩还算有趣,有时间还可以研究研究内购破解什么的。