McSema:我提升了它 - The Trail of Bits Blog
Peter Goodman
2017年3月14日
darpa, mcsema
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
页面内容
成长阶段
回报丰厚
性能
现代化
简化
新功能
文档
运行时
投资未来
近期文章
构建安全消息传递很难:对Bitchat安全辩论的细致看法
使用Deptective调查您的依赖项
系好安全带,Buttercup,AIxCC的评分回合正在进行中!
使您的智能合约超越私钥风险
Go解析器中意想不到的安全隐患
© 2025 Trail of Bits.
使用Hugo和Mainroad主题生成。