东方永夜抄资源解包

这篇文章首次发表在我的贴吧了,里面还有东方红魔乡的解包过程,不过比较麻烦有兴趣的自己看吧

东方每作解包都有点不一样,这里我选择比较典型的永夜抄来示范

成品源码:东方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代码了...

顺带一提从东方红魔乡到东方绀珠传(目前最新作)用的都是同一个解密、解压函数,所以如果要破解其他作可以直接用这里的代码

  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值