某导航提供的音乐服务(音乐e栈),和虾米合作的,需要付费使用,前段时间本来想上网搜个破解版,结果没搜到,索性自已分析了一下它的交互方式,找出了个通过充值认证来延长服务有效期的方法。方法本身不复杂,主要是因为它的认证机制略显简陋,本文主要从技术角度来说明过程,仅供参考学习。

1 原始界面

音乐e栈服务过期

如上图,插入经过车机初始化过的TF卡后,启动音乐e栈客户端,显示当前服务有效期为0天,并提示需要充值续费。如果点击下载专辑的按钮,提示不允许下载。

2 寻找入手点

既然提示让续费,那就看看续费过程是什么样子。

先随便输个卡号密码试试:

充值卡无效

竟然用CS架构来做充值认证,实在是土的掉渣,就从这里入手了。

3 交互过程

把刚才进行充值时的报文用Wireshark抓下来,看看它是如何交互的。

1) 报文

充值失败的报文

可以看到,充值认证的流量走的是TCP协议8080端口,对端连接的服务器地址是42.156.140.44,这个暂时放一边,先来看看请求和响应报文分别填了什么内容。

2) 请求消息

请求消息内容

上图中可以看到,充值请求消息虽然走的是8080端口,但实际内容并非HTTP协议。

TCP负载的开头44个字节是一段二进制数据,估计是发送充值消息的结构体头,这里我们不关心;接下来就一段xml格式的内容,其中xml内容直接是用明文传输,并且单词基本都在四级词汇范围内,可以清楚的看到它发送了车载设备的ID号、服务剩余天数,以及刚才输入的充值的卡号、密码等信息。

因为这个是请求消息,不需要对它关注太多,下面来看看服务的响应消息。

3) 响应消息

响应消息内容

可以看出,响应消息和请求消息的格式基本一样,follow一把看的更清楚些:

Follow Stream

注意响应消息xml中的resultremain_days字段,可以看到result字段的值为102,该值为充值的返回值;另外一个remain_days值为0,它便是服务器认证后的有效时间。

4 思路

从上面的报文分析,充值的交互其实是简单的一请求加一响应消息,客户端将车载设备的ID及充值卡号、密码发送给服务器,然后服务器校验认证充值卡是否有效,然后返回充值结果,并且将充值后的有效期也带给客户端。

可以想到,通过伪造一个认证服务器,当充值的时候,让客户端去连接伪造的服务器,然后服务器返回充值成功的消息,即有可能骗过客户端认为充值成功。

伪造过程中所需要的服务器成功消息,可以尝试通过修改上面抓包内容来构造。

5 主机重定向

前面3.2节中提到到过,客户端所连接的服务器地址是42.156.140.44,相信不会有人把IP直接写死在代码里的,起码是个域名,那一定会发DNS请求,DNS解析结果会缓存在主机上,执行一下下面的命令,来看看当前Windows主机上的DNS缓存列表:

ipconfig /displaydns

从列表里搜索IP地址,找到如下信息:

    s2.xiami.com
    ----------------------------------------
    记录名称. . . . . . . : s2.xiami.com
    记录类型. . . . . . . : 1
    生存时间. . . . . . . : 50
    数据长度. . . . . . . : 4
    部分. . . . . . . . . : 答案
    A (主机)记录  . . . . : 42.156.140.44

看来域名就是s2.xiami.com了,修改Windows的hosts文件(%windir%\system32\drivers\etc\hosts)中添加下面一条关联项,将s2.xiami.com指向伪造的服务器(这里直接使用本机环回地址):

127.0.0.1 s2.xiami.com

6 伪造服务器

伪造服务器越简单越好,直接用Python写个TCP的服务器,只要有客户端连接发消息(假设只有目标程序会连接,也不用管发的是什么消息),就直接返回伪造好的内容。

代码如下所示,服务器响应的数据先从真实服务器的TCP负载拷贝过来:

伪造服务器代码

7 响应消息

服务器正常工作了,下面开始修改响应消息,想办法骗过客户端认为充值成功。

1) 修改响应码

先从响应码(result)开始,原始值是102,先减1试试101

伪造服务器响应101

进行充值操作,看看客户端收到后是什么情况:

充值卡已被使用

如上图,提示信息变成了“该卡已被使用过”,看来方向是对的,再改成100看看:

伪造服务器响应100

执行充值操作:

客户端充值成功

如上图,客户端提示“账户充值成功!”。

2) 修改有效时间

虽然提示充值成功,但是有效期还是显示0天,下面把remain_days改成99试下:

伪造服务器响应100并且有效期99天

再试下充值操作:

客户端充值成功并且有效期延长99天

可以看到,充值成功,并且有效期也变成了99天。

8 检验结果

随便选择一张专辑下载,可以发现已经可以随意下载了:

成功下载专辑

下载完成后同步到车载设备上,可以发现车载设备上显示的服务有效期也被延长了99天:

车载服务有效期

另外补充一句,充值显示成功后,还需要把hosts恢复回去,因为后面的专辑下载等操作还需要连接真实的服务器。

9 后记

后来发现其实都不用等到充值那一步再伪造服务器,其实在软件启动的时候就向服务器发送过认证请求,直接在那一步处理的话使用会更方便些,不过反正是能任意续期了,就先这样吧。

这个问题有几次联系过厂家说明情况,但都没有答复,从上次发布版本的时间来看,估计已经一年多没有维护了,这里把方法公开出来,仅供学习参考,有兴趣的可以自己试下。


Comments