c++ 如何在新的通行证管理器中加载通行证插件?

rn0zuynd  于 2023-08-09  发布在  其他
关注(0)|答案(1)|浏览(124)

我写了一个通过插件混淆,我想加载这个插件使用clang而不是opt在Windows中。但是,当我使用.\bin\clang++.exe -O1 -Xclang -fpass-plugin='./BronyaObfus.dll' -passes=bogus-control-flow .\test.cpp -o .\a.exe命令时,clang抛出一个错误:

clang++: error: unknown argument: '-passes=bogus-control-flow'

字符串
然后使用.\bin\clang++.exe -O1 -Xclang -fpass-plugin='./BronyaObfus.dll' -mllvm --bogus-control-flow .\test.cpp -o .\a.exe
它没有像预期的那样加载相应的传递(bogus-control-flow),而是加载了所有的传递。
这是我的注册码:

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;
                });

            PB.registerPipelineStartEPCallback([](ModulePassManager &MPM,
                                                  OptimizationLevel Level) {
              MPM.addPass(StringObfuscationPass());

              FunctionPassManager FPM;
              FPM.addPass(BogusControlFlowPass());
              FPM.addPass(FlatteningPass());
              FPM.addPass(MBAObfuscationPass());

              MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM)));
            });

          }};
}

extern "C" LLVM_ATTRIBUTE_WEAK ::llvm::PassPluginLibraryInfo
llvmGetPassPluginInfo() {
  return getBronyaObfusPluginInfo();
}


如果我只想加载bogus-control-flow pass,我应该如何向clang传递参数?

pbossiut

pbossiut1#

我也试过这个,但似乎不可能。只能从插件向优化通道管道添加通道(基于OptimizationLevel-O0-O1等)。在你的情况下,你有你所有的通行证,因为,这是所谓的:

PB.registerPipelineStartEPCallback([](ModulePassManager &MPM,
                                      OptimizationLevel Level) {
  MPM.addPass(StringObfuscationPass());

  FunctionPassManager FPM;
  FPM.addPass(BogusControlFlowPass());
  FPM.addPass(FlatteningPass());
  FPM.addPass(MBAObfuscationPass());

  MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM)));
});

字符串
你能做的就是将你当前的插件重构成更小的插件。例如bogus-control-flow.dll只添加BogusControlFlowPass通道:

PB.registerPipelineStartEPCallback([](ModulePassManager &MPM,
                                      OptimizationLevel Level) {
  FunctionPassManager FPM;
  FPM.addPass(BogusControlFlowPass());
  MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM)));
});


然后可以使用以下命令调用它:.\bin\clang++.exe -O1 -Xclang -fpass-plugin='bogus-control-flow.dll' .\test.cpp -o .\a.exe
假设您创建了插件:foo.dllbar.dlltar.dll如果您想启用从foo.dllbar.dll的传递,您可以通过提供以下内容来实现:-Xclang -fpass-plugin=foo.dll -Xclang -fpass-plugin=bar.dll

相关问题