这篇文章首次发表在我的贴吧了,里面还有东方红魔乡的解包过程,不过比较麻烦有兴趣的自己看吧
东方每作解包都有点不一样,这里我选择比较典型的永夜抄来示范
成品源码:东方dat解包器
用OD打开,在文本字串参考里找th08.dat,有三个引用,一个个试,还好第一个就是我的目标
跳到0x4461A9这里,慢慢跟进去,在0x473897这里文件名传入了CreateFileA
继续往下,读4个字节然后判断是不是PBGZ(永夜抄资源的magic number),看来确实是解包资源的函数了
继续,读了12字节然后传入解密函数(当然我当时不知道这是解密函数,但是看它把结果又复制回了原buffer而且长度不变才猜是解密函数)
然后对结果又做了这样的处理(还是为了解密)
然后读取了文件尾部
buffer2又被传入了解密函数(参数不一样),然后结果和第三个DWORD被传入了另一个函数
(这个函数里用第三个DWORD的大小申请了结果buffer内存,并且它比原buffer长度略大,所以推测是解压函数)
看一下解压结果buffer,是{文件名'\0', 开始地址, 原长度, 0}这样的结构,看来是文件索引信息了
根据以上推测第二个DWORD是文件索引信息的地址,第三个DWORD是文件索引信息的原长度
后面这个函数是把文件信息格式化成{文件名指针, 开始地址, 原长度, 0}这样的结构
传入了第一个DWORD并且循环了第一个DWORD次
所以第一个DWORD是文件数量
到这里文件结构就算分析完了,然后分析解密、解压算法
打开逆向神器IDA,跳转到解密函数和解压函数,按一下F5就能翻译成C代码
复制到我们的解包器源码里改一下就能用了
其实在程序中可以看到很多zlib库的常量,但是我没找到到底用了zlib的哪个函数,所以只能用IDA翻译的C代码了...
顺带一提从东方红魔乡到东方绀珠传(目前最新作)用的都是同一个解密、解压函数,所以如果要破解其他作可以直接用这里的代码