我想隐藏DLL中的导出符号以进行混淆。
当使用模块定义文件(.def
)看起来像这样时,这是非常可行的;
EXPORTS
??0Foo@QAE@XZ @1 NONAME
??1Foo@QAE@XZ @2 NONAME
?Bar@Foo@UAEHXZ @3 NONAME
麻烦的是,这种解决方案非常不灵活,需要手动工作。正如您在我的示例中所看到的,我正在导出C ++符号,因此它们由我的编译器进行了大量装饰。
所以我目前的工作流程看起来像这样;
我必须先创建一个我的DLL版本,使用__declspec(dllexport)
以标准方式导出所有符号,然后我需要使用dumpbin
或类似的方法提取所有导出的符号名称。完成后,我需要将符号复制并粘贴到我的模块定义文件中并添加NONAME
指令。然后我必须确保我的原始资源不再使用__declspec(dllexport)
。完成所有这些后,我需要在项目设置中激活该.def文件,然后我最终可以构建该DLL的导出符号免费版本。我猜这个相当简单的任务需要做很多工作。
在使用一堆脚本和东西覆盖所有这些之前,我认为也许,只是可能有一个更简单的解决方案?
请注意我使用的是VisualStudio(2012),因此,据我所知,那个漂亮的GCC pragma hidden
不会这样做。