怎麼將二進位代碼轉換為中間代碼(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 Infrastructure

The 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 System

4. BitBlaze: BitBlaze: Binary Analysis for Computer Security


哥們還在研究嗎?有興趣可以一起研究呀!


二進位只能通過dis轉為彙編,彙編無法轉回ir的.想要強行轉,代價也是很高的.


難道不是一個decoder?


推薦閱讀:

如何理解LLVM的PassManager系統的實現?
為什麼很多語言的JIT實現最後會失敗,主要的技術原因和難點有哪些?
llvm的reg2mem pass做了哪些事情?
LLVM 相比與其他 Compiler Infrastructure 有什麼優勢?
LLVM 怎樣入門和上手?

TAG:編程 | 二進位 | 編譯器 | LLVM |