[GJ高端嫺熟又技術的SE]DQ5反燒錄技術深度解析

轉自互聯網

 

不出所料~高端嫺熟的技術的SE在這次DQ5上果然使用了新的反燒錄技術~比較牛×的是這次更是連模擬器IDEAS都成功封殺掉了~
俺這兩天由於沒日沒夜的趕課程設計~所以第一時間沒有去研究ROM~直到昨天終於浩浩蕩蕩的寫完了700行的課設程序~閒下來的時候才發現日本牛人們早都發出了不死機版老金~說實話至今都很費解日本那幫牛人們是怎麼總能第一時間搜出這不死機的關鍵地址的~不過嘛~算了~既然都有了~正好偷點懶~藉着這個現成的成果~逆向追溯了一下高端嫺熟又技術的SE的最新反燒錄技術~特此公開~

這次有一點特別慶幸的~IDEAS模擬器也被這次的反燒錄代碼給撂倒~因此用IDEAS的調試器可以很清晰的看到該代碼的工作過程~經過幾個小時的研究~得到以下結論~

1,新反燒錄代碼原理說明

首先大致介紹這次燒錄卡們出現紕漏的地方~也就是這次被SE利用的燒錄和Z卡的關鍵不同之處~
那便是ROM的讀取方式~
Z卡上~ROM是直接通過DS內置BIOS內的初始化代碼載入到內存中的~而在燒錄卡上~ROM的載入則始終是靠燒錄卡的模擬完成~儘管現在技術已經模擬的很牛×了~但是註定還是出現了一個人們平時壓根不會注意到的紕漏~那就是Secure Area~

The Secure Area is located in ROM at 4000h..7FFFh, it can contain normal program code and data, however, it can be used only for ARM9 boot code, it cannot be used for ARM7 boot code, icon/title, filesystem, or other data.

以上這段是在GBATEK中對Secure Area的解釋~大致意思是說~這是一段被定義在ROM偏移量4000h..7FFFh處的區域~用作存放ARM9的啓動代碼~
這裏要特別注意這段話的最後一句~這段區域絕對不能爲ARM7啓動代碼~圖標標題~文件~或者其他任何數據~……意思是說~放在ROM這個地方的數據是僅僅能被DS的BIOS在開機載入時訪問的~其他任何時候都無法訪問該區域~
這點在通常情況都會被人們給忽視掉~因爲從來沒有遊戲或者程序將數據寫入該區域並在主程序中試圖訪問該區域~……因此~也從來沒有燒錄卡爲該區域寫驗證模擬~
那麼如果說真的有遊戲無聊到在程序中試圖訪問該段地址會得到什麼樣的結果呢?~用NO$GBA測試後~結果是無論讀取的是8000h前的任何地址的數據~最終返回的必然是以8000h爲開頭的200字節(ROM訪問以200字節爲單位)~……

相信說到這裏~看懂了的人已經能猜到這次嫺熟的SE所玩弄的手腕了吧~

DQ5的燒錄檢測程序~依次訪問0000h,0200h,0400h,8000h,8200h,8400h這6個地址~然後對輸出的200字節取特徵碼~……根據前面的理論~如果使用的是Z版卡的話~這裏將出現的結果是0000h,0200h,0400h,8000h得到的結果全部一致~而8200h,8400h則順利讀取到其他數值~
但是由於前面也說到~沒有任何燒錄有設計過該段區域的溢出檢測~事實上就連IDEAS都沒有該檢測~所以在燒錄卡上運行的結果便會是這6個值全部不同~(因爲燒錄卡允許遊戲讀取ROM的Secure Area~)……

因此~只要這裏依次查看這6個輸出值~就能很清楚的檢測出玩家是在使用燒錄還是用Z卡了~……

2,新反燒錄代碼分析

首先根據那個不死機金手指追溯下來~起作用的最基層的一個檢測函數的調用爲~
:02007EB8 E12FFF30 blx r0 (Jump to addr_0200819C)
:02007EBC E3500000 cmp r0,#0x0
:02007EC0 11A03004 movne r3,r4                  ;r3=1(0x1)
:02007EC4 01A0300A moveq r3,r10                  ;r3=0(0x0)

再往內深入則直接是檢測的實現部分~
但是由於高端的SE的第二個新技術~使得這裏我卻不便放出代碼了~
這新技術便是代碼的動態加密解密~……

在ROM很多地方大概可以看到類似這樣的代碼~
:02007F84 E92D0001 stmdb r13!,{r0}
:02007F88 E1A0000F mov r0,r15                  ;r0=33587088(0x2007f90)
:02007F8C E2800010 add r0,r0,#0x10
:02007F90 EB0000D1 bl 020082DC
:02007F94 E8BD0001 ldmia r13!,{r0}
:02007F98 EA000000 b 02007FA0
:02007F9C EB004AE2 bl 0201AB2C
…………
:020080BC EA018A51 b 0206AA08
:020080C0 EB004AE2 bl 0201AC50
……
或者像這樣~
:0200822C E92D0001 stmdb r13!,{r0}
:02008230 E1A0000F mov r0,r15                  ;r0=33587768(0x2008238)
:02008234 E2800010 add r0,r0,#0x10
:02008238 EB000027 bl 020082DC
:0200823C E8BD0001 ldmia r13!,{r0}
:02008240 EA000000 b 02008248
:02008244 EB002CD7 bl 020135A8
…………
:0200828C EA01D343 b 0207CFA0
:02008290 EB002CD7 bl 020135F4
:02008294 E92D0001 stmdb r13!,{r0}
:02008298 E1A0000F mov r0,r15                  ;r0=33587872(0x20082a0)
:0200829C E2400014 sub r0,r0,#0x14
:020082A0 EB000029 bl 0200834C
:020082A4 E8BD0001 ldmia r13!,{r0}

我舉例的這兩段代碼可以看出核心部分都是調用了020082DC這個函數~該函數就是我所謂的動態解密代碼~這個函數會處理緊隨其下在2句相同的EB00****(****的值在不同地址不同)之間的代碼~將所有代碼全部變換解密~然後在運行完後再對其加密回去~……
也就是說~在上述2段代碼中~我所標註……號的地方~所有的靜態反彙編結果全是已經被加密了的結果~也就是說是錯誤的代碼~……最惱人的是~這些加密代碼還都被僞裝成合法代碼~十分具有誤導性~……

經過動態解密跟蹤後~我所得到的關於檢測代碼的結論已經在第1條裏講的很清楚了~所以這裏就不再放代碼了~……因爲靜態彙編結果無效~所以動態的長代碼手動打出來很麻煩~……

3,解決手段

如同上面所述~由於檢測代碼的內部加密手段繁雜~再加上先後6次讀取ROM~因此要從根本原因上處理該檢測代碼會十分麻煩~因此這裏就直接修改第一層調用的返回結果就可以了~也就是第2條裏開頭放出的那段代碼~
:02007EB8 E12FFF30 blx r0 (Jump to addr_0200819C)
:02007EBC E3500000 cmp r0,#0x0
:02007EC0 11A03004 movne r3,r4                  ;r3=1(0x1)
:02007EC4 01A0300A moveq r3,r10                  ;r3=0(0x0)

這裏只需要將moveq r3,r10改成mov r3,r10即可~也就是把02007ec7處的01改成e1~

但是還有個很煩躁的問題~就是這次的DQ5的arm9還是被lz壓縮過的~……(其實明明就只有600+k根本沒有壓縮的必要~純粹是技術的SE的刁蠻~……)因此該內存地址還無法直接對應上ROM裏的偏移~

這裏稍微跟蹤一下解壓代碼~最後得到在ROM中的對應偏移量爲0a37b~
所以靜態修改的話~即爲把OFFSET:[a37b]的01改變爲e1即可從根本上解決掉驗證代碼~

4,後話

寫到這裏~說實話很佩服高端嫺熟又技術的SE對於開發新反燒錄技術的執着~這次的新反燒錄代碼不管是從原理還是從實現上~都比上次那個僅僅檢測DMA的代碼要高端了數個檔次~……

另外想說一下~這次之後~我大概也不會像現在這麼熱衷於DS上一些冷僻的技術了~因爲前段時間陪伴了2年的DS徹底宣告死亡~說實話很心碎~……經過這幾天的等待~終於在E3上等來了TMD不出新機的消息~……因此唯一的換新機的理由也泡湯了~……忙了幾天正事後~大概也想通了~……以後~就暫時隱退算了~……以上~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章