安卓逆向之JAVA层静态分析(愤怒的小鸟去广告,充值破解)
# 安卓逆向之JAVA层静态分析(愤怒的小鸟去广告,充值破解)### 前言
今天女票跟我吐槽,自己闲来无事下个愤怒的小鸟玩玩,结果又是实名认证,又是广告啥的,瞬间没心情玩了,我听后大惊,还有这种事。跟女票说:"把手给我",女票娇羞的过来牵我手,我一脸茫然的说:“不对,是把手机给我。。。。。”
### 准备工作
话不多说,咱们上道具,将APK安装到手机上,这里为了方便演示用模拟器,打开Androidkiller 反编译APK,反编译完后拿到smali 源码,为了更方便分析阅读代码,打开jadx ,导入APK。最后打开DDMS,将程序在模拟器上运行起来。
### 实名认证弹框代码定位分析
上面准备工作做完后,我们就可以开始分析了,将程序在模拟器上运行后界面是这样的,提示我们要进行实名认证。那我们第一步先得干掉这个弹框。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210515124239371.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjAxNDc0OQ==,size_16,color_FFFFFF,t_70)
看到这个大家的第一反应是不是也跟我一样,先去androidKiller 里面去搜索这个弹框上面的关键字,你会发现什么也搜索不到,那会不会该弹框不是在java层实现的呢。我们继续分析,使用DDMS工具进行方法刨析看能不能获取更多的信息,步骤如下
**1.在上面的姓名栏,和身份证栏随便输入一些信息,如下图**
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210515125416280.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjAxNDc0OQ==,size_16,color_FFFFFF,t_70)
**2.打开DDMS工具,选中包名,先把日志清空,选择右上角箭头所指按钮,会弹出如下弹框,选择ok。回到游戏点击提交按钮,然后立马回到DDMS,点击下图2的停止按钮,这样我们就截获到刚才提交一个事件调用到的方法了**
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210515125444934.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjAxNDc0OQ==,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210515130338417.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjAxNDc0OQ==,size_16,color_FFFFFF,t_70)
**3.执行完上面步骤后,我们截获到了这过程中执行的方法,那我们去找关键API函数,如果先去找onClick 点击事件函数,发现没有。那我们再去找dialog 的show 方法发现也没有,那我们只有从其他地方入手定位代码了**
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210515141735954.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjAxNDc0OQ==,size_16,color_FFFFFF,t_70)
上面我们经过一系列方法都没有定位到关键代码,那我们只好去找其他线索,当我们点击返回键时,你会发现又出现了一个新的弹框,如下
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210515142749530.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjAxNDc0OQ==,size_16,color_FFFFFF,t_70)
有过正向开发的经验的同学,应该一眼就能开出来这不是就是Android MD风格的弹框吗,找到这个,我们再去androidKiller 里面去搜索关键字"实名认证提示",这里搜索中文搜不到,还需转unicode 编码,搜索结果如下
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210515143409764.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjAxNDc0OQ==,size_16,color_FFFFFF,t_70)
搜索到一个类,smali 代码阅读不方便,我们打开jadx,根据包名类名去找到该类,jadx会将smali 代码还原90左右,这样方便我们阅读,打开如下。
### 实名认证弹框代码分析
上面我们经过一系列的方法定位到代码,接下来只需要分析它实现的逻辑,然后去修改就好了,接下来我们分析下代码。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210515144604766.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjAxNDc0OQ==,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210515144722197.png)
根据上面两图我们找到了点击返回键的弹框调用方法,但是显然不是我们想要的,咱们继续分析。该类是一个fragment,在onCreateView 中我们发现如下方法。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210515145545764.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjAxNDc0OQ==,size_16,color_FFFFFF,t_70)
分析到这里,是不是一目了然了,这个弹框是用WebView组件加载一个网页显示,难怪之前我们啥也搜不到,分析完该类你会发现,该fragment只干了两件事,加载WebView弹框,所以我们只需要不加载这个fragment,就可以让这个弹框不显示了,在java 代码中我们只需要将onCreateView 方法返回null,就行了,接下来我们去找到对应的smali 代码的对应onCreateView ,如下图直接return-object 0x0
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210515150515434.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjAxNDc0OQ==,size_16,color_FFFFFF,t_70)
### 去弹框验证测试
我们改好smali 代码,再回编译,安装在模拟器上验证测试,如下图,成功去掉了弹框进入到了游戏。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210515151151714.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjAxNDc0OQ==,size_16,color_FFFFFF,t_70)
### 广告代码定位
正当我进入游戏,就玩了一把,准备下一把时给我弹出了一个广告,这能忍,继续干,咱们还是打开DDMS分析,点到广告界面查看日志信息看能不能找到有用的信息,在我点击多次后,界面上出现一个吐司提示,DDMS也捕抓到了日志信息如下图。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210515152747482.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjAxNDc0OQ==,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://img-blog.csdnimg.cn/2021051515282292.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjAxNDc0OQ==,size_16,color_FFFFFF,t_70)
那我们还是老样子先去搜索这个提示信息的关键字,搜索到一个类,并且和DDMS捕获到的日志对应上,我们在jadx中找到该类
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210515153151417.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjAxNDc0OQ==,size_16,color_FFFFFF,t_70)
下图是我们搜索的关键字出现的地方
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210515153704320.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjAxNDc0OQ==,size_16,color_FFFFFF,t_70)
仔细阅读代码,发现该类只是一个工具类,封装了很多功能方法,从上面往下看时,发现一处可疑的方法initialize(),从字面意思来看时初始化的意思,进入到下图箭头所指的方法里面你会发现,这里就是对广告SDK和支付SDK进行初始化的地方。
![在这里插入图片描述](https://img-blog.csdnimg.cn/2021051515451327.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjAxNDc0OQ==,size_16,color_FFFFFF,t_70)
我们找到了广告初始化的方法,那直接注释掉广告不就不会加载了吗,找到对应smali 代码,注释掉该方法TwGameSDK.init(),如下图。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210515155039559.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjAxNDc0OQ==,size_16,color_FFFFFF,t_70)
### 去广告验证测试
回编译,安装到模拟器上,打完游戏后没有弹出广告,成功!
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210515155716279.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjAxNDc0OQ==,size_16,color_FFFFFF,t_70)
### 支付定位
实名认证去了,广告也去了,咱们继续把支付也干掉,咱们点到支付模块,再点击取消,打开DDMS观察log信息,我们会发现如下信息
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210515160336588.png
![在这里插入图片描述](https://img-blog.csdnimg.cn/2021051516010840.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjAxNDc0OQ==,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210515161551438.png)
我们还是老样子,直接搜索支付取消关键字,找到TwMultiPayDialog类,打开jadx去阅读分析,发现调用的是 CallbackManager.onPayCallBack,继续往里找,真正的支付逻辑就浮出水面了
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210515161830323.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjAxNDc0OQ==,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://img-blog.csdnimg.cn/2021051516214676.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjAxNDc0OQ==,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210515162236736.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjAxNDc0OQ==,size_16,color_FFFFFF,t_70)
分析完上面代码,我们只要让code=9999,让他返回成功,然后不就走支付成功的逻辑了吗,那我们直接去找到该类对应smali 代码,修改如下
![在这里插入图片描述](https://img-blog.csdnimg.cn/2021051516260436.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjAxNDc0OQ==,size_16,color_FFFFFF,t_70)
### 支付验证测试
回编译,安装,购买,去游戏里查看道具,成功破解
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210515163045109.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjAxNDc0OQ==,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210515163119639.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjAxNDc0OQ==,size_16,color_FFFFFF,t_70)
### 后记
逆向的过程就是一个不断尝试的过程,就像破案一样,不断的去找线索,去尝试,本文分析中用到了关键字搜索,DDMS日志查看,DDMS方法刨析,这些是在java层逆向分析中经常用到的手段,不断的去尝试,总能找到线索!好了今天的分享就到这,后面还会分享更多的案列,想要反编译工具和样本可以私信我,或在评论下留下邮箱,原创不易,感兴趣的点个赞和关注,谢谢! 大佬,我想要你这破解的愤怒小鸟玩玩{:1_918:} Boluofan 发表于 2021-7-31 10:51
还有几个事请教下 请问楼主对反混淆了解吗?一些反编译出来的源码 方法名和变量名都做了混淆,可读性很差。 ...
一般在实际项目分析中通过hook和方法栈跟方法栈踪来分析代码逻辑,反混淆还是比较困难的,而且可读性也还是很差,至于脱壳可以看看看雪的FART,还有Frida 实现脱壳,,还有一些自动化脱壳工具.脱壳方法很多主要还是针对什么类型的壳 学习一下,感谢分享! 收藏一下说不定哪天用得上 这把狗粮猝不及防... S.L.Kagura 发表于 2021-7-5 11:29
这把狗粮猝不及防...
还得需要个女朋友,提升破解的动力{:301_1000:} 话说最喜欢看这种用女朋友引入的好文了,很有深度,感谢大佬分享{:301_976:} 感谢大佬的激励,能把DDMS操作再细化一下,对新手就更友好了 学习了,谢谢分享 o0蜗牛 发表于 2021-7-5 12:30
感谢大佬的激励,能把DDMS操作再细化一下,对新手就更友好了
如果觉得能帮助到各位的话,后面还会发几篇java层分析实战案列贴子 谷歌版不香吗{:301_998:}