首页
社区
课程
招聘
[原创]记掌上大学天翼校园的逆向分析
发表于: 2016-12-9 18:12 22654

[原创]记掌上大学天翼校园的逆向分析

2016-12-9 18:12
22654

    10 月份之前电信以迅雷不及掩耳之势更新了新的验证方式(其实很早就更新,还能用,我就抱着得过且过的心态没搞新的),我的一大波设备就没网上了,没网上了,没网上了,然后顺带我国庆7天的假期就这样泡汤了6天(由于样本的时差思路被误导了)。后来就有了长达10天的真空期没干啥正事,然后就拖到了前几天把这个shit一样的东西给破了。(真正需要的apk部分只有1.36MB,而掌上大学就有50多MB想想都觉得可怕,不知道里面有多少后门)。

0x0(其实我不知道各路大神为什么都喜欢这个开头,嗯,作为菜鸡我就跟下风)

    这个“掌上大学”具体开发是谁就不知道(没社到),但是有人给我发过类似的源码(源码GitHub上)。校园网登录验证模块跟这个令人恶心没一点用的掌上大学绑到了一块成了一个应用(后期有人给我发过独立的版本),强行让你吃口翔冷静冷静。我在搜索有关于“天翼校园网”和“掌上大学”信息的时候无意在看雪发现了一个帖子,进去看了下,想着会有前辈的成果,看来没这样的好事让我碰到了。没办法自己动手丰衣足食。从这类软件的特性来分析,限制一人一号(说白了是设备),一个号只能两个设备登录。以前听说过Dr.com 的好像是绑定Mac地址来实现的,但是根据我hack上个版本的经验来看,应该还是通过ip地址来进行验证,当ip通过了验证就传输数据,没通过验证就跳转到到指定的网页让你下载软件,登录。软件只有四个平台,Windows、OS X、Android 和 iOS这四个平台,由于本人工作平台长期为 OS X 和 Android 比较熟悉,所以从这两个平台下手。
0x1

    按标准姿势来,反编译。

    

    /lib 目录,

    

    然后我发现如果手机是x86的丫的是不是就没法上网了???!!!

    

    过滤一下,libUtilsLib.solibcdcss-jni.so 和 libDyKey.so 这三个可能有我要的东西,下一个看 /AndroidManifest.xml

    

    例行加一条,添加 Debug 权限,加上我这一条,这个应用总共申请了56个权限,我都开始怀疑是不是有木马了后门了。

    

    入口点,刚才从上往下看发现了一堆广告 SDK,呵呵了。找到入口点之后,直接进去找 smali 发现完全对不上号,然后我凭着幸运E发现了之前版本(上个版本)的包路径。

    

    根据之前的看见的几个动态链接库可以直接锁定在 dykeylib 里面的了。

    
    

    四个native方法,从传入 jstring 来看 Code 和 Decode 不用说了,肯定是有关加密或者解密的,SetDir 这个暂时不清楚,Info 获取一些信息什么的,剩下要去 PortalCipher.smali 看一下。

    
    

    这个是在 /data/应用程序/files 下的一个目录(反编译的太长了,我只截一部分图了)。

    

    然后发现了一个有趣的东西“ZSM”,看起来是一个Key文件之类的云云,然后发现了这个在 asset 目录下的动态链接库,

    

    估计是个加密过的动态链接库,看这英文还是默认key来着,先放一边去,继续看smali,

    

    锁定目标,It’s show time.

    

    只返回 true,解决,(如果没有登录验证,访问任何网页都会302到下载客户端的网页,网页的 URL 的 CGI 会有本机 ip 地址和 nasip 信息,他要将本机当前 dhcpd 的 ip 地址和从网页 URL CGI 中获取到的进行对比,为此有了上面的checkip方法)

    

    由于,这个 app 设计是拿配置文件走类之间的通信的,嗯,我就照着他的来了,写了对应的 smali 获取他已经从 URL 获取好的的 ip,下面有个 getip 的方法,写法相同就不贴了。

    

    Boom!!!Oh,Shit! 看到这个第一反应没的说,去分析 ZSM 吧。
0x2


    
    

    adb pull 拉出来看了一下,其中 initial.zsm 就是那个 libzsm.so,剩下在 /zsm 的估计是从验证服务器下载下来的,

    

    看到这里这个文件,大致就清晰了,

    起始三位:

 001


    第四位代表接下来一段数据的长度 
(0x40) = 64:43B61A6B4A8FC5794E7BAB3C4C0ABFDB3B6D6B228FFF8BDE9AE4562E903B76A8


    再接下来的一位作用同上 
(0x24) = 36:85C56B2A-B223-4119-BD92-6646C623C1C1

    这个看起来像UUID,可能是Key的唯一标识符,验证算法有可能是动态获取的。

    以上是这个 Key 的基本信息,剩下的数据头我去谷歌了一下

    5D 00 00 00 01 78 45 00 00


    
    

    确定了是Lzma的压缩算法了,后面跟着的四位估计是解压完之后的大小。然后写程序,后面那一坨数据并不是常规的 Lzma 压缩后的数据,基本断定是加密过的,然后我就感觉这丫的肯定找了其他人搞了外包了,防 hack 水平跟上次的比简直是质的飞跃,不过,从前期搜集的资料来看,这东西存在有一定年头了,结果还是没有 Linux 版本,唉,看来是这个任务本来是要交给Linuxer完成的吗(大雾。

    

     从libDyKey.so下手,
没什么好说的了,就这几个慢慢找吧,

    

    loadZsoMoudle 里面有个代码块是这样的,老司机们一眼估计就能看出是字节异或了吧(当时我拿ida动调锁定到了这里,我还是太菜),数据经过异或之后再拿来解压就没问题,然后坑点就紧随其后的来了,在我拿到样本的当天,电信就更新了新的加密方法(原因是因为一哥们早很多天改了smali:GDOU-Lily,电信针对此情况更新算法TAT)。拿ida脱壳的时候确实脱下来了,但是只是没更新之前的,这就很尴尬很尴尬了,而且当时没有完成静态脱壳,没办法,就拿这个老样本分析了,然后就造成了一个天大的误区,我分析完样本,发现完全没有任何获取 ip 地址的函数,动调,也没有发现有任何加密函数,没办法,我连续几天反复测试 smali 传送给 so 库的数据是不是有问题,TAT。至此,国庆假期也就过完了,中间一段时间由于有其他事就搁浅了一段时间。分析出来如何静态脱壳之后,脱掉新的样本的壳,我才意识到自己犯二了。

    

    关于脱壳程序,嗯,就这样写,继续分析dump出来的样本,

    


    当我看见这几个函数的时候,真觉得自己 SB,犯了那么时间的错误,浪费了那么多时间,


    
    
    


    找到这个几个函数的调用位置,当 socket () 和 bind () 函数没有返回成功值的时候,执行0x1952,将加密后的需要加密的ip地址替换为127.0.0.1,自此,就没什么好疑惑的了,将blt和bne换成nop就可以了,然后把刚才改好的 so 库压缩异或回去就可以了,再次之后已经可以成功登陆了。



后记


    本来想对应用添加 hook 一劳永逸的解决问题并可以分发,但是 hook 完之后进程莫名其妙的卡死,原因不明,之后我会给出我的 hook 版本的代码,如果有兴趣的话还望各位大神赐教一下如何导致的线程卡死,虽然不是很完美,但是这个结局我自己还算是可以接受了吧,终于可以愉快的用其他设备上网了TAT!



以下是我 hook 的源代码和 zsm 脱壳源代码,hook 框架来自:Android Inline Hook掌上大学app

[注意]APP应用上架合规检测服务,协助应用顺利上架!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (19)
雪    币: 292
活跃值: (153)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
好幸福啊。。。我们大学开WIFI都动态监测,动态口令,手点文字验证码,客户端加的VMP壳。

脱壳都是奢望。。还好我毕业早
2016-12-9 20:30
0
雪    币: 41
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
额...我就是那个坑点的作者
2016-12-9 23:00
0
雪    币: 38
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
其实用个虚拟ip就可以欺骗这段代码
比如
在安卓终端随便拿个网卡wlan0
在root权限执行ifconfig wlan0:1 校内网的ip(clientip)
之后随意登录,请叫我雷锋
2016-12-12 23:52
0
雪    币: 170
活跃值: (187)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
lzma 那段东西需要解密才能解压  
解压出的算法和 zam 那串唯一标识符 对应  
动态获取算法

获取zam ,解密zam ,调用算法进行登陆, 估计这样是最好的了
2016-12-13 10:18
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
如果能将数据的加密算法破解出来,要我就将登录程序直接写到路由器里面,这样连登录都省了
2017-3-12 17:41
0
雪    币: 88
活跃值: (431)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
dunqm 如果能将数据的加密算法破解出来,要我就将登录程序直接写到路由器里面,这样连登录都省了
github是有人对这个登录账号加密有个发布的
2017-3-12 18:02
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8

我将楼主的脱壳程序编译后来对我们学校的ZSM文件进行反编译时总是在异或解密那地方异常错误。。。

2017-3-12 19:34
0
雪    币: 67
活跃值: (347)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
dunqm 我将楼主的脱壳程序编译后来对我们学校的ZSM文件进行反编译时总是在异或解密那地方异常错误。。。会不会是ZSM和异或的解密方法不同。。。。
不支持 windows 下的 zsm 文件,如果可以留样本给我
2017-3-17 15:11
0
雪    币: 67
活跃值: (347)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
Akkuman github是有人对这个登录账号加密有个发布的
在哪里,虽然我推断出来,但还没时间实现,有现成的我就要去捡了。
2017-3-17 15:12
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
天下有敌 不支持 windows 下的 zsm 文件,如果可以留样本给我
这个你看看
上传的附件:
  • a.zsm (28.00kb,14次下载)
2017-9-5 18:14
0
雪    币: 222
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
哇⊙∀⊙!我估计要捣鼓好久才会懂
2017-9-5 18:26
0
雪    币: 465
活跃值: (398)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
楼主有个问题问你,脱壳的是linzsm.so  文件吧?
a.zsm 脱不了壳。
2017-9-7 12:30
0
雪    币: 29
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
14
zsmparser编译好的有没有大佬能发一份
2020-10-24 18:41
0
雪    币: 19
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
15
liamluo zsmparser编译好的有没有大佬能发一份
找我啊
2020-11-5 14:26
1
雪    币: 19
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
16
留个联系方式,算法我都有的,交流一下
2020-11-5 14:26
0
雪    币: 67
活跃值: (347)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
你们还在搞这个嘛?
2020-12-1 17:04
0
雪    币: 29
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
18
proxiti 留个联系方式,算法我都有的,交流一下
加q1153563035
2020-12-2 09:29
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
19
我还在 已经用frida主动调用damod的相关方法完成了加解密,由于不会反汇编。还是无法脱离手机 Q1029374115
2021-10-19 20:32
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
20
天下有敌 你们还在搞这个嘛?
楼主留个联系方式交流咯
2021-10-21 02:30
0
游客
登录 | 注册 方可回帖
返回
//