关于如何注入?
开篇的时候有个图片就是我在地图里面注入了一个苍老师的图片其实就是,自己写了个 imageloader,用来下载网络图片,再写个 activity 或者 dialog 来承载这个 imageview,然后编译,再反编译,取出相应的smali等文件,比如贴到已经反编译好的地图的里面,把开启这个苍老师图片下载的启动代码放到合适位置,最后再把地图重新打包签名,就ok 了。
hook 代码也是同理注入,验证一下,成功(我这块写的比较粗略,代码比较多,只说思路了)那么这种代码注入和 hook 相结合的方式能干什么呢,我们也不妨搞出点事情来。同样我们还是进行微信运动作弊的事情,其实很多运动类的软件都可以把自己的数据同步到微信运动里,比如小米手环,乐动力,悦动圈等等。
那我们就先拿一个来开刀吧:经过一系列的跟踪代码定位,最终定位到了这个类 cn.ledongli.ldl.cppwrapper.DailyStats 里的 f 方法(f 是因为代码混淆了)然后我们注入并 hook 方法,让它返回66666,ok,我们看到了如下效果:
然后我们在应用里面登陆微信账号,和对接到微信运动的功能,发现不好用,是因为,微信里面做了对应用的签名校验,应用的签名已经变了。
所以我们只能破解微信了(闷声作大死),同样注入 hook 代码,让微信获取乐动力的签名的时候取得正确签名,关键代码:
if( packageName.equals( "cn.ledongli.ldl")){
if ( result instanceof PackageInfo) {
PackageInfo info = (PackageInfo) result;
info. signatures[0] = new Signature( myHexLedongli);
param.setResult( info);
}
}
再把这个盗版的微信重新打包签名,重新进行应用的同步数据操作,再进微信运动看看,是不是已经66666了。至此作弊完成。
♂♂♂♂♂♂♂♂♂♂我是画风不同的分割线♂♂♂♂♂♂♂♂♂♂♂♂
说了这么多破解的,也该聊聊防破解的了。
google 最早给的就是代码混淆的方案,其实一般的混淆只是降低了代码的可读性,让你对反编译出来的函数命名等不知道什么意思,不过解读出来只是时间问题。后来还有资源混淆的,但是意义不大。
后来有了核心代码用 C 实现,写成 SO,加花指令的办法,这个办法确实会阻止一大部分人的继续破解,但是对于经常做逆向的工程师来说也不是什么难题。
其实做这么多大多数软件的初衷就是不想软件被盗版,然后被注入乱七八糟的广告,或者被盗取信息等,后来就有了盗版检测机制。比如:JAVA 层的签名校验,NDK 层校验,分段存放签名 Hash 串,服务器校验等等,但是这些方法我都在上面说了破解方法。
现在国内的一般应用市场都有对 APP 签名的检测,在你下载的时候会告诉你这个 APP 是不是盗版的,从而让用户区分出来。但是应用市场自己本身又被盗版了怎么办呢?
再后来,就有了像360加固保和腾讯的乐固等产品,so 做了加密,真正的 dex 也藏起来了,不过个人觉得,就算真正的 dex 也需要变成 odex 了,root 的手机取到 odex,再转回 dex,就能拿到真正的 dex(虽然我没试过,但是我觉得可能是一个思路),所以这个方法就更难破解了。
虽然加固产品很厉害,但是也会有他的缺陷,Android 系统不断的更新升级,也许就换了某些模式等等,比如 ART 刚出来的时候,加固保加固后的 Apk,在 ART 模式运行下就会 Crash。这些加固产品要不断的适配各种型号的手机,CPU 类型,运行模式等等,所以很多 APP 为了考虑兼容性,他们也不会轻易去加固自己的产品。
♂♂♂♂♂♂♂♂♂♂我是画风不同的分割线♂♂♂♂♂♂♂♂♂♂♂♂
关于逆向破解 Android 应用,我觉得耐心很重要吧,代码跟来跟去确实很枯燥,总结几点小技巧吧:1.信息反馈:通过界面的一些弹出信息,界面特点寻找突破点。2.特征函数:比如搜 Toast,Log,getSignature 等。3.代码注入:把 toast 或者 log 函数注入到程序中,跟踪位置。4.打印堆栈:插入 new Exception(“定位”).printStackTrace();5.网络抓包:通过抓包得到的关键字段,在代码中定位。
**写在后面:
**这篇文章整理了有一段时间了,觉得还是应该写出来,也不是什么高深的技术文章,就是个人总结的一点心得而已。
关于破解应用很多人可能会去破解别人的应用注入广告来获取利益,也有可能盗取别人的信息。
不过我们作为有节操的开发工程师,应该本着瑞雪的精神看待技术,学习技术,而不是乱♂搞。但是我们也应该知道,我们的应用有可能会被别人怎么搞……
最后推荐一本资料书,大家可以有空看看。