Android逆向工程——初识Handler机制
安卓逆向学习交流群692903341
此次教程的目的:找APP付费项目地址,实施有效爆破。
本次教程的知识点:初步认识Handler机制,或者说,建立对Handler机制的一个认识概念。线程安全和线程不安全。
此次教程所使用的工具:Android Killer v1.3.1 正式版
没有的可以找我们领取
此次教程所使用的案例:消灭星星道具版
下载地址:http://www.eoemarket.com/game/708029.html
好了,下面开始进入此次教程的主题:
我们还是按照万年不变的步骤,用模拟器或手机安装应用程序,并进入软件里面,寻找相关【关键词】或【关键按钮】等等。
结果一进入里面,就把人吓到了,直接一次性跳出几个窗口:
一
二
在此,会觉得很人性化,似乎对方来欢迎别人逆向一样,专门主动出门迎接来了。
由于本人比较懒的缘故,就将词选得比较大,选了如下几个词作为后面搜索用的关键词:
图一选择:付费
图二选择:失败
好了,前期准备工作做好了,现在开始,将游戏的apk用Android Killer打开,并且通过字符串搜索:付费、失败两个关键词。
付费:
失败:
通过这两个词搜索出来的字符串,我们第一眼,甚至我们条件反射下,定位的是【失败】这个关键词搜索出来的结果。
PS:因为有支付失败嘛,正好符合我们图二的要求。
将支付失败这个词出现的类全部打开。
然后接着是将两个文件的JAVA源码弄出来,方便分析。
看到JAVA源码,大家是不是很兴奋。
但是这里,改那个IF条件里的条件语句:paramInt == 9000 改成 paramInt != 9000 没效果。虽然最后会跳出文本框出来,说支付成功,但是测试时,依然没效果。
那么,这时候,会有一个想法:这种现象,是因为里面只有文本输出,并没有实际支付成功后的函数调用,因此,没效果。
那换第二个图的时候,一目了然,很简单,把支付失败那个类的源码全部改成支付成功的源码,即:
原来的源码:
public void onZhangPayBuyProductFaild(String paramString1, String paramString2)
{
Log.d("支付失败:", "支付失败!响应码:" + paramString2 + ",计费id:" + paramString1);
this.val$paramIOnPaymentCallback.onBuyProductFailed(this.val$paramVo_Pay);
}
public void onZhangPayBuyProductOK(String paramString1, String paramString2)
{
UMGameAgent.pay(10.0D, 1000.0D, 26);
this.val$paramIOnPaymentCallback.onBuyProductOK(this.val$paramVo_Pay);
}
修改后的源码:
public void onZhangPayBuyProductFaild(String paramString1, String paramString2)
{
UMGameAgent.pay(10.0D, 1000.0D, 26);
this.val$paramIOnPaymentCallback.onBuyProductOK(this.val$paramVo_Pay);
}
public void onZhangPayBuyProductOK(String paramString1, String paramString2)
{
UMGameAgent.pay(10.0D, 1000.0D, 26);
this.val$paramIOnPaymentCallback.onBuyProductOK(this.val$paramVo_Pay);
}
但是,依然没效果,真是到此时,估计很多新人就会遇到坑,第一次遇到,总会慌神,这是怎么回事儿?
下面开始进入真正的主题
再用【付费】这个关键词再去重新定位,然后再进一步找突破口。
由于之前,遭受过一两次挫折,此时信心已然不足,抱着尝试的心理,将付费失败的代码替换成付费成功的代码。
JAVA源码是:
将图中,红色框框的JAVA源码所对应的Dalvik opcodes复制并将紫色框框的JAVA源码所对应的Dalvik opcodes覆盖。
测试之后,居然成功了。
我找到了几处不同之处,推断出,应该是Handler机制作祟。
第一个不同之处:
第二个不同之处:
最后得出Handler机制作祟这一个观点。
网上也提供了Handler机制的一些特征:
当应用程序启动时,会开启一个主线程(也就是UI线程),由她来管理UI,监听用户点击,来响应用户并分发事件等。所以一般在主线程中不要执行比较耗时的操作,如联网下载数据等,否则出现ANR错误。所以就将这些操作放在子线程中,但是由于AndroidUI线程是不安全的,所以只能在主线程中更新UI。Handler就是用来 子线程和创建Handler的线程进行通信的。
这里比较概念比较复杂,大牛们可以多多讨论交流阐述下建议。
最后,再拓展一个知识:
线程安全和线程不安全
线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问,直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。
线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据
好了,本次教程就大致到此结束。
以上内容在咱们的VIP就业班里都有详细的讲解,还有老师一对一辅导+直播互动授课+直播回放+录播教程+大量案例和作业练习素材+就业推荐与指导。
这次教程,我没有写好,因为我个人能力有限,对Handler机制也不是理解得很透彻,不敢乱说话。