现有论文与资源
资源集
Working Conference on Reverse Engineering (WCRE):
PPREW-5: Proceedings of the 5th Program Protection and Reverse Engineering Workshop 这个期刊好啊。
SSPREW: Software Security, Protection, and Reverse Engineering Workshop
其他:
- RetDec的publication
- Decompiler Design - Type Analysis 居然有介绍反编译器架构的网站。
Github的两个list:
课程
- CMU Lecture Notes on Decompilation (15411: Compiler Design) 反编译内部各个阶段都有介绍。
现有的反编译器
- Ghidra ghidra/docmain.hh at master · NationalSecurityAgency/ghidra (github.com) 看代码前构建doxygen看文档。
- avast/retdec: RetDec is a retargetable machine-code decompiler based on LLVM. (github.com)
- Boomerang Decompiler (sourceforge.net) BoomerangDecompiler/boomerang: Boomerang Decompiler - Fighting the code-rot :) (github.com)
- yegord/snowman: Snowman decompiler (github.com)
- angr好像也有了
读论文
反编译器中端很好的资料:Static Single Assignment for Decompilation (Boomerang) 感觉可以抓住优化方面的脉络。虽然还是有不少启发式的方法,但相比其他资料已经好了很多。SSA现在也已经是反编译器不可缺少的重要部分。
控制流结构恢复-structural analysis
很多都是借用现有的type recovery,重点去讲structure recovery。
-
【Phoenix】 《Native x86 Decompilation Using Semantics-Preserving Structural Analysis and Iterative Control-Flow Structuring》 slides
Edward Schwartz's PhD thesis 里面进一步介绍了Phoenix反编译器
在reko反编译器里也有这个算法的实现
这篇论文关注控制结构的恢复。控制结构的恢复最早是基于interval analysis的(?这是什么得学一学)。后面才被细化为structural analysis。
-
【Dream】No More Gotos: Decompilation Using Pattern-Independent Control-Flow Structuring and Semantics-Preserving Transformations slides code
-
【Rev.ng】A Comb for Decompiled C Code Rev.ng他们2020年的新的反编译的结构恢复算法。
类型恢复 - Type Recovery
-
【TIE】Principled Reverse Engineering of Types in Binary Programs. 这篇基于VSA搞了自己的DVSA,主要区别是StridedInterval里可以放除esp外的变量符号?。重点主要在后面的约束求解部分。后面的类型系统和求解部分也非常复杂TODO。
-
【DIVINE】: DIscovering Variables IN Executables 这篇还是VSA系列的那些人写的。讲先用最简单的semi naive方法鉴别变量,跑VSA,然后拿VSA结果去生成约束跑ASI。迭代几次得到最好的结果。 里面说如果变量是8字节大小,那VSA直接无法处理,值总是Top(32位程序)。那就不能直接把内存最大切分粒度搞成4字节??
-
【REWARDS】Automatic Reverse Engineering of Data Structures from Binary Execution TODO
-
【retypd】 需要进一步学习类型系统的高级知识,比如subtyping。它不仅开源,而且不需要VSA的指针信息。可以与之前需要VSA的结合?
但是似乎没有说怎么从一整块栈内存中识别出变量。 -
【SecondWrite】Scalable Variable and Data Type Detection in a Binary Rewriter
变量恢复
变量恢复和类型恢复关联较大。如果把函数开头分配的栈空间看作一个巨大的结构体,变量恢复就转换成了类型恢复。
OSPREY: Recovery of Variable and Data Structure via Probabilistic Analysis for Stripped Binary slides 把变量的访问看作变量存在的暗示,同时存在很多这样的暗示,使用概率性的推导。好像是基于后面那篇BDA的工作。
C++ 反编译
C++的类给反编译带来了额外的困难,涉及到(复杂的)约束求解等。
-
OOAnalyzer: Using Logic Programming to Recover C++ Classes C++反编译 and Methods from Compiled Executables
-
SmartDec: Approaching C++ Decompilation.
-
Reconstruction of Class Hierarchies for Decompilation of C++ Programs.
VSA相关
-
WYSINWYX: WHAT YOU SEE IS NOT WHAT YOU EXECUTE 第三章讲了VSA的事情。它也讲了很多二进制分析的事情。
■ 文中提到的一些其他的没有用到VSA的方法:
[33] C. Cifuentes and A. Fraboulet. Interprocedural data flow recovery of high-level language code from assembly. Technical Report 421, Univ. Queensland, 1997.
[34] C. Cifuentes and A. Fraboulet. Intraprocedural static slicing of binary executables. In Proc. Int. Conf. on Software Maintenance (ICSM), pages 188–195, 1997.
[35] C. Cifuentes, D. Simon, and A. Fraboulet. Assembly to high-level language translation. In Proc. Int. Conf. on Software Maintenance (ICSM), pages 228–237, 1998.
[45] S.K. Debray, R. Muth, and M. Weippert. Alias analysis of executable code. In Proc. Principles of Programming Languages (POPL), pages 12–24, January 1998.
-
基础的VSA Analyzing Memory Accesses in x86 Executables
-
Improved Memory-Access Analysis for x86 Executables GMOD-Based Merge Function
这篇论文开头有很多引用:Research carried out during the last decade by our research group [64, 65, 6, 56, 55, 7, 8, 36, 4, 49, 9] as well as by others [48, 22, 33, 14, 2, 31, 13, 44, 32, 3, 54, 37, 21, 46, 28, 19, 16, 34, 66] has developed the foundations for performing static analysis at the machine-code level. 能找到非常多的其他paper了?
没想到相比于源码级的分析,二进制级的分析还有好处。有很多源码层没有指明的实现细节(比如C++的表达式求值顺序),源码级分析想要sound需要考虑所有可能的实现,而二进制级的分析只需要考虑编译器选择的实现。
-
《DIVINE: DIscovering Variables IN Executables》 (VSA with ASI(Automated Struct Identification))(栈变量恢复)VSA可以用于一定程度的变量恢复。
-
这人想要实现Value Set Analysis到RadecoIL上。
-
这里 也有人实现,还有WYSINWYNX那个论文相关的东西?
-
这个课件讲到了一点点。这门课是和安全相关的。TODO,不太看得懂。
框架与综述
-
C Decompilation : Is It Possible? 2009的一篇
第二章相关工作里面有不少引用:
structural analysis:[4–6],这个也用在了编译器:[8]。
unification-based algorithm for recovery of types:Mycroft [9]
现有反编译器:DCC decompiler [7]. Boomerang [11], REC [12] and Hex-Rays plug-in [13]
-
【rev.ng】rev.ng: A Multi-Architecture Framework for Reverse Engineering and Vulnerability Discovery.
这个反编译器开源了lifter:先转到Qemu IR然后转到LLVM IR。这个好像也不太和反编译相关,也只是搞插桩、fuzzing的。
下游研究
反编译器测试
-
【DecFuzzer】How far we have come: testing decompilation correctness of C decompilers 代码
functionality-preserving disassembling and C style control structure recovery [17, 31, 47, 64, 65, 67]
变量恢复static analysis and inference techniques [10, 12, 13, 30, 54].
fool-proof techniques for binary disassembling and decompilation [17, 31, 64-67].
EMI编译器测试看了下是插入了不影响语义的代码之后去开编译优化,发现优化器做出的错误决定而导致的crash。比如把一个不该执行的循环内操作提到外面。错误判断一些分支恒为真或假。是设置Csmith的输出使得只生成一个函数??
本来Csmith生成的代码很多全局变量的使用。如果全局变量改变了,很难手动找到是哪个函数?它是生成了局部变量,然后把对全局变量的使用全替换成了局部变量,函数结束的时候把局部变量的值update到全局变量,这样如果全局变量变了,就肯定是在最后update的时候改变的。那手动看的时候不要继续找内部怎么使用?这样做有什么好处吗。。。可能是方便找到这个函数到底涉及到了哪些全局变量,然后方便只提取这些到反编译结果的全局变量??
-
Semantic Fidelity of Decompilers CMU的技术报告。这篇基于上面的进一步做了。基于副作用(全局变量,内存访问,函数调用)分析单个函数函数的反编译正确性。
SecondWrite系列
-
Decompilation to Compiler High IR in a binary rewriter 提升到编译器IR,然后优化。对写反编译有较大启发
- 有一段提到了栈编译的坏处。
基于搜索的反编译
- Evolving Exact Decompilation 好像和主流的反编译技术不同。
- Decompilation as search
Java 字节码反编译
Java反编译的几篇
- Proebsting and Watterson [24] 《Krakatoa: Decompilation in java (does bytecode reveal source?).》
- Dava Miecznikowski and Hendren [22] 《Decompiling java bytecode: Problems, traps and pitfalls》
- Naeem and Hendren [25] 《Programmer-friendly decompiled java,》
- Harrand et al. [27] present Arlecchino 《Java decompiler diversity and its application to meta-decompilation》
- 《Decompiler Implementation》 一本书,讲Java字节码反编译的,暂未找到免费的电子版。
其他相关的静态分析技术
Aggregate structure identification and its application to program analysis
其他
-
Decomperson: How Humans Decompile and What We Can Learn From It 人经常会看生成的汇编,做些很小的修改。意味着可能可以强化学习。另外反编译可能代码片段可以拆分成子任务?,因为人经常关注一个小片段。
-
A Survey of Software Reverse Engineering Applications | SpringerLink 讲了逆向软件分析的合理性,用处等等。以后写intro的时候很有用。
-
Retrofitting Security in COTS Software with Binary Rewriting 给二进制增加保护。也提到了优化
-
DECOMPERSON: How Humans Decompile and What We Can Learn From It 调研人工反编译的过程
-
研究VSA对人工分析的帮助。(对学习VSA没啥用)
最近的新论文
-
DEEPVSA: Facilitating Value-set Analysis with Deep Learning for Postmortem Program Analysis 这篇参考意义不大,是ML结合的。
-
BDA: Practical Dependence Analysis for Binary Executables by Unbiased Whole-Program Path Sampling and Per-Path Abstract Interpretation
-
BinPointer: Towards Precise, Sound, and Scalable Binary-Level Pointer Analysis
提及:BPA: Refining Indirect Call Targets at the Binary Level这篇也值得读。用了块内存的抽象解释。
Existing projects
-
reko A decompiler with GUI, still actively maintained.
-
decomp 2020, an attempt to decompile using LLVM IR to golang. and a list of other decompiler
-
github.com/repzret/dagger 反编译到LLVM IR。aarch64还在开发过程中。介绍的slides
-
Boomerang (sourceforge) or BoomerangDecompiler/boomerang (github.com)
-
angr好像也有了反编译
其他资料(网页等):
-
https://github.com/cmu-sei/pharos 涉及到很多反编译技术
-
https://news.ycombinator.com/item?id=11218138 两个人的讨论。里面推荐对两篇文章的逆向引用搜索:https://scholar.google.com/scholar?as_ylo=2018&hl=en&as_sdt=2005&sciodt=0,5&cites=1148004013363547510&scipsc= https://scholar.google.com/scholar?cites=7322807636381891759&as_sdt=2005&sciodt=0,5&hl=en
-
https://github.com/toor-de-force/Ghidra-to-LLVM https://uwspace.uwaterloo.ca/bitstream/handle/10012/17976/Toor_Tejvinder.pdf?sequence=3&isAllowed=y Ghidra Pcode编译到IR。代码太简单了。。栈内存好像是alloca出来的,可能还是想保持语义想运行。
-
https://github.com/decomp/decomp 这人也想基于LLVM IR然后去优化。https://github.com/decomp/doc 相关文档
-
dagger主要讲的是反编译到IR上,找到语义等价的LLVM IR的指令的过程。感觉有点像编译器后端的Instruction Selection,可能能用上利用DAG(有向无环图)选择指令的技术。它是作为llvm的fork编写的,2017后就没有维护了。和llvm耦合好严重啊,都不知道哪里是它的代码。好像好复杂。
-
https://github.com/JuliaComputingOSS/llvm-cbe 曾经IR到C有一个backend,2016年被移除了。现在有人接手
-
https://corescholar.libraries.wright.edu/cgi/viewcontent.cgi?article=3277&context=etd_all LLVM IR based decompilation。
-
https://github.com/lifting-bits/sleigh sleigh作为Ghidra的反编译器,是用C++写的,而且汇编到pcode的lift部分也是它负责的。所以用Ghidra可能也只要用这个就可以了。
-
Ghidra上的ASI https://blog.grimm-co.com/2020/11/automated-struct-identification-with.html
领域的研究者
WebAssembly
University of Stuttgart 的 Michael Pradel 以及他的学生 Daniel Lehmann 在webassembly方面发了很多paper。
WebAssembly的反编译
一篇本科毕业论文《Decompilation of WebAssembly using Datalog》,可以在这里下载到全文。作者是LOVE BRANDEFELT,代码在这个gitlab仓库
基于Rust语言,遍历了各种指令,导出为Facts,代码并不复杂。Facts包含大量的CSV文件。