通达信股本变迁文件(gbbq)解密方法

时间:2022-04-28 12:19:46

近年来A股市场跌宕起伏真特么精彩,本人愚钝,被整爆仓,损失惨重

痛定思痛,认为交易这种对纪律要求极高,且必须完全排除情绪影响的勾当,还是应该交给程序来干


数据哪里来呢?当然是拿来主义。。。问券商的交易软件要呗

到处查资料,得知通达信的权息文件数据齐全,不仅含有除权除息数据,还含有限售解禁、增发、可转债上市等股本变化数据

——这对于某些对成交量变化敏感的交易模型是非常重要的


然而,gbbq文件是加密的,网上找不到解密算法,说不得只好请出尘封已久的ollydebug大侠咯~


1、在fopen函数下个条件断点,esp寄存器指向的第一个参数是文件名指针地址,若文件名含有“gbbq”,断之

2、很容易找到后续代码里连续调用了2次fread,第一次只读4字节,很明显是文件包含的记录数

3、跟踪第二次fread,发现将数据存入内存后,开始与另一块内存中的数据进行反复相加、异或操作,最后完成解密

4、另一块内存中的数据经多次加载对比,发现内容固定,长度4176字节,应该是自带的密码表

5、没有必要搞明白密码表是哪来的,直接从内存dump出来存为文件就行了

6、每条记录29字节,前24字节是加密的,后5字节未加密,因为他用的加密算法是固定64位,一次加密8字节

7、解密过程汇编代码很长,但仔细分析后可以转换为16次循环,64位对称加密,16次循环,呵呵,DES嘛


 while (len)
 {
  for (i = 0; i < 3; i++)
  {
   eax = *((int*)(pCodeNow + 0x44));
   ebx=*((int*)(pDataNow));
   num = eax^ebx;
   numold = *((int*)(pDataNow + 0x4));

   for (j = 0x40; j > 0; j = j - 4)
   {
    ebx = (num & 0xff0000) >> 16;
    eax = *((int*)(pCodeNow + ebx * 4 + 0x448));
    ebx = num >> 24;
    eax += *((int*)(pCodeNow + ebx * 4 + 0x48));
    ebx = (num & 0xff00) >> 8;
    eax ^= *((int*)(pCodeNow + ebx * 4 + 0x848));
    ebx = num & 0xff;
    eax += *((int*)(pCodeNow + ebx * 4 + 0xC48));
    eax ^= *((int*)(pCodeNow + j));

    ebx = num;
    num = numold^eax;
    numold = ebx;
   }
   numold ^= *((int*)pCodeNow);
   pInt = (unsigned int*)pDataNow;
   *pInt = numold;
   pInt = (unsigned int*)(pDataNow+4);
   *pInt = num;
   pDataNow = pDataNow + 8;
  }
  pDataNow = pDataNow + 5;
  len--;
 }


搞定~