一次基于Socket通信的App的分析

1.App介绍

该App是一个股票数据查看软件,可以查看股票的交易数据,K线

数据
分时线
K线

2.APP分析

由于APP逻辑复杂故只列出有用部分

2.1.MyApp->onCreate

APP经过加壳,脱壳后使用MT绕过签名效验重打包成功

壳

在自定义的Application的onCreate方法中进行一些数据的初始化

图片.png

读取配置文件中的配置

图片.png

解析assets文件夹中的MbUserMarket.xml文件存入mPBMarketArraymHomeMenuMarkets

图片.png

解析文件pbtransclnt.xml存入CPDDataDecode的静态数组g_vDataPackage设置so库的DesKey

图片.png

读取main.cfghq_addr.ini文件中的服务端地址

图片.png

2.2.SplashActivity->onCreate

直接发送handlerMessage

图片.png

对应操作

图片.png

initCodeTable()中尝试从文件中加载数据

图片.png

doLogin()进行登录请求

图片.png

然后将参数编码加密后调用addSendData方法

图片.png

编码方式为:将参数用|分隔然后在转换为字节数组

图片.png
图片.png

加密方式根据参数确定是否DES加密,Zlib压缩,然后将发送的数据的信息存入前12位

图片.png

完成后将数据加入到GlobalNetConnectNetSendThread
如果是mHQPushNet则使用第二个端口

图片.png

然后启动NetSendThread线程(run方法代码较长只列出关键部分)

首先读取在mApp中加载的服务器地址读取后直接尝试连接,删除连接成功外的所有地址然后检查欲发送的数据是否合法

图片.png

上图 连接成功后将成功的地址记录

图片.png

然后将欲发送数据写入SendByteBuffer

图片.png

然后写入Socket

再从Socket中读取回复

图片.png

回复的数据解密(也就是刚才分析的加密的逆过程)
解析完成后如果设置了接受消息的Handler,则会发送消息

图片.png

登录成功后 请求MarketInfo,并根据第一次登录返回,用另一网络线程登录
(请求过程与登录过程类似 故不再诉)

图片.png

请求MarketInfo成功后 解析MarketInfo并请求CodleTable

图片.png

解析成功后记录数据 并保存为文件

图片.png

2.3.其它

其它的数据请求与上述过程类似,不再重复

3.模拟客户端获取数据

既然已经了解客户端与服务端的通信过程,则可以模拟客户端对服务器收发数据

图片.png

首先模仿App的编码加密过程将预发送的数据编码加密

图片.png

然后开启新线程将数据发送到服务端

image.png

接收返回的数据并解析

image.png

解析返回的数据并打印出来

image.png

即可获取数据

image.png