【安卓逆向】初识Handler机制

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机制也不是理解得很透彻,不敢乱说话。

猜你喜欢

转载自blog.csdn.net/YJJYXM/article/details/103010248
今日推荐