现有论文与资源

资源集

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

其他:

Github的两个list:

课程

现有的反编译器

  1. Ghidra ghidra/docmain.hh at master · NationalSecurityAgency/ghidra (github.com) 看代码前构建doxygen看文档。
  2. avast/retdec: RetDec is a retargetable machine-code decompiler based on LLVM. (github.com)
  3. Boomerang Decompiler (sourceforge.net) BoomerangDecompiler/boomerang: Boomerang Decompiler - Fighting the code-rot :) (github.com)
  4. yegord/snowman: Snowman decompiler (github.com)
  5. angr好像也有了

读论文

反编译器中端很好的资料:Static Single Assignment for Decompilation (Boomerang) 感觉可以抓住优化方面的脉络。虽然还是有不少启发式的方法,但相比其他资料已经好了很多。SSA现在也已经是反编译器不可缺少的重要部分。

控制流结构恢复-structural analysis

很多都是借用现有的type recovery,重点去讲structure recovery。

类型恢复 - Type Recovery

变量恢复

变量恢复和类型恢复关联较大。如果把函数开头分配的栈空间看作一个巨大的结构体,变量恢复就转换成了类型恢复。

OSPREY: Recovery of Variable and Data Structure via Probabilistic Analysis for Stripped Binary slides 把变量的访问看作变量存在的暗示,同时存在很多这样的暗示,使用概率性的推导。好像是基于后面那篇BDA的工作。

C++ 反编译

C++的类给反编译带来了额外的困难,涉及到(复杂的)约束求解等。

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,不太看得懂。

框架与综述

下游研究

反编译器测试

  • 【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系列

基于搜索的反编译

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

其他

最近的新论文

  • 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

其他资料(网页等):

  • 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 相关文档

  • The Decompilation Wiki.

    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

领域的研究者

Edward Schwartz

Shuai Wang

Gang Tan

WebAssembly

University of Stuttgart 的 Michael Pradel 以及他的学生 Daniel Lehmann 在webassembly方面发了很多paper。

WebAssembly的反编译

一篇本科毕业论文《Decompilation of WebAssembly using Datalog》,可以在这里下载到全文。作者是LOVE BRANDEFELT,代码在这个gitlab仓库

基于Rust语言,遍历了各种指令,导出为Facts,代码并不复杂。Facts包含大量的CSV文件。