[TOC]
前言
最近拾起了我的破MI6想玩玩一些BT手游,于是乎找了一些“*奏网”的软件合集,不成想玩之前要分享他们团队的链接到200人的Q群3次才可以玩,我一个连QQ都没有的人,只能动起了不太好的心思...
鉴于论坛规则,我这里并不放出成品,请大家自行搜索下载,理论上思路正确,都可以搞定的。此篇重在分享QQ群引流的破解思路,软件中出现的广告、更新和弹窗引流并不在此篇讲解范围。
工欲善其事必先利其器
好戏开场了
1.安装应用并分析:
Screenshot_2020-06-02-14-04-35-156.jpg (125.73 KB, 下载次数: 3)
下载附件
软件启动页
2020-6-2 15:44 上传
这里一共有三个按钮可点击:
其实这个引流的逻辑并不完善,你可以通过切换QQ分享页或者分享至我的电脑完成3次分享,但毕竟我是个没有QQ的杀手...
如果看到这里你用的是电脑的话,那就用AndroidKiller_v1.3.1进行下一步。如果是Android手机的话就用MT管理器2.9 and NP管理器2.7.4进行下一步,为什么Android手机是两个类似的软件呢,因为我没有MT管理器的会员!如果你用的是Ios手机,那可以关闭教程了...
此篇以AndroidKiller_v1.3.1为主,事实上用MT等工具更简单...
2.用AndroidKiller打开并尝试搜索关键字
批注 2020-06-02 132731.png (134.21 KB, 下载次数: 5)
下载附件
搜索本团队结果页
2020-6-2 15:45 上传
很遗憾,虽然一顿操作猛如虎,但是并没有什么卵用。这里要说明一下,虽然截图显示是搜索“本团队”三个字,但实际搜索前需要先点击左下角aA按钮,然后选择文本转Unicode后搜索。比如我们接下来搜索“分享”这两个字:
批注 2020-06-02 142007.png (160.66 KB, 下载次数: 3)
下载附件
搜索分享结果页
2020-6-2 15:46 上传
3.找到关键代码并通过Java反编译去理解
这里的smali_classes5\...\MainActivity.smali非常可疑,为什么呢可疑呢?因为我把所有搜索结果都点进去看了一遍,确定了这个是...
进入这个文件后通过方法列表跳转到onclick方法,为什么是这个方法,因为你是通过点击这个方法去分享并累计次数的:
批注 2020-06-02 142331.png (535.51 KB, 下载次数: 3)
下载附件
方法页
2020-6-2 15:47 上传
我的习惯是找到关键点先通过java源码看看逻辑,因为smali我不会...
不知道是这个app的问题还是我AndroidKiller有问题,当我点击使用工具查看当前JAVA源码按钮时,会弹窗提醒我未找到对应的APK源码,请确认是否已丢失,所以我用NP管理器的Java反编译功能截个图给大家看看,查看Java源码的方法很多,巧的是我电脑都没有...tips:MT管理器的Java反编译需要会员才可使用。
Screenshot_2020-06-02-14-34-10-763_player.normal.np.jpg (352.13 KB, 下载次数: 2)
下载附件
反编译1
2020-6-2 15:47 上传
这里可以看到一个远程服务器保存的txt文件,我们用能网上冲浪的浏览器打开looklook:
批注 2020-06-02 143845.png (125.36 KB, 下载次数: 2)
下载附件
txt文本内容
2020-6-2 15:48 上传
所以知道我们为什么搜不到关键字了么?人家用txt文本获取的...做了这么多年程序猿,我也属实是又增加了一些奇奇怪怪的知识...
Screenshot_2020-06-02-14-34-27-459_player.normal.np.jpg (359.18 KB, 下载次数: 4)
下载附件
反编译2
2020-6-2 15:48 上传
Screenshot_2020-06-02-14-34-57-999_player.normal.np.jpg (300.62 KB, 下载次数: 2)
下载附件
反编译3
2020-6-2 15:48 上传
通过反编译的源码,我们大致看出了整个逻辑是怎样的。首先是请求这个txt文件,然后将文件内容填充到当前Activity的组件中,当我们点击相应按钮后,根据填充内容进行判断后进入相应响应。而我们的重点在:
if(this.mShareCount > this.Info.getShareCount()){
startActivity(new Intent(this, this.main));
finish();
}
这个判断很显然告诉我们,只有当本地变量mShareCount大于txt文本变量getShareCount后,才可以正常进入软件。
所以我们的思路逐渐就清晰起来了:
[ol]
[/ol]
返回我们的smali代码界面的onClick方法处,完了,一堆看不懂的代码怎么办,没事,还记得Java代码中有个finish方法么,我们在onClick方法中找到这个调用,你可以通过Ctrl + F搜索或者凭借你多年的消消乐眼力硬找,不过我推荐用第一种方法...
批注 2020-06-02 145838.png (250.69 KB, 下载次数: 3)
下载附件
finish
2020-6-2 15:49 上传
到了这里还是没头绪,别着急,在Java源码中我们知道,finish方法前面只有一个 if判断,所以向上看,锁定第一个判断。在这里我推荐你用第二种方法,因为向上不会超过几行的...
...
if-le v0, v1, :cond_4
.line 44
new-instance v0, Landroid/content/Intent;
iget-object v1, p0, Lcom/Share/MainActivity;->main:Ljava/lang/Class;
invoke-direct {v0, p0, v1}, Landroid/content/Intent;->(Landroid/content/Context;Ljava/lang/Class;)V
invoke-virtual {p0, v0}, Lcom/Share/MainActivity;->startActivity(Landroid/content/Intent;)V
.line 45
invoke-virtual {p0}, Lcom/Share/MainActivity;->finish()V
...
在往上的第7行(不包含finish这行)中,我们发现了if-le这个方法,在smali语法中,判断函数都是以if-x这种格式存在的,在这里你可以通过baidu/google/bing等搜索引擎查询if-le的作用,或者你可以用鼠标点击一下这个方法,AndroidKiller会提示你该方法的作用,我还是推荐第二种...
if-le vA, vB, :cond** 如果vA小于等于vB则跳转到:cond**
你肯定会疑惑,明明Java反编译的代码中是大于号 >怎么在这里变成了小于等于 ,是不是还得往上找,这里我们再往上看看smali的代码:
...
invoke-virtual {v1}, Lcom/Share/model/AppInfo;->getShareCount()I
move-result v1
if-le v0, v1, :cond_4
.line 44
new-instance v0, Landroid/content/Intent;
...
通过鼠标点击我们得知move-result v1这个函数的意思是移动上一次方法调用的返回值给v1,那上一次调用的方法是什么呢?我们再往上看一行...
没错,我们看到了getShareCount()这个方法,这个方法顾名思义,就是从txt文本中获取需要分享的总次数的,目前设定的是3次,也就是说v1 = 3。
v1我们知道是几了以后,那么v0用屁股都知道了,肯定是本地变量,用于存储分享了几次的计数器,那肯定是从0开始的。
所以0肯定小于等于3,那么if-le v0, v1成立,跳转:cond_4处,然而我们并不希望跳转到别的代码处,因为我的屁股告诉我,等式下面才是成功代码的关键...
my ass says:
if-eq vA, vB, :cond** 如果vA等于vB则跳转到:cond**
4.修改smali代码并编译签名输出
我们将if-le改成if-eq让等式不成立不跳转,继续执行下面的成功代码即可...
批注 2020-06-02 153419.png (308.69 KB, 下载次数: 4)
下载附件
编译
2020-6-2 15:49 上传
本次分享到此结束,我这个人比较懒,一般都是要用什么就研究什么,有没有下期就看大家的意见了...