McSema:我正在进行提升 - Trail of Bits博客
McSema,我们的x86机器代码到LLVM位码二进制翻译器,刚刚进行了全新升级。上周我们成功举办了一次黑客松,显著提升了McSema的可用性、文档和代码质量。现在使用McSema分析和逆向工程二进制文件比以往任何时候都更加容易。
成长阶段
我们每天都在使用McSema。它使我们能够发现并加固二进制程序以防范安全漏洞,独立验证供应商源代码,并生成具有高代码覆盖率的应用程序测试。它是学术界和DARPA项目中持续研究的一部分。我们(和其他人)不断扩展它以分析日益复杂的程序。
可以说,自2014年开源以来,McSema一直处于快速增长期。当时,LLVM 3.5还是新潮的技术,McSema就使用了它。2015年如此,2016年也是如此。McSema在不断扩展和成长,但某些方面却停滞不前。随着时间的推移,我们产生了现代化的渴望,希望完善一切。上周,我们在McSema可用性黑客松中解决了这些成长中的问题。
带来回报
我们对McSema进行了广泛改进。代码比以往更清晰。安装更简单,可移植性更强。运行速度更快,生成的代码质量更高。
性能
McSema的构建速度比以前快得多。我们通过删除死代码和不需要的库,以及重新组织目录布局使其更具描述性,简化了构建系统。
McSema生成位码的速度更快。我们改进了McSema遍历控制流图的方式,移除了对Boost的依赖,并简化了位码生成。
McSema生成更精简、更快的位码。McSema不再在函数入口和出口处存储和溢出寄存器上下文。标志操作使用更快的自然位宽操作而不是位字段。McSema现在可以优化延迟生成的位码,以消除未使用的计算。优化后的位码更易于分析,并且更贴近原始程序的意图。
现代化
McSema现在使用标准的LLVM 3.8发行版。以前,McSema使用自定义修改的LLVM 3.5版本。这次升级带来了更快的构建时间和更现代的LLVM功能。我们还消除了McSema对Boost的依赖,选择使用现代C++11特性代替。
简化
新的命令行界面更加一致且易于使用:mcsema-disass用于反汇编二进制文件,mcsema-lift将反汇编结果转换为LLVM位码。
我们移除了bin_descend,这是我们自定义的二进制反汇编器。现在只有一个受支持的解码器,使用IDA Pro作为反汇编引擎。
新的代码布局更简单、更直观。构建McSema的CMake脚本现在更小、更简单。
旧的测试框架已被移除,转而采用基于集成测试的方法,且没有外部依赖。
新功能
McSema支持更多指令。我们一直在寻求帮助添加新的指令语义,并更新了我们的指令添加指南。
McSema现在可以通过mcsema-lift --list-supported命令告诉您哪些指令受支持,哪些不受支持。
新的集成测试框架允许轻松添加全面的翻译测试,并且有一个关于向McSema添加测试的新指南。
文档
我们的新文档详细描述了如何安装、使用、测试、扩展和调试McSema的代码库。我们还记录了常见错误及其解决方法。这些改进将使第三方更容易对McSema进行修改。
运行时
McSema不仅适用于静态分析。提升后的位码可以编译回可运行的程序。我们改进了McSema的运行时占用,使其运行更快,大大减少了内存使用,并使其能够以复杂的方式与本地Windows和Linux代码无缝交互。
投资未来
我们将继续投资改进McSema。我们一直在扩展对更大、更复杂软件的支持。我们希望转向使用Binary Ninja进行控制流恢复,而不是IDA Pro。我们计划添加将ARM二进制文件提升为LLVM位码的支持。我们希望拓宽McSema的适用性,包括分析移动应用程序和嵌入式固件。
我们正在寻找对McSema潜力感到兴奋的实习生。想要开始吗?尝试一下翻译真实Linux二进制文件的演练。之后,看看McSema如何使像libFuzzer这样的工具能够在二进制文件上工作。最后,联系我们,告诉我们您希望将McSema带向何方。如果我们喜欢您的想法并且您有计划,我们将付费让您实现它。
如果您喜欢这篇文章,请分享: Twitter LinkedIn GitHub Mastodon Hacker News