最近,一直使用的某款APP,广告越来越多,更令人发指的是,广告弹框最后都变成无法关闭的形式,不使用会员压根没法正常使用。应用市场广大用户的评论说出了我们的心声。
虽说充会员可以免广告,这点小钱,那都不是事,但是不吃馒头争口气,对于吃香难看的APP,作为消费者,我们要敢于维权。说不定通过维权手段,还能看些免费小视频。不开玩笑了,本次,就以这个APP为例,简要说明一下如何对Android APK进行逆向和重打包,实现免广告操作。免责声明:本文不针对任何特定APP,请各位看官遵纪守法,只做学习交流使用。
方案一
工作时,曾遇到一个视频APP。对于某个收费视频,会调用一个函数,用来判断用户是否是会员。基于此,我们只要找到判断会员的函数,修改返回值,即可实现付费绕过。
对于此APP,我一开始的想法也是如此。我们搜索vip
,果然找到一个疑似函数isVipUser
,大喜过望,显然这个函数就是用来判断用户是否是会员。
紧接着,将APK反编译,即拖到APK Easy Tool,修改对应的smali代码。将190改为0x1,那么isVipUser
返回值永远为True。
再将修改后的文件,拖到APK Easy Tool的Compile上,即可实现回编译,并且会自动签名,实现一个透明的重打包。当我们把重打包后的APK,放到模拟器上安装以后,广告居然还在?这就有点尴尬了,显然这个APP的逻辑可能远比之前的判断要复杂,可能使用了其他判断方法。
方案二
退而求其次,只能找到每个广告组件弹窗的逻辑了。还没说完,广告就来了。单从如下卡片中,我们很难直接定位到相应代码。因为该卡片的内容是实时生成的,没有明显关键字。
点击x,喜出望外,"享免广告特权",这就是我们想要的关键词。
在Jadx中,通过搜索关键字,直接可以定位到字符串,根据字符串,查找相应的代码逻辑,这是一种最常见的逆向方法,可以帮助我们快速定位复杂逻辑。这里需要注意的是,字符串搜索时,一定要选择资源
紧接着通过层层引用,定位到相应的代码。因为原APK广告组件实在太多,通过逐个patch,再回编译(回编译很耗时),效率过于低下。因此要使用frida,进行调试。
最方便的就是,hook相应函数,不反回任何值,看看广告还在不在。这样就能知道这个函数到底是不是某个特定的广告组件。利用此方法,我们最终找到了6处不同的广告组件的代码,通过patch,还原一个干净整洁的APP,感谢以下工具!
在动态调试的过程中,可能一个函数会被多处调用,这时打印调用栈就显得十分重要。还好个人有个记笔记的习惯,虽然很久没有逆向Android代码,但是通过以前的文章,Frida-Android 进阶,我们实现了对此APP的快速动态调试。
js
Java.perform(function(){
send("print stack...");
var Animal = Java.use("com.example.testfrida.Animal");
Animal.getAge.implementation = function (){
//打印调用栈
console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Exception").$new()));
//throw Java.use("java.lang.Exception").$new();
return this.getAge();
};
});
其实还有方案三,一些工具可能集成了通用屏蔽广告的功能,例如"MT管理器",号称能够自动去除一些APK的广告,大家感兴趣可以试一下。
杂谈
很久没有写博客了,其实逆向这个APP还是花了些时间,只是写得比较简单,是因为非虫大大的经典Android安全入门书籍《Android软件安全与逆向分析》早就提到相关内容。如果你觉得出版于2013年的此书比较老,那么后来的《Android软件安全权威指南》也是一个不错的阅读选择。
其实对于安全从业者来说,更多的是在各种博客、论坛学到的安全知识,在有一定安全背景之后,再阅读相关经典书籍,可能会有更好的结果。就拿我写的这篇博客为例,可能相关书籍上会告诉你,用apktool等工具进行反汇编,jd-gui反编译smali代码。这确实是常见的Android静态分析思路。
但是实际上,至少对于我而言,很多过程都省略了,我们要把最少的时间花在通用逆向上,而把更多精力放在代码逻辑上。例如,Jadx可以直接反编译APK,而且具有强大的交叉引用功能;如果你想对APK进行Patch,APK Easy Tool可以实现一键反编译,得到一个文件夹,直接修改文件夹里面的文件,比如smali、资源文件。然后将这个文件拖回APK Easy Tool就可以实现一键回编译和签名。
如果你是一个初出茅庐的小白,则需要多多实践和总结。光看理论是远远不够的,实际操作中会遇到各种问题和挑战,这些都是纸上谈兵无法涉及的。只有通过实际测试,才能真正理解和掌握安全测试的各种技术细节。安全这条路虽然不易,但只要脚踏实地,勤于动手实践,相信一定能够通过自己的努力,在这个领域有所突破和进步。