Windows环境下如何通过Clang仅加载bogus-control-flow Pass插件?
仅加载指定LLVM Pass的Clang参数配置及代码修改方案
问题原因分析
- 原命令
-passes=bogus-control-flow报错,是因为该参数属于Clang前端而非clang++顶层参数,未通过-Xclang传递给前端处理。 - 改用
-mllvm --bogus-control-flow后加载全部Pass,是因为注册代码中PB.registerPipelineStartEPCallback会在优化流水线启动时强制添加所有混淆Pass,覆盖了指定单个Pass的操作;同时该参数是针对传统Pass体系的选项,不适用于新PassManager的注册方式。
解决方案
1. 修改Pass注册代码
移除自动添加所有Pass的registerPipelineStartEPCallback回调,仅保留通过Pass名称解析加载的逻辑,确保只有明确指定的Pass才会被加载。修改后的代码如下:
llvm::PassPluginLibraryInfo getBronyaObfusPluginInfo() { return {LLVM_PLUGIN_API_VERSION, "BronyaObfus", "v0.1", [](PassBuilder &PB) { PB.registerPipelineParsingCallback( [](StringRef PassName, FunctionPassManager &FPM, ...) { if (PassName == "bogus-control-flow") { FPM.addPass(BogusControlFlowPass()); return true; } if (PassName == "flattening") { FPM.addPass(FlatteningPass()); return true; } if (PassName == "mba-obfuscation") { FPM.addPass(MBAObfuscationPass()); return true; } return false; }); PB.registerPipelineParsingCallback( [](StringRef PassName, ModulePassManager &MPM, ...) { if (PassName == "string-obfuscation") { MPM.addPass(StringObfuscationPass()); return true; } return false; }); }}; } extern "C" LLVM_ATTRIBUTE_WEAK ::llvm::PassPluginLibraryInfo llvmGetPassPluginInfo() { return getBronyaObfusPluginInfo(); }
2. 使用正确的Clang命令
通过-Xclang将-passes参数传递给Clang前端,指定仅运行bogus-control-flow Pass。根据需求选择以下命令:
- 仅运行
bogus-control-flowPass(无其他优化):
.\bin\clang++.exe -O0 -Xclang -fpass-plugin='./BronyaObfus.dll' -Xclang -passes='bogus-control-flow' .\test.cpp -o .\a.exe
- 在O1优化流水线后运行
bogus-control-flowPass:
.\bin\clang++.exe -O1 -Xclang -fpass-plugin='./BronyaObfus.dll' -Xclang -passes='default<O1>,bogus-control-flow' .\test.cpp -o .\a.exe
注意:若LLVM版本较旧,可能需添加-fexperimental-new-pass-manager参数强制启用新PassManager,新版本通常已默认启用。
内容的提问来源于stack exchange,提问作者I3r0nya
相关产品推荐
相关产品推荐

