A. 請問wasm反編譯出來的代碼中退出程序是怎麼寫
直接刪掉是不行的,程序會崩潰的,你需要了解動態調試的技術,在ExitProcess函數下斷點,把跳轉改掉即可
B. 怎麼讓 IDA 的 F5 支持一種新指令集
在逆向工程領域,IDA Pro是廣受贊譽的反匯編和調試工具,它支持多種主流指令集,為開發者和安全研究人員提供了強大的分析能力。然而,某些特殊的指令集,如VMP指令集,可能不在IDA支持列表中。本文介紹一種方法,通過簡單步驟擴展IDA以支持新指令集,緩解新指令集無反編譯器的困境。方法並非原創,而是基於前輩的文章和材料總結,旨在幫助想在IDA中實現未知指令集反編譯的朋友。
對於IDA處理處理器模塊與Ghidra插件,IDA雖然允許用戶開發特定架構的處理器模塊,但無法利用其反編譯功能,且編寫特定架構處理器模塊的過程復雜,參考資料少。相比之下,Ghidra是一款優秀的開源反編譯器,用戶通過插件形式添加新指令的反編譯器。例如,已有插件實現Ghidra中反編譯WASM模塊。然而,編寫Ghidra插件仍是一項復雜任務,參考資料不多,不在本文限定的「IDA」范圍內。
WebAssembly(WASM)是一種流行底層指令集,主要運行在瀏覽器環境,也有在終端或嵌入式設備應用。一般開發者使用編譯型語言如C/C++、Rust、Go開發WASM上層程序,使用LLVM將其編譯為WASM模塊。因此,WASM的IDA反編譯方法具有代表性。目前,IDA Pro 8.4仍不支持WASM反編譯,但有資料表明,IDA Pro能夠反編譯WASM模塊。實現方法是使用wasm2c程序,將WASM模塊轉換為等價的C語言低級表示形式,使用GCC/CLANG編譯,最後使用IDA分析最終產物。這種方法通過將WASM轉換為C語言,使得IDA可以進行反編譯。
在IDA中實現新指令集反編譯時,wasm2c將WASM模塊轉換為等價的C語言形式,但這種形式的可讀性較差。因此,需要使用C語言編譯器優化編譯結果,以適應IDA的指令集識別。這種方法實現了讓IDA支持未知指令集的效果,但美中不足的是,wasm2c的轉換結果可能未將內存訪問以原生C語言形式表示,導致內存訪問在IDA反編譯結果中以函數形式呈現。對於這種情況,可以設計轉換器,將指令集以函數單位轉換為等價的C語言表示形式,從而快速實現未知指令集的IDA反編譯器。
以WASM反編譯為例,這種方法在實際應用中已經取得成功。例如,對QWB S5 VM指令集的直接轉換成x64匯編,並使用IDA進行反編譯,迅速發現了程序漏洞。這種轉換方法在短時間內使IDA支持未知指令集,代碼實現僅需3小時,代碼行數在300行左右。類似的實踐例子還包括棧機反編譯、控制流與正確性、復雜表達式處理等,展示了該方法在不同指令集上的應用效果。
綜上所述,通過將未知指令集轉換為IDA能夠識別的指令集,如x86或ARM,然後使用wasm2c轉換為C語言,最後通過C語言編譯器優化並使用IDA進行反編譯,可以實現讓IDA支持新指令集。這種方法適用於WASM等指令集的逆向,也能在其他小眾指令集上取得成功。盡管這種方法在短時間內可以實現初步探索逆向,但要開發成熟的反編譯器,仍需根據實際情況編寫Ghidra反編譯插件或從零開發反編譯。