2020-7-14 17:17 /
名字我就不说了,封包名bkarc,看了下,基本上都是乱码。
好不管了,开干。
先说结论:

typedef struct {
        char Magic[8];//BKARC\x04
        unsigned int  xorkey1;
        unsigned int  xorkey2;
        unsigned int  xorkey3;//实际上是index的偏移量
        unsigned int  zero1;//0
}bkarc_header_t;

typedef struct
{
        unsigned int  xorkey4;//index_compr_len
        unsigned int  xorkey5;//index_uncompr_len
        unsigned int  xorkey6;//key
        unsigned int  zero2;//0
}bkarc_header2_t;


第二个与其说是文件header,不如说是index的header,因为他所在的位置是xorkey3解密后的pos + 0x10。
这个引擎文件头部分的数据几乎是加密完了的,包括其性质本身也是加密key,所以我干脆全部标成xorkey。即数据本身就是加密。
解密算法很简单:大概就是

xxx =  header.xorkey1 ^ ((header.xorkey2 ^ ((xxx ^ header.xorkey1 & 0xFFFF00) - 0x6C078965)) - 0x5E89F12A);

这样,xxx内容就是当前解密数据,所以才说数据本身就是加密。
index部分已经加密压缩过了,简直变态(无语)。
压缩算法还没有逆的出来,看起来比较麻烦,不过解密算法很简单,把IDA里面的数据照搬出来即可。
entry稍微看了下,是一个类似树状结构的entry,感觉好麻烦2333.
后续再继续分析。
Tags: bkarc