点击上方↑↑↑蓝字[协议分析与还原]关注我们
“ 解密及完全解析通da信股本变迁gbbq权息文件。”
前些天,被一位陌生人耍猴了,很不开心,求安慰。这个人,姑且称为讨厌的家伙吧,找我分析通da信gbbq文件的解密算法,报价后满口同意,并提了一堆要求,让我加班加点给他搞定,却在帮他搞定后喊穷乱压价,这个讨厌的家伙真的很是无耻。
言归正传,之前分析过通da信TCP长连接数据的算法:
它的数据是压缩未加密的。
通da信的资源很丰富,大量的第三方软件依赖它来实现,而在通da信安装目录下的的\T0002\hq_cache目录内,存在gbbq和gbbq.map两个文件,它包含了中国证券市场有史以来所有的股本和权息信息,非常的完整。
另外,通da信有很多不同的券商定制版本,例如招商证券的智远一户通等,皮不一样,本质相同。
gbbq是加密的,而gbbq.map文件则是未加密的很多数字,协议分析与还原公众号将介绍前者解密的方法,并对解密后的数据格式进行解析,然后对后者的含义进行解释,让大家有个开心的体验,掌握第一手的数据,是快人一步的前提。
另外,后续还将对同花顺等软件进行分析,实现一些小功能,有兴趣的可以找我聊聊(微信号ProtoSec)。
01
—
gbbq文件解密
使用二进制编辑器(例如UE)打开gbbq文件,会看到好多的二进制数据,当然是需要解密的:
仔细观察,头四个字节应该是长度相关的数据,为记录的条数,每条记录29字节,可以去算一算,文件大小对得上,根据分析,算法为3DES,每条记录的前24字节加密,而后5字节没有加密。直接上解密的核心代码,C的:
unsigned char *pKeyNow=key;
unsigned char *pDataNow=*pdata+4;
int count=*(int*)*pdata;
while (count && pDataNow<*pdata+insz)
{
for (int i = 0; i < 3; i++)
{
unsigned int eax = *((unsigned int*)(pKeyNow + 0x44));
unsigned int ebx=*((unsigned int*)(pDataNow));
unsigned int num = eax^ebx;
unsigned int numold = *((unsigned int*)(pDataNow + 0x4));
for (int j = 0x40; j > 0; j = j - 4)
{
ebx = (num & 0xff0000) >> 16;
eax = *((unsigned int*)(pKeyNow + ebx * 4 + 0x448));
ebx = num >> 24;
eax += *((unsigned int*)(pKeyNow + ebx * 4 + 0x48));
ebx = (num & 0xff00) >> 8;
eax ^= *((unsigned int*)(pKeyNow + ebx * 4 + 0x848));
ebx = num & 0xff;
eax += *((unsigned int*)(pKeyNow + ebx * 4 + 0xC48));
eax ^= *((unsigned int*)(pKeyNow + j));
ebx = num;
num = numold^eax;
numold = ebx;
}
numold ^= *((unsigned int*)pKeyNow);
unsigned int *pInt = (unsigned int*)pDataNow;
*pInt = numold;
pInt = (unsigned int*)(pDataNow+4);
*pInt = num;
pDataNow = pDataNow + 8;
}
pDataNow = pDataNow + 5;
count--;
}
这里的key是已经初始化好的密钥结构体数据块,具体的过程就是几次异或循环。
解密后,得到明文的数据文件:
诶,还是有乱码,怎么回事呢,其实,这是因为数据本来就是二进制的,需要对数据格式进行解析,继续看后面。
02
—
gbbq文件数据格式解析
股本变迁gbbq权息文件解密后得到的文件是二进制格式,去除文件前四个字节后,每29字节为一条记录,每条记录里面的数据字段如下:
其中,m为市场类型,占1字节,0为深市,1为沪市。股票代码为字符串,占7字节,其中最后一字节为0。日期为整数,占4字节,为年月日的格式,如图中8DA72F01转下字节序,即为19900301,t为数据类别,占1字节,不同的t值表示不同的数据类型,t值取值区间为1~14,根据t的值不同,之后的四个数据含义不同,数据1、数据2、数据3、数据4这四个数据均是float型数据,各占四字节。
下面列出不同数据类别t的含义以及对应的四个数据的含义:
protosec数据类别t
1 除权除息
数据1 分红
数据2 配股价
数据3 送转股
数据4 配股
2 送配股上市
数据1 前流通盘
数据2 前总股本
数据3 后流通盘
数据4 后总股本
3 非流通股上市
数据1 前流通盘
数据2 前总股本
数据3 后流通盘
数据4 后总股本
4 未知股本变动 公众号协议分析与还原
数据1 0
数据2 0
数据3 0
数据4 0
5 股本变化
数据1 前流通盘
数据2 前总股本
数据3 后流通盘
数据4 后总股本
6 增发新股
数据1 0
数据2 增发价
数据3 增发数量
数据4 0
7 股份回购
数据1 前流通盘
数据2 前总股本
数据3 后流通盘
数据4 后总股本
8 增发新股上市
数据1 前流通盘
数据2 前总股本
数据3 后流通盘
数据4 后总股本
9 转配股上市
数据1 前流通盘
数据2 前总股本
数据3 后流通盘
数据4 后总股本
10 可转债上市 protosec
数据1 前流通盘
数据2 前总股本
数据3 后流通盘
数据4 后总股本
11 扩缩股
数据1 0
数据2 0
数据3 比例
数据4 0
12 非流通股缩股
数据1 0
数据2 0
数据3 比例
数据4 0
13 送认购权证
数据1 行权价
数据2 0
数据3 份数
数据4 0
14 送认沽权证
数据1 行权价
数据2 0
数据3 份数
数据4 0
最终解析出的数据整理后如下:
如果没整理,则是这种形式:
条数,市场,股票代码,日期,数据类别,数据1,数据2,数据3,数据4
0,0,000001,19900301,1,0.0,3.559999942779541,0.0,1.0
1,0,000001,19910403,5,0.0,0.0,2650.0,4850.01708984375
2,0,000001,19910502,1,3.0,0.0,4.0,0.0
3,0,000001,19910502,2,2650.0,4850.01708984375,3949.072265625,8975.1640625
4,0,000001,19910817,1,0.0,0.0,10.0,0.0
5,0,000001,19920323,1,2.0,0.0,5.0,0.0
6,0,000001,19930524,1,3.0,16.0,8.5,1.0
7,0,000001,19930524,2,3949.072265625,8975.1640625,18812.984375,26941.7890625
8,0,000001,19930630,2,18812.984375,26941.7890625,18004.330078125,26125.369140625
9,0,000001,19940709,2,18004.330078125,26125.369140625,19804.76953125,28737.91015625
还是前面整理的好,如果想要解析好了的数据样例,找我获取吧,wx:protosec。
当然,需要注意一下,里面的b股的价格相关数据,是人民币价格,如果要转成美元价格,需要根据当时的汇率转换下。
03
—
gbbq.map文件数据解析
前面介绍了gbbq文件的解密和解析,这里继续介绍下gbbq.map,它是明文的,没有加密,全部是数字,截取一段内容是这样:
0000017703
0000027760
0000047695
0000056936
0000067760
0000077412
0000087546
0000097756
0000107542
0000117497
0000127775
0000147497
0000167487
0000176808
0000197542
0000206544
0000217548
0000237503
0000257497
0000267699
它的含义很简单,每行一个股票的描述,前6字节为股票代码,后4字节为更新批次,表示gbbq里面该股票的数据最近一次是更新是哪一次,大家可以不纠结它。
04
—
结束
到这里,对通da信gbbq相关文件的解析就结束了,大家如果对此有什么问题,撩我,不要耍我。再透露下,后面可能会搞搞同花顺的小工具,为大家服务,至于啥时候搞,谁知道呢,祝大家发财。
别忘点“在看”、“赞”和“分享”
新的规则,及时收推文要先给公号星标
别忘了星标一下,不然就错过了
长按进行关注,时刻进行交流。