首页
社区
课程
招聘
[原创]某动画APP分析
发表于: 2020-4-2 21:03 8539

[原创]某动画APP分析

2020-4-2 21:03
8539

用了这个APP很久了,网上找的修改版都然并卵——测试时发现只改了本地几个功能,不支持嘀哩源和超清源播放——最重要的功能被阉割了。
无聊做一下分析,APP是官网的最新版v4.6(防止日后更新失效,已上传附件)。

反编译后发现APP的类名和方法名都做了混淆,发现smali中的source文件名并未被as去除,可以修复类名混淆。这里为了调试,暂时不修改APP。
载入JEB,定位到关键类info.zzjian.dididh.mvp.model.entity.UserInfo,在getExpire方法下断:

打开APP,JEB调试器附加该进程:

点击APP内头像,成功断下,可以在右边看到此时的局部变量:

双击值可修改,将expire改成 2100-01-01 ,恢复断点并运行:

成功显示会员提示。

回溯定位到另一个方法,该方法判断了是否登录以及VIP是否到期,可以看到许多功能的执行都由该方法决定:

因此只需让该方法返回true,即可免登录使用会员功能。

hook这两个方法即可破解,frida脚本如下:

经测试各种源均正常使用——用frida注入未引起异常,说明APP对签名做了校验。

APP重签名后安装运行,提示如下:

消息是从服务器返回的,抓包看看:

协议头的imei引起注意,找找在哪:

IDA载入libnative-lib.so,定位函数Java_info_zzjian_dididh_util_CheckUtils_getV:

首先从ActivityThread.currentApplication()获取到了Application对象,接着调用Application.getApplicationInfo().className.hashCode()和Application.getPackageManager().getPackageInfo(Application.getPackageName(),0x40).signatures[0].hashCode(),通过计算后拼接字符串返回给了java层。

计算结果也同传给native的参数有关,用frida打印下参数及返回值:

输出如下:

传入的参数为时间戳,dt8re和rt9ws只参与连接,总共有三处数据的计算。
指定下参数为0:

输出如下:

拆分字符串后得到native中三组数据的校验值。
用java重写该校验类,固定住原版数据,算法如下:

将该类编译后放入包名对应的文件夹内,用dx转为dex,再用baksmali转为smali。

这里提供个自己写的java类转为smali的shell脚本,java类不能引入外部包:

执行后会在源码同目录生成该类对应的smali:

将其替换原来的CheckUtils.smali,重新打包签名,测试一下:

成功过native层校验,该so的功能已被取代。

测试后发现不完美,会员的搜索源有6个,我们的只有3个,数据是从服务器返回的,抓会员的包后回溯:


定位到如下两个方法,分别为保存搜索源到SharedPreferences,以及从pref读搜索源:

修改读搜索源的方法,将会员数据patch进去:


退出登录,一切功能均正常使用。


[峰会]看雪.第八届安全开发者峰会10月23日上海龙之梦大酒店举办!

最后于 2020-4-4 23:23 被Fireeye编辑 ,原因: 上传附件
上传的附件:
收藏
免费 5
支持
分享
最新回复 (23)
雪    币: 8395
活跃值: (4951)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
2
分析的很详细,辛苦了
2020-4-3 07:57
0
雪    币: 2107
活跃值: (4482)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
有点吊哦 感谢分享
2020-4-3 10:26
0
雪    币: 312
活跃值: (718)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
感谢分享 金品文章 很详细 学习了
2020-4-3 11:38
0
雪    币: 3778
活跃值: (18450)
能力值: ( LV12,RANK:277 )
在线值:
发帖
回帖
粉丝
5
感谢分享
2020-4-3 12:19
0
雪    币: 3778
活跃值: (18450)
能力值: ( LV12,RANK:277 )
在线值:
发帖
回帖
粉丝
6
请问大佬使用什么抓的包
2020-4-3 14:41
0
雪    币: 312
活跃值: (718)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
大佬 我尝试爆破签名验证没有成功 是否可以指点一下 没有看到在哪里校验呢
2020-4-3 14:42
0
雪    币: 657
活跃值: (68)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
8
0x指纹 请问大佬使用什么抓的包
用的是Charles
2020-4-3 14:54
1
雪    币: 657
活跃值: (68)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
9
tianhaoday 大佬 我尝试爆破签名验证没有成功 是否可以指点一下 没有看到在哪里校验呢
签名计算是在so里生成,在服务器校验的,协议头的imei就是计算的结果。把计算的方法重写一下就可以
最后于 2020-4-3 14:58 被Fireeye编辑 ,原因:
2020-4-3 14:57
0
雪    币: 3778
活跃值: (18450)
能力值: ( LV12,RANK:277 )
在线值:
发帖
回帖
粉丝
10
好奇怪,我也是Charles,但是没有抓到那个返回“软件被恶意修改....”的包,再次感谢大佬分享
2020-4-3 15:02
0
雪    币: 657
活跃值: (68)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
11
0x指纹 好奇怪,我也是Charles,但是没有抓到那个返回“软件被恶意修改....”的包,再次感谢大佬分享[em_63]
登录或者点击标题,切换到嘀哩源或者超清源就能看到了
最后于 2020-4-3 15:12 被Fireeye编辑 ,原因:
2020-4-3 15:11
0
雪    币: 312
活跃值: (718)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
Fireeye tianhaoday 大佬 我尝试爆破签名验证没有成功 是否可以指点一下 没有看到在哪里校验呢 签名计算是在so里生成,在服务器校验的,协议头的imei ...
受教了,感谢答疑解惑
2020-4-4 00:22
0
雪    币: 910
活跃值: (165)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
大佬你好,我想请问下,这13904573343L、15821486092L、17165845311L三个Long类型的数值是怎么来的呢?貌似是getV(0)得到的结果然后去除那两个字符串后拆分得到的?为什么传参数传0就可以知道可以拿这个三个数固定?然后
        String check1 = Long.toHexString(13904573343L + ts * 2);
        String check2 = Long.toHexString(15821486092L + ts);
        String check3 = Long.toHexString(17165845311L + ts);
这段代码,13904573343L + ts * 2、15821486092L + ts、17165845311L + ts 在IDA中怎么体现的呢?一直找不到。求帮忙解答
2020-4-4 00:33
0
雪    币: 657
活跃值: (68)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
14


IDA F5后代码显示不全,下面是JEB的反编译:

固定参数后返回值也固定了,说明只有参数在变。能做的无非是参数和hash做运算,把参数置为静态值(0、1、2、3)测试,就能直接找到三组数据的算法(因为太明显了),也省的要取hash再计算——当然具体问题还是要具体分析,如果是再稍微复杂一点点的算法就要另当别论了。
翻译上面的代码就是这样(要先取hash):

public String getV(long ts) {
        long hash1 = -1916912749L;
        long hash2 = 1344359219L;
        long check1_ = ts * 2 + hash1 + 15821486092L;
        ts += 15821486092L;
        long check2_ = ts;
        ts += hash2;
        long check3_ = ts;
        String check1 = Long.toHexString(check1_);
        String check2 = Long.toHexString(check2_);
        String check3 = Long.toHexString(check3_);
        return check1 + "dt8re" + check2 + "rt9ws" + check3;
}

结果是一样的。

最后于 2020-4-4 08:51 被Fireeye编辑 ,原因:
2020-4-4 02:09
0
雪    币: 657
活跃值: (68)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
15
ZvLoveL 大佬你好,我想请问下,这13904573343L、15821486092L、17165845311L三个Long类型的数值是怎么来的呢?貌似是getV(0)得到的结果然后去除那两个字符串后拆分得到的? ...
至于加的那一串数字,经测试是开发者的手机号(;一_一)
2020-4-4 09:57
0
雪    币: 29
活跃值: (290)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
16
jeb是买的正版吗?有调试功能?
2020-4-4 10:14
0
雪    币: 657
活跃值: (68)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
17
endlif jeb是买的正版吗?有调试功能?
用的是国外大神分享的https://forum.reverse4you.org/t/jeb-3-7-0-merry-xmas-edition-by-dimitarserg/11035
最后于 2020-4-4 10:27 被Fireeye编辑 ,原因:
2020-4-4 10:22
1
雪    币: 910
活跃值: (165)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
Fireeye ![](upload/attach/202004/657854_28STUN58N6GUYWJ.png) IDA F5后代码显示不全,下面是JEB的反编译: ![](upload/attach ...
好的,谢谢大佬。又学会一招,才知道JEB可以逆so,我再理理。
大佬,我用jeb打开so,怎么没有你截图的那种效果?是你自己修改了变量名么?我在jeb里还是没有找到那几串数字。是需要设置哪里么?求指教。
最后于 2020-4-4 18:35 被ZvLoveL编辑 ,原因:
2020-4-4 16:00
0
雪    币: 657
活跃值: (68)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
19
ZvLoveL Fireeye ![](upload/attach/202004/657854_28STUN58N6GUYWJ.png) IDA F5后代码显示不全,下面 ...
是要改变量名。JEB里只会有15821486092L这一串数字,另外两串是这一串数字同hashcode计算得出来的
2020-4-4 19:03
0
雪    币: 910
活跃值: (165)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
Fireeye 是要改变量名。JEB里只会有15821486092L这一串数字,另外两串是这一串数字同hashcode计算得出来的
好的,谢谢大佬,我自己在研究琢磨下。
2020-4-4 19:07
0
雪    币: 17
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
21
学习了。
最后于 2020-4-13 16:26 被bobbiedev编辑 ,原因:
2020-4-13 16:19
0
雪    币: 17
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
22
能百度网盘分享下JEB吗?
最后于 2020-4-13 16:21 被bobbiedev编辑 ,原因:
2020-4-13 16:21
0
雪    币: 218
活跃值: (381)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
学到了啊,感谢大佬
2020-5-27 15:09
0
雪    币: 23
活跃值: (198)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
大佬能把你的JEB分享下吗
2020-5-27 21:56
0
游客
登录 | 注册 方可回帖
返回
//