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



2.APP分析
由于APP逻辑复杂故只列出有用部分
2.1.MyApp->onCreate
APP经过加壳,脱壳后使用MT绕过签名效验重打包成功

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

读取配置文件中的配置

解析assets文件夹中的MbUserMarket.xml文件存入mPBMarketArray和mHomeMenuMarkets

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

读取main.cfg和hq_addr.ini文件中的服务端地址

2.2.SplashActivity->onCreate
直接发送handlerMessage

对应操作

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

doLogin()进行登录请求

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

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


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

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

然后启动NetSendThread线程(run方法代码较长只列出关键部分)
首先读取在mApp中加载的服务器地址读取后直接尝试连接,删除连接成功外的所有地址然后检查欲发送的数据是否合法

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

然后将欲发送数据写入SendByteBuffer

然后写入Socket

再从Socket中读取回复

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

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

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

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

2.3.其它
其它的数据请求与上述过程类似,不再重复
3.模拟客户端获取数据
既然已经了解客户端与服务端的通信过程,则可以模拟客户端对服务器收发数据

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

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

接收返回的数据并解析

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

即可获取数据
