东方永夜抄资源解包
這篇文章首次發(fā)表在我的貼吧了,里面還有東方紅魔鄉(xiāng)的解包過程,不過比較麻煩有興趣的自己看吧
東方每作解包都有點(diǎn)不一樣,這里我選擇比較典型的永夜抄來示范
成品源碼:東方dat解包器
用OD打開,在文本字串參考里找th08.dat,有三個(gè)引用,一個(gè)個(gè)試,還好第一個(gè)就是我的目標(biāo)
跳到0x4461A9這里,慢慢跟進(jìn)去,在0x473897這里文件名傳入了CreateFileA
繼續(xù)往下,讀4個(gè)字節(jié)然后判斷是不是PBGZ(永夜抄資源的magic number),看來確實(shí)是解包資源的函數(shù)了
繼續(xù),讀了12字節(jié)然后傳入解密函數(shù)(當(dāng)然我當(dāng)時(shí)不知道這是解密函數(shù),但是看它把結(jié)果又復(fù)制回了原buffer而且長(zhǎng)度不變才猜是解密函數(shù))
然后對(duì)結(jié)果又做了這樣的處理(還是為了解密)
然后讀取了文件尾部
buffer2又被傳入了解密函數(shù)(參數(shù)不一樣),然后結(jié)果和第三個(gè)DWORD被傳入了另一個(gè)函數(shù)
(這個(gè)函數(shù)里用第三個(gè)DWORD的大小申請(qǐng)了結(jié)果buffer內(nèi)存,并且它比原buffer長(zhǎng)度略大,所以推測(cè)是解壓函數(shù))
看一下解壓結(jié)果buffer,是{文件名'\0', 開始地址, 原長(zhǎng)度, 0}這樣的結(jié)構(gòu),看來是文件索引信息了
根據(jù)以上推測(cè)第二個(gè)DWORD是文件索引信息的地址,第三個(gè)DWORD是文件索引信息的原長(zhǎng)度
后面這個(gè)函數(shù)是把文件信息格式化成{文件名指針, 開始地址, 原長(zhǎng)度, 0}這樣的結(jié)構(gòu)
傳入了第一個(gè)DWORD并且循環(huán)了第一個(gè)DWORD次
所以第一個(gè)DWORD是文件數(shù)量
到這里文件結(jié)構(gòu)就算分析完了,然后分析解密、解壓算法
打開逆向神器IDA,跳轉(zhuǎn)到解密函數(shù)和解壓函數(shù),按一下F5就能翻譯成C代碼
復(fù)制到我們的解包器源碼里改一下就能用了
其實(shí)在程序中可以看到很多zlib庫的常量,但是我沒找到到底用了zlib的哪個(gè)函數(shù),所以只能用IDA翻譯的C代碼了...
順帶一提從東方紅魔鄉(xiāng)到東方紺珠傳(目前最新作)用的都是同一個(gè)解密、解壓函數(shù),所以如果要破解其他作可以直接用這里的代碼
總結(jié)
- 上一篇: DNS劫持与路由器DNS劫持漏洞详解(附
- 下一篇: SAR数据常识