怎麼將二進位代碼轉換為中間代碼(IR)呢?
如題,有沒有可選的思路提供呢?
看題主是出於什麼目的要把二進位代碼提升為編譯器IR,以及是何種二進位代碼。這裡假定二進位代碼是指實際機器的機器碼,而不是像Java Class文件或者.NET Assembly/MSIL那樣很高級的中間代碼。
- 如果是為一個二進位模擬器實現JIT編譯器,或者叫動態二進位翻譯(Dynamic Binary Translation,DBT)的話,那就很直觀的把二進位代碼翻譯成IR就好了——機器碼說什麼就怎樣。
- 如果是以靜態代碼分析、反編譯,或者二進位到二進位的優化器的話,對原始語義理解的深度和精度的要求就更高,這就不一定好辦了。
把二進位代碼提升到編譯器IR有許多困難之處,主要是原本程序的高級語義(甚至中級語義)都損失了,特別是類型信息、符號信息;只剩下了非常細粒度、底層的信息,要重新推斷出高層語義就很困難。
舉四個例子。詳細回頭寫…
1. Phoenix: Phoenix Compiler and Shared Source Common Language Infrastructure
IR分4層,其中HIR、MIR、LIR是內存中的,所謂EIR(Encoding IR)只是用於寫出最終的二進位代碼用的。
Phoenix所實現的功能里,支持從二進位代碼「提升」(lift)到LIR,但不支持提升到更高層的HIR、MIR。2. JoeQ: http://joeq.sourceforge.net/
Joeq: A Virtual Machine and Compiler InfrastructureThe ELF binary loader can load and decode x86 object files, libraries, and executable images in the popular ELF format. The front-end also includes an intelligent x86 disassembler, which can disassemble the binary code for a function, undoing stack spills and converting the code into operations on pseudo-registers. It also recognizes some common control flow paradigms. This allows Joeq to seamlessly load and analyze binary code as if it were just another front-end.
3. SecondWrite: Kapil Anand
這個是基於LLVM的。或許正對題主需求。
Decompilation to Compiler High IR in a binary rewriter
A Compiler-level Intermediate Representation based Binary Analysis and Rewriting System4. BitBlaze: BitBlaze: Binary Analysis for Computer Security
哥們還在研究嗎?有興趣可以一起研究呀!
二進位只能通過dis轉為彙編,彙編無法轉回ir的.想要強行轉,代價也是很高的.
難道不是一個decoder?
推薦閱讀:
※如何理解LLVM的PassManager系統的實現?
※為什麼很多語言的JIT實現最後會失敗,主要的技術原因和難點有哪些?
※llvm的reg2mem pass做了哪些事情?
※LLVM 相比與其他 Compiler Infrastructure 有什麼優勢?
※LLVM 怎樣入門和上手?