dnSpy逆向一款不知名黃油的經(jīng)驗(一)

不久前玩到一款黃油封呪姫,說真的這游戲做的還是挺好的,去掉H的部分完全能夠作為一款優(yōu)秀的策略游戲.
黃油終歸逃不過老三樣(漢化,存檔,CG解鎖)甚至還有比較魔幻的"解碼".
以前逆向過一些黃油,拿這款出來寫經(jīng)驗是因為這游戲在黃油里是比較罕見的對數(shù)據(jù)加了密的,雖然比較簡單.

作為初次寫這類文章,文章將以????[存檔 ------ 漢化 ------- "解碼"(可能不講,完全看運氣)]????提供一定的思路._.

這款游戲是用unity制作的,不管三七二十一,解密就上神器dnSpy.
首先游戲的存檔位置不多說,桌面左上角的用戶文檔里,隱藏文件夾AppData隨便逛一下就找到了.發(fā)現(xiàn)文件夾里包含save0.sol,save1.sol,sys.sol等等文件,save0是自動存檔生成,save1對應游戲里的第一個存檔,sys則是系統(tǒng)存檔.在游戲中這三個存檔是比較常見的.

直接打開這三個文件,不用多說,肯定一堆亂碼,哪有這么小白的作者會把存檔明文保存的.
因為是unity開發(fā)的作為一個專搞unity游戲的逆向小白,直接去找游戲文件夾下Game_Data\Managed路徑里的Assembly-CSharp.dll文件,unity開發(fā)的游戲的腳本基本全在這個文件內.
直接二話不多說拖到dnSpy里看看能不能逆向,結果當然不出所料,基本的代碼全都被逆向出來了,但是比較頭痛的是代碼中一大堆不明所以的字符串編碼,這方面真的是小白,可能是加了混淆啥的反正代碼一大堆亂七八糟的,直接上個圖

雖說這是逆向中的障礙,但是這點障礙完全不影響我去看代碼呀,直接嘗試去搜索一下有關存檔的方法,一般來說當然就是save啥的,那就直接搜索save再說.結果搜出來一大堆,當然作為一個有精驗的小白來說,能搜出來是好事,搜不出來才頭痛好伐.
考慮到這游戲有三種存檔保存類型,當然可想而知方法也會有很多,在列表里隨便看看方法的名稱可能會有點思路啥的.

結果直接找到個SaveEncString方法,字面理解不就是存檔字符串加密的方法嗎。
猜歸猜點進去看看跟實際個圖,

一萬個草泥馬策馬奔騰,我去這代碼真tm牛逼(不懂是怎么搞出來的)。
不過可讀性還是挺高的,畢竟再怎么亂終究只是方法名而已,看著長就是個紙老虎。
代碼第一行清晰明了,就是打開了一個文件唄,還搞得花里胡哨的
第二行 明著告訴你把傳進來sJs這個字符串加密后給到array這個數(shù)組
當然我們解密找的就是這進行加密的方法。直接點進EncryptData這個方法

可見這游戲中的一些方法名都是這么一長串的編碼,然而還是不影響,正所謂心中無碼便是步兵。

第一行,看上去亂是因為,這里面方法套方法套了好幾層,看后面的小括號個數(shù)就能知道。
做一下簡單的簡化處理后得知,方法名用A,B,C替換掉了
svdata = GSys.A(GSys.B(GSys.GetMd5Hash(GSys.A(svdata, <Module>.C<string>(2979640811u))), 0, 8), svdata);
GSys.B(GSys.GetMd5Hash(GSys.A(svdata, <Module>.C<string>(2979640811u))), 0, 8)+svdata
GSys.GetMd5Hash(svdata+"R").Substring(0,8)
總結:(svdata+"R")作為整體得到一串Md5值的前八位,然后得到的8位Md5+svdata得到新的字符串并賦值給svdata。
可見這存檔還加md5驗證,還故意是加個R后在算md5的,老狐貍的呀

第二行沒啥意思就是把svdata以UTF-8存到數(shù)組里方便進行操作.

然后到了最關鍵的第三行的for循環(huán),這不是赤裸裸的加密了嗎?????
看關鍵語句:array2[num] ^= 239
就是每個字符跟239異或后得到個新的值呀,也就是說這加密就TM僅僅是個異或加密
那解密簡單呀,異或加密是可逆的,也就是說這串代碼再跑一遍就能解密了。
因為不會寫C#,只會讀
所以寫個python代碼跑一遍看看,具體就不貼了,反正上面圖里的照搬就行。直接上個解密后的文件截圖。?


破解成功!!!!!!!!!

當然上面的解密過程僅僅只是把原文件,用第三行的異或算法跑了一遍,并沒有考慮的第一行代碼的驗證過程,所以打包的時候簡單的異或是不行的.具體要如何打包就參考第一行的代碼解析就可以了.