我有一个用Visual C ++编写的DLL,我从头文件中导出函数。我将我想要导出的所有函数包装在另一个具有不同名称的函数中,以模糊名称并使那些试图在没有许可证的情况下使用其功能的人生活困难。目前,格式如下所示:
#ifdef EXPORTS
#define API extern "C" __declspec(dllexport)
#else
#define API extern "C" __declspec(dllimport)
#endif
CustomObject *MeaningfulFunction1(PCWSTR param);
API CustomObject *ObfuscatedName1(PCWSTR param)
{
return MeaningfulFunction1(param);
}
void MeaningfulFunction2(CustomObject *param1, int param2, int ¶m3, int ¶m4);
API void ObfuscatedName2(CustomObject *param1, int param2, int ¶m3, int ¶m4)
{
MeaningfulFunction2(param1, param2, param3, param4);
}
//repeat this style many times
现在这适用于导出。到目前为止所有调用此DLL的代码都是用C#编写的,所以直到现在我都不需要导入头...
此标头不适用于导入,即使我有extern "C" __declspec(dllimport)
定义,因为ObfuscatedName1
到ObfuscatedNameN
有定义,并且没有{的导出定义{1}}到MeaningfulFunction1
。
我知道我可以修改它看起来像这样:
MeangingfulFunctionN
但是为几十个函数编写代码是很乏味的,总体上是一个眼睛。 是否有更简单的方法使此方案有效?最好修改预处理器定义。 我认为像
#ifdef EXPORTS
CustomObject *MeaningfulFunction1(PCWSTR param);
#endif
API CustomObject *ObfuscatedName1(PCWSTR param)
#ifdef EXPORTS
{
return MeaningfulFunction1(param);
}
#else
;
#endif
这使第一部分变得容易,但我找不到第二部分的简单方案。 结果是在预处理器看到它之前剥离了注释,所以这甚至不起作用。
我知道我可以对它进行重新排序,以便在一个区块中包含所有正常名称,并在一秒内使用混淆的名称,但我宁愿将它们保持在相邻位置,以便更容易分辨出哪些是我进行修改时。谢谢!
答案 0 :(得分:1)
grep API your_header.h > import_header.h
然后删除
#define API extern "C" __declspec(dllexport)
grep将从import_header.h的顶部获取并附加一个;到每个函数声明的结尾。然后用它来进口。
您可能尝试的另一件事是创建一个头文件,只是简单地将有意义的名称映射到模糊名称:
#define MeaningfulName1 ObfuscatedName1
然后你可以在任何地方#include它,并且只能在代码中直接使用有意义的名称。
总的来说,我认为整个计划是一个坏主意。
答案 1 :(得分:0)
根据要求,我能够找到合理无痛的东西。
#ifdef EXPORTS
#define REDIR
#define API extern "C" __declspec(dllexport)
#define CleanName
#else
#define REDIR / ## /
#define API extern "C" __declspec(dllimport)
#define CleanName / ## /
#endif
CleanName CustomObject* Function(PCWSTR param);
API CustomObject* Obfuscated(PCWSTR param)
REDIR {
REDIR return Function(param);
REDIR }
;
//...
这样,导出时,REDIR
什么都不做,但在导入时,它会成为注释(Visual C ++编译器将/ ## /
连接到//
,因此会被忽略。 CleanName
。我还了解到在函数定义之后有一个;
不是错误,所以我可以把它悬挂在最后。当函数体包含在导出中时,{{1什么也不做,但是当导入时忽略函数体时,;
成为模糊函数名的前向声明的结尾。
我努力宣布这样的定义:
;
但是,这似乎在文件中间插入了一个EOF,因此编译器无法处理它。如果有人知道如何让它工作,请告诉我。