NS版暗黑破壞神3金手指開發教程(4)

上一節,我們講了基於公式明文的金手指製作方法,這一節,我們將進階到更高級的基於程序修改的金手指製作方法,從現在開始,對讀者的技術水平有了一個更高的要求,讀者最好有彙編和C/C++高級語言的一些基礎,至少了解過彙編,這樣不會太喫力

1. 運行神器IDA,然後打開原始版本的DiabloIIINX64ra.elf ,等待反彙編完成(因爲帶調試符號,時間可能比較長,請耐心等待,或者去做一些其他事情,大概在10分鐘左右,與電腦配置有關,輸出窗口顯示內容不再更新代表已經完成),如果每次打開IDA窗口布局不對,或者少了一些窗口,建議點擊窗口->重設窗口來複位一下佈局。

2. 我們要修改的是遠古傳奇掉落機制,所以要先搜索遠古的英文ancient,首先點擊左邊函數窗口裏任意一個函數,然後在編輯裏點擊快速篩選,然後左下方輸入ancient,不出所料,篩選後的函數只剩下6個,分析一下名稱,可以知道最有可能的是LootRollForAncientLegendary這個函數,因爲字面意思就是對戰利品隨機出遠古傳奇,然後我們雙擊這個函數,可以在右邊的IDA View裏看到這個函數的彙編代碼

3. 因爲彙編代碼直接看不是很好看,我們可以在視圖->子視圖->生成僞代碼或者直接按F5生成僞代碼,怎麼樣,很驚喜吧,彙編代碼直接被翻譯成C++風格的僞代碼了,這樣很利於我們分析程序邏輯

4. 沿着函數僞代碼往下拉,在接近函數底部的時候我們發現了一些非常可疑的代碼,if ( (float)((float)RandGetDWord(v28) * 2.3283e-10) <= v27 ) v2->eAncientRank = 2; 這一句非常重要,根據函數名,可以猜測這是獲取一個隨機數然後乘以一個小數後判斷是否大於一個值,如果小於的話就把eAncientRank的值改爲2,我們發現整個函數eAncientRank的值會被賦值成1或2,因此猜測eAncientRank的值如果是2的話就代表太古,1代表遠古,於是可以從這個隨機數判斷上入手,可以讓這個條件始終成立,那麼eAncientRank就始終爲2了,那麼我們掉落的傳奇是不是就一定是太古級別了呢?

5. 在<=上點擊一下,可以看到這個地址是928BA8,然後再點擊IDA View, 點擊跳轉->跳轉到指定地址裏輸入928BA8,就到了這裏的彙編代碼,我們要修改的就是928BA4上的FCMP            S0, S9,原因就是當鼠標在v27這個變量上停留時,顯示的就是s9,爲了讓下一句B.HI            loc_928BB4  不跳轉,我們可以在FCMP  S0, S9上鼠標右鍵快速修補神器->修補,把原指令改爲FCMP S0, S0, 這樣結果始終相等,<=的條件就始終成立了,如果想在IDA View裏顯示指令字節碼和註釋,可以在選項->常規裏按照下圖配置一下就可以了

6. 修補之後,我們突然想到一個問題,現在是基於原始版本修改的,但是遊戲已經是2.6.6版本了,怎麼辦?不用擔心,我們可以採用另一種方法去找到2.6.6版本對應的地址,再次啓動另外一個IDA實例,打開2.6.6的main.elf,搜索原始版本FCMP附近的指令字節碼,可以是前面的,也可以是後面的,如果搜索不到,那就擴大範圍,記住,儘量搜索一些不容易被改變的指令,比如常量等等, 我們就在2.6.6裏面搜字節序列00 00 23 1E 00 08 28 1E 然後發現第二個搜索結果和原始版本附近的指令最相似,那麼基本可以判斷,第二個搜索結果就是2.6.6對應的地址啦,2.6.6對應的FCMP地址就是00000000008610B4,用同樣的方法改成FCMP S0, S0

7. 目前爲止,我們已經完成了太古級別判斷的修改,那麼還有一個問題,可以從僞代碼分析中得知,要判斷太古的話,首先這個掉落的傳奇裝備要先進行遠古級別判斷,成功後還要進行當前玩家Solo單人大祕境層數是否大於等於70的判斷,大於70層纔會進行遠古級別的判斷,因此,前兩個條件同樣需要修改成始終成立,轉到彙編代碼我們確實可以看到nMinimumAchievedRiftLevelToRollPrimalAncients和nHighestSoloRiftLevel的比較,也就是單人solo大祕境層數與生成太古裝備所需最低層數的比較

8. 知道了原始版本的遠古太古以及層數判斷,那麼接下來我們可以去2.6.6版本的僞代碼當中找到對應的地方,當然由於2.6.6的main不帶調試信息,因此不太容易看,不過通過代碼結構還是很容易分析出對應關係,但是我們暫時沒找到遠古的判斷位置,只找到了後兩個判斷

9. 不過這阻擋不了我們逆向的決心,僞代碼往上面分析,我們看到了一個v8的變量乘了一個很小的數,因此分析出v8一定是遠古判斷的隨機數

10. 往下找v8出現的位置,可以發現v8有兩個地方進行了比較判斷,其中第一個位置纔是進行遠古的判斷位置

11. 現在我們已經找到了2.6.6main裏面的3處判斷位置,程序邏輯流程就是先生成隨機數進行遠古判斷,是遠古瞭然後判斷玩家大祕境層數大於等於最小層,成功後再生成隨機數進行太古判斷,成功了就是遠古裝備,因此,只需要修改這三個判斷始終爲真,那麼最後怪物掉落的一定是太古裝備,我們分別找到這三處判斷對應的彙編指令,然後進行修改如下:

12. 我們總算完成了三個判斷的修改,那麼接下來就是製作金手指代碼的時刻了,將三處地址修改後指令字節碼寫成3行金手指格式碼即可,當然我們也可以不修改遠古概率的判斷,這樣傳奇掉落一旦判定爲遠古,那麼就必爲太古,因爲傳奇是遠古的概率是10%,所以太古的概率也就是10%了,另外,把三處指令寫回程序原始的判斷指令,那麼就相當於恢復了太古正常概率,所以我們可以得到三個金手指功能了:

11. 保存成txt放到相應目錄下,運行遊戲,切到金手指界面開啓太古100%概率,爲了增加傳奇掉落,可以同時開啓魔法裝備掉率999999900%(這個是需要遊戲啓動後一秒去開啓,不然無效),回到遊戲,去小祕境殺幾組精英怪,或者打一層大祕境,你會發現,GOD,滿地紅光太古,閃瞎雙眼。。

12. 爽了一翻,你可能會發現,咦,爲什麼還有一些黃光普通傳奇呢,不是100%太古麼?這是因爲掉落機制非常複雜,大部分情況會掉落職業相關的裝備,此時就是100%太古了,當小概率掉落其他職業裝備時,暴雪爲了遊戲平衡,設置了不進行太古判斷的開關,這裏可以提示一下,至於怎麼改,還是比較簡單的,就交給讀者自己去實踐了

好了,本節到此結束,這一節內容比較重要,通過此節,讀者應該掌握了對程序進行逆向分析和修改的技巧,如果有不明白的地方,可以補充一下arm64的彙編知識,下一節我們將進階到更高階的金手指製作:程序Hack,可以在遊戲中實時去修改人物的各項屬性,動態開啓和關閉,甚至添加自己的程序代碼

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