有会OD的大侠吗,请教通达信GBBQ除权信息文件的解密密码是多少?能帮忙把解密方法转成易语言代码吗?
参考资料:
到处查资料,得知通达信的权息⽂件数据齐全,不仅含有除权除息数据,还含有限售解禁、增发、可转债上市等股本变化数据 ——这对于某些对成交量变化敏感的交易模型是⾮常重要的 然⽽,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--; } 搞定~
|