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的编码加密过程将预发送的数据编码加密
然后开启新线程将数据发送到服务端
接收返回的数据并解析
解析返回的数据并打印出来
即可获取数据