逆向工程静态分析【免费下载链接】retdecRetDec is a retargetable machine-code decompiler based on LLVM.项目地址https://gitcode.com/gh_mirrors/re/retdec点击查看免费下载RetDecRetargetable Decompiler是一款以 LLVM 为核心构建的机器码反编译器可跨架构、跨操作系统、跨文件格式工作。本文以项目根目录 README.md 为主线结合仓库中的可执行程序入口 retdec-decompiler.cpp、默认配置 decompiler-config.json 与构建选项 options.cmake 等源码证据系统讲解 RetDec 的安装、使用、命令行参数、作为库集成以及从源码构建的完整流程。读完本文你将能够独立完成 RetDec 的部署熟练运用其命令行进行常规与选择性反编译并理解其 LLVM pass 流水线的底层工作原理。项目概览RetDec 能做什么RetDec 是一款可重定向retargetable的机器码反编译器——这意味着它不局限于某一种目标架构、操作系统或可执行文件格式而是通过统一的 LLVM 中间表示IR来处理不同的输入来源。从 README.md 中可以直接确认其能力边界支持的文件格式ELF、PE、Mach-O、COFF、AR静态库归档、Intel HEX 以及裸机器码raw machine code。支持的架构32 位Intel x86、ARM、MIPS、PIC32、PowerPC64 位x86-64、ARM64AArch64。功能特性一览README 原文列举对可执行文件进行静态分析并输出详细信息编译器与加壳器packer检测文件加载与指令解码基于签名signature移除静态链接的库代码提取并利用调试信息DWARF、PDB重构指令习语instruction idioms检测并重构 C 类继承体系RTTI、虚函数表 vtable对 C 二进制的符号进行 demangling支持 GCC、MSVC、Borland重构函数、类型与高级语言结构内置反汇编器输出两种高级语言C 和一种类 Python 语言生成调用图call graph、控制流图CFG以及多种统计信息。这些特性分别由仓库中对应模块落地实现例如src/fileformat文件格式解析、src/bin2llvmir二进制到 LLVM IR、src/llvmir2hllLLVM IR 到高级语言以及src/cpdetect编译器/加壳检测等读者可在 src 目录下按模块深入阅读。需要说明的是README 顶部明确披露项目当前处于有限维护模式limited maintenance modePull Request 会被优先审阅Issue 处理可能存在最长一个季度的延迟仅维持基础维护与非常有限的开发。这属于官方文档公开的项目状态事实规划使用时需注意。获取与安装两条路径README 提供了两种获取 RetDec 的方式下载预编译包下载官方发布的 stable 或 bleeding-edge 安装包解压后按照包内retdec/share/retdec/README.md的Use一节说明使用。从源码自行构建按照下文从源码构建一节编译安装安装后按本文命令行使用一节操作。平台支持与磁盘要求官方支持 Windows 7 或更高版本、Linux、macOS以及实验性的FreeBSD。一个已安装的 RetDec 大约需要5~6 GB的可用磁盘空间。命令行使用四种平台的反编译入门无论哪个平台核心用法一致将待反编译文件传给retdec-decompiler可执行程序。以下命令均以test.exe为例README 原样内容Windows$RETDEC_INSTALL_DIR\bin\retdec-decompiler.exe test.exeLinux$RETDEC_INSTALL_DIR/bin/retdec-decompiler test.exemacOS$RETDEC_INSTALL_DIR/bin/retdec-decompiler test.exeFreeBSD实验性$RETDEC_INSTALL_DIR/bin/retdec-decompiler test.exe其中$RETDEC_INSTALL_DIR即 RetDec 的安装目录。想了解更多选项直接运行retdec-decompiler --help即可程序会输出完整的参数帮助文本源码位于 retdec-decompiler.cpp。Windows 使用前置条件README安装 Microsoft Visual C Redistributable for Visual Studio 2017可选安装 UPX——用于预处理阶段的 UPX 解壳可选安装 Graphviz——用于生成调用图/控制流图。Linux/macOS 使用前置条件README同样建议通过发行版包管理器安装可选的 UPX 与 Graphviz作用同上。README 提醒务必阅读与你所用 RetDec 版本对应的使用说明不确定时以安装目录下的retdec/share/retdec/README.md为准。深入命令行参数基于源码的完整参考本节参数表直接取自retdec-decompiler --help输出见 retdec-decompiler.cpp并补充了源码中的默认值与校验逻辑。所有参数解析由ProgramOptions::loadOption()实现同文件 L167-L532。必需参数与常规参数参数说明默认值 / 备注INPUT_FILE要反编译的文件必需且是唯一不带-/--前缀的参数源码 L522-L527-o, --output FILE指定输出文件默认INPUT_FILE.cplain 格式或INPUT_FILE.c.jsonjson/json-human 格式-s, --silent关闭反编译过程的信息输出对应setIsVerboseOutput(false)-f, --output-format FORMAT输出格式plain/json/json-human默认plain-m, --mode MODE反编译模式bin标准二进制或raw裸机器码默认bin-p, --pdb FILE指定 PDB 调试信息文件文件必须存在否则报错-k, --keep-unreachable-funcs保留从 main 不可达的函数默认只保留可达函数--cleanup删除反编译过程中产生的临时文件仅清理本次运行标记的临时产物--config指定 JSON 格式的反编译配置文件参数从配置加载命令行的显式参数优先级更高--disable-static-code-detection禁止静态链接代码检测默认开启检测默认输出文件族源码afterLoad()retdec-decompiler.cpp L537-L558显示除主输出外还会在输入文件名基础上自动生成一系列伴随文件INPUT_FILE.dsm——反汇编结果INPUT_FILE.bc——LLVM bitcodeINPUT_FILE.ll——LLVM IR 文本INPUT_FILE.config.json——本次反编译使用的完整配置INPUT_FILE-unpacked——解壳产物若发生INPUT_FILE-extracted——归档/Mach-O 抽取产物若发生。使用-o out.c时这些伴随文件会改为以out为基底命名见 L296-L312。选择性反编译只处理感兴趣的部分参数说明--select-ranges RANGES逗号分隔的地址范围列表例如0x100-0x200,0x300-0x400,0x500-0x600--select-functions FUNCS逗号分隔的函数名列表例如fnc1,fnc2,fnc3--select-decode-only仅解码选中的函数/范围反编译更快但结果质量通常较差源码显示L322-L357使用--select-ranges或--select-functions时程序会自动启用keepAllFunctions且--select-decode-only对应参数selectedDecodeOnly这些字段在 parameters.h 中有完整的字段注释说明。裸机器码与 Intel HEX 反编译参数反编译裸二进制raw mode-m raw或 Intel HEX 文件时架构信息无法自动探测必须显式提供参数说明-a, --arch ARCH目标架构mips/pic32/arm/thumb/arm64/powerpc/x86/x86-64-e, --endian ENDIAN字节序little/big-b, --bit-size SIZE位宽16/32/64默认 32--raw-section-vma ADDRESS由裸二进制创建的 section 将被放置的虚拟地址--raw-entry-point ADDRESS裸二进制的入口点地址默认与架构相关源码afterLoad()L560-L591强制校验raw 模式下--raw-section-vma、--raw-entry-point、-a/--arch、-e/--endian必须全部显式给出否则直接报错退出-b也仅接受 16/32/64 三档L211-L228。归档AR文件反编译参数RetDec 可以直接处理静态库归档中的单个成员参数说明--ar-index INDEX按从 0 开始的索引选取归档中的文件进行反编译--ar-name NAME按名称选取归档中的文件--static-code-sigfile FILE追加一个额外的静态代码检测签名文件源码中--ar-index与--ar-name互斥同时给出会报错L465-L498归档抽取通过retdec::ar_extractor::ArchiveWrapper完成L840-L888其实现位于 src/ar-extractor。后端高级语言生成参数这些参数控制 llvmir2hll 后端的行为即 LLVM IR 到 C/类 Python 语言的翻译阶段参数说明可选值 / 默认--backend-disabled-opts LIST禁止执行列表中逗号分隔的优化见 llvmir2hll/optimizer 目录--backend-enabled-opts LIST只运行列表中逗号分隔的优化同上--backend-call-info-obtainer NAME函数调用信息获取器optim/pessim默认optim--backend-var-renamer STYLE变量重命名风格address/hungarian/readable/simple/unified默认readable--backend-no-opts禁用后端优化--backend-emit-cfg为每个函数输出控制流图.dot 格式--backend-emit-cg为反编译模块输出调用图.dot 格式--backend-keep-all-brackets生成的代码中保留全部括号--backend-keep-library-funcs保留来自标准库的函数--backend-no-time-varying-info不输出随时间变化的信息如日期--backend-no-var-renaming禁用后端变量重命名--backend-no-compound-operators不输出复合赋值运算符如--backend-no-symbolic-names禁止将常量参数转换为符号名这些布尔开关与Parameters类的字段一一对应见 parameters.h默认值均可在 decompiler-config.json 中查到如backendVarRenamer: readable、backendCallInfoObtainer: optim。反编译过程控制参数参数说明--timeout SECONDS设置反编译超时秒数超时则终止--max-memory MAX_MEMORY以字节数限制最大内存占用--no-memory-limit禁用默认内存限制默认为系统 RAM 的一半源码中main()通过std::packaged_taskstd::thread实现超时控制超时返回退出码 137L1030-L1051内存限制通过retdec::utils::limitSystemMemory系列函数落实L731-L753。注意 CHANGELOG.md v5.0 条目显示macOS 上内存限制能力因缺少可行实现已被禁用。LLVM IR 调试参数与其他--print-after-all在每个 LLVM pass 之后向 stderr 转储 LLVM IR--print-before-all在每个 LLVM pass 之前向 stderr 转储 LLVM IR-h, --help显示帮助--version显示 RetDec 版本。反编译执行流程从输入文件到高级语言从源码 decompile() 可以看出一次反编译的完整预处理流水线Mach-O 通用二进制抽取若输入是 Mach-O universalfat二进制按-a/--arch指定架构族抽取未指定则抽取最优归档BreakMachOUUniversal来自 src/macho-extractor归档抽取若传入--ar-index/--ar-name抽取对应成员若输入本身是归档但未指定成员则列出成员清单并拒绝反编译薄归档/空归档有专门错误提示解壳Unpacking调用retdec::unpackertool::_main尝试解壳成功后用解壳产物继续实现见 src/unpackertool核心反编译调用库函数retdec::decompile(config)见 src/retdec/retdec.cpp。retdec::decompile()内部在空 LLVM Module 上依次运行由config.parameters.llvmPasses指定的 pass 序列src/retdec/retdec.cpp L490-L513包括retdec-provider-init、retdec-decoder二进制解码为 LLVM IR见 src/bin2llvmir/optimizations/decoder、大量 LLVM 标准优化 pass、retdec-llvmir2hll生成高级语言输出等每个 pass 前会插入ModulePassPrinter以输出阶段日志。完整 pass 序列可在 decompiler-config.json 中查看其中既有retdec-前缀的自定义 pass也有instcombine、simplifycfg、mem2reg、licm、gvn等标准 LLVM pass。值得注意TargetLibraryInfoWrapperPass被配置为禁用所有内置 libcall 优化src/retdec/retdec.cpp L480-L488以免 LLVM 做出反编译器不期望的转换如把printf()调用改写为puts()。把 RetDec 作为库集成进你自己的 CMake 工程自 v5.0 起 RetDec 已成为一个真正的库见 CHANGELOG.md v5.0 条目retdec-decompiler.py脚本被移除取而代之的是编译型二进制Windows 上为retdec-decompiler.exe同时拆除了retdec-bin2llvmir、retdec-llvmir2hll等旧入口库用法的示例工程见 src/retdectool。若 RetDec 已安装到系统标准位置如/usr、/usr/local在你的 CMake 工程中直接find_package(retdec 5.0 REQUIRED COMPONENTS component [...] ) target_link_libraries(your-project PUBLIC retdec::component [...] )若 RetDec 安装在非标准位置需要在find_package()之前帮助 CMake 定位二选一即可将安装目录加入CMAKE_PREFIX_PATHlist(APPEND CMAKE_PREFIX_PATH ${RETDEC_INSTALL_DIR})将retdec_DIR设置为已安装的 RetDec CMake 脚本路径set(retdec_DIR ${RETDEC_INSTALL_DIR}/share/retdec/cmake)组件分发机制在仓库中可以直接验证根目录的 retdec-config.cmake 遍历retdec_FIND_COMPONENTS并逐个引入retdec-${component}-config.cmake每个组件目录都配有独立的-config.cmake文件例如 src/fileformat/retdec-fileformat-config.cmake、src/loader/retdec-loader-config.cmake。全部可用组件的完整清单见 cmake/options.cmake涵盖fileformat、loader、bin2llvmir、llvmir2hll、demangler、ctypesparser、unpacker、serdes等数十个库组件。从源码构建平台需求与完整流程README 推荐本地安装到专用目录除非使用发行版包管理器理由是卸载时只需删除单个目录即可。本地安装通过cmake -DCMAKE_INSTALL_PREFIXpath指定安装路径Linux/macOS 示例$HOME/projects/retdec-installWindows 示例C:\projects\retdec-install。各平台构建需求Linux支持 C17 的 C 编译器及标准库如 GCC 7CMake 3.6、Git、OpenSSL 1.1.1、Python 3.4autotools 工具链autoconf、automake、libtool、pkg-config、m4、zlib可选Doxygen 与 Graphviz生成 API 文档。各发行版一键安装命令README 原样# Debian 系如 Ubuntuapt-get sudo apt-get install build-essential cmake git openssl libssl-dev python3 autoconf automake libtool pkg-config m4 zlib1g-dev upx doxygen graphviz # RPM 系如 Fedoradnf sudo dnf install gcc gcc-c cmake make git openssl openssl-devel python3 autoconf automake libtool pkg-config m4 zlib-devel upx doxygen graphviz # Arch Linuxpacman sudo pacman --needed -S base-devel cmake git openssl python3 autoconf automake libtool pkg-config m4 zlib upx doxygen graphvizWindowsMicrosoft Visual C Visual Studio 2017 15.7、CMake 3.6、Git、OpenSSL 1.1.1、Python 3.4可选 Doxygen 与 Graphviz。macOSmacOS 10.15、完整 Xcode含命令行工具、CMake 3.6、Git、OpenSSL 1.1.1、Python 3.4、autotools建议通过 Homebrew 安装各包可选 Doxygen 与 Graphviz。FreeBSD实验性通过pkg预编译包仓库或ports方式安装cmake python37 git autotools等OpenSSL 预装于系统需检查版本。构建步骤Processgit clone https://gitcode.com/gh_mirrors/re/retdec cd retdec mkdir build cd build cmake .. -DCMAKE_INSTALL_PREFIXpath make -jN # N 为并行编译进程数通常取 核数1 最快 make installWindows 上使用 Visual Studio 生成器cd retdec mkdir build cd build cmake .. -DCMAKE_INSTALL_PREFIXpath -Ggenerator cmake --build . --config Release -- -m cmake --build . --config Release --target install也可直接在 Visual Studio IDE 中打开cmake生成的retdec.sln。CMake 可选参数详解README 明确给出的构建期参数如下-DCMAKE_INSTALL_PREFIXpath设置安装路径。Windows 使用反斜杠时需加引号例如-DCMAKE_INSTALL_PREFIXC:\retdec。仅 Windows-Ggenerator32 位用-GVisual Studio 15 201764 位用-GVisual Studio 15 2017 Win64更新的 VS 版本也可使用。-DRETDEC_DOCON连带构建 API 文档需 Doxygen 与 Graphviz默认关闭。-DRETDEC_TESTSON构建测试默认关闭。-DRETDEC_DEV_TOOLSON构建开发工具默认关闭。-DRETDEC_COMPILE_YARAOFF关闭安装阶段的 YARA 规则编译默认开启。-DCMAKE_BUILD_TYPEDebug构建含调试信息的版本默认 ReleaseWindows 上此参数无效改用cmake --build . --config Debug。-Ddep_LOCAL_DIRpathdep取自{CAPSTONE, GOOGLETEST, KEYSTONE, LLVM, YARA, YARAMOD}可让指定依赖使用本地克隆仓库构建时不再重新下载多个可同时使用。-DRETDEC_ENABLE_componentON只构建指定组件及其依赖一旦使用此机制未显式启用的组件将不再构建。全部可用组件选项见 cmake/options.cmake。-DRETDEC_ENABLE_ALLON重新启用全部组件或-DRETDEC_ENABLE逗号分隔组件列表等价于逐一设置-DRETDEC_ENABLE_componentON例如-DRETDEC_ENABLEfileformat,loader,ctypesparser等价于-DRETDEC_ENABLE_FILEFORMATON -DRETDEC_ENABLE_LOADERON -DRETDEC_ENABLE_CTYPESPARSERON。从 options.cmake 的源码可进一步理解组件机制的两个关键行为其一RETDEC_ENABLE_ALL默认 ON但一旦设置了任一RETDEC_ENABLE_component即被自动关闭L110-L152其二组件之间存在自动的依赖传导关系如bin2llvmir依赖loader、fileformat、rtti-finder等见 L226-L383且依赖方会自动带上如CAPSTONE、LLVM、YARA、ELFIO、RAPIDJSON等第三方依赖L433-L508。RETDEC_TESTSON时还会按组件自动开启对应的 gtest 测试集如RETDEC_ENABLE_FILEFORMAT_TESTS见 L386-L427。使用 Docker 构建与运行Docker 支持由社区维护README 明确说明。其优势在于无需在本地安装完整构建工具链即可尝试 RetDec。构建镜像# 基于仓库 master 分支构建 docker build -t retdec - Dockerfile # 使用本地仓库副本构建开发镜像 docker build -t retdec:dev . -f Dockerfile.dev仓库根目录的 Dockerfile 展示了多阶段构建builder阶段在 Ubuntu focal 上安装全部依赖并执行cmake .. -DCMAKE_INSTALL_PREFIX/home/retdec/retdec-install make -j$(nproc) make install最终阶段仅保留运行时依赖openssl、graphviz、upx、python3并将/retdec-install拷贝进镜像、把其bin目录加入PATH。运行容器若宿主uid不是 1000先确保存放输入二进制的目录对容器可访问chmod 0777 /path/to/local/directory然后运行docker run --rm -v /path/to/local/directory:/destination retdec retdec-decompiler /destination/binary注意/destination是容器内固定挂载点不要修改只需替换/path/to/local/directory输出文件将生成到该本地目录中。持续集成产物与配套生态README 说明项目从master分支最新提交生成夜间构建Nightly Builds方式有 TeamCity 与 GitHub Actions 两种。这些构建主要面向开发者、贡献者及产品试验者例如验证某个 issue 在最新 master 上是否仍存在官方不保证其在你的系统上一定可用且存在回归风险。要获得稳定版本应下载最新官方发布包或从最新发布标签自行构建。GitHub Actions 的 CI 工作流配置可参考仓库中的.github/workflowsREADME 提及的retdec-ci.yml。README 还列出了相关仓库包括将 RetDec 嵌入 IDA 的 retdec-idaplugin、嵌入 Radare2 的 retdec-r2plugin、回归测试框架与回归测试套件、构建系统测试套件同时可作为 RetDec 库用法的示例集以及为 RetDec 反汇编输出.dsm文件提供 Vim 语法高亮的 vim-syntax-retdecdsm。这些项目虽不在本仓库内但可在规划集成方案时参考其存在。许可与致谢RetDec 版权归 Avast Software2017采用 MIT 许可证见 LICENSE。它整合了修改版 PeLib 库Avast 新增模块采用 MIT 许可原始源码沿用 zlib/libpng 许可Sebastian Porst2004-2005见 LICENSE-PELIB其余第三方库及其许可清单见 LICENSE-THIRD-PARTY。该项目还获得捷克技术署TACRALFA 计划 No. TA01010667 的研究资助。结语本文从 README.md 出发完整覆盖了 RetDec 的能力边界、双路径安装、四大平台的命令行用法、全部反编译参数、库级 CMake 集成、源码构建选项以及 Docker 化部署并借助 retdec-decompiler.cpp、retdec.cpp、decompiler-config.json、options.cmake 与 parameters.h 等源码文件还原了参数默认值、校验逻辑与 LLVM pass 流水线的实现细节。无论是直接使用预编译包、从源码定制构建还是把fileformat、loader、bin2llvmir等组件作为库接入自有工具链本文给出的命令与配置均可直接落地验证。赞分享逆向工程静态分析【免费下载链接】retdecRetDec is a retargetable machine-code decompiler based on LLVM.项目地址https://gitcode.com/gh_mirrors/re/retdec点击查看免费下载相关推荐【亲测免费】 RetDec基于LLVM的强大机器码反编译工具RetDec基于LLVM的强大机器码反编译工具 项目基础介绍与编程语言 RetDecRetargetable Decompiler是一个采用LLVM框架的逆向工程静态分析3分钟掌握Vial-GUI终极键盘自定义配置工具完全指南3分钟掌握Vial GUI终极键盘自定义配置工具完全指南 想要彻底释放机械键盘的潜力吗Vial GUI这款开源跨平台键盘配置工具正是你需要的解决方案Via如何利用RetDec实现高效代码重构从反编译到可维护代码的完整指南如何利用RetDec实现高效代码重构从反编译到可维护代码的完整指南 RetDec是一款基于LLVM的可重定向机器码反编译器它能够将二进制文件转换为可读性强的逆向工程静态分析上一篇Milvus Java SDK v2.5.5 版本发布增强向量搜索能力与写入优化下一篇Semi Design 树形控件(Tree)完全指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
