我不希望用户通过我的DLL中的Dependence看到所有导出功能,有没有办法做到这一点?我使用C ++和MS Visual Studio编译我的DLL。
答案 0 :(得分:5)
另一种选择可能是创建一个导出的函数,该函数将返回您要隐藏的函数的地址数组 - 一旦有了这些地址,就可以直接调用它们
static void** Funcs = {&foo, &foo1, &foo2, 0};
__declspec (dllexport) void* GetFuncs (void)
{
return &Funcs;
}
在您的可执行文件中,您可以执行以下操作
void** Funcs = GetFuncs();
(*Funcs[0]) (1, 2, 3);
答案 1 :(得分:4)
使用* .def文件并使用NONAME属性来阻止导出名称:请参阅Exporting Functions from a DLL by Ordinal Rather Than by Name ...这里有an example here。
答案 2 :(得分:3)
这真的很尴尬,但如果你不想让别人看到序数,你可以用COM包装你的功能。 COM DLL仅公开常见的COM函数,因此将隐藏您的COM函数。然后,有一些技术可以在不首先注册它的情况下使用DLL,因此在系统中找不到有关您将使用的COM类的信息。使用COM确实是一个奇怪的原因,但请求也很少见......
答案 3 :(得分:2)
使用NONAME的IMO对此无用 - 它不会隐藏依赖项。仍将显示依赖关系(通过使用序数)。您的基本用户仍然可以通过GetProcAddress访问它们。
我认为你必须使用更复杂的方法 - 例如伊兰提出的解决方案。
答案 4 :(得分:1)
请不要试图在COM对象中隐藏您的访问权限,以为它将被隐藏。请参阅此文章Enumerate COM object (IDispatch) methods using ATL?以了解某人如何探测COM DLL的函数名称。
此外,还希望隐藏导出函数的名称。当您的DLL通过其他代码模块供自己使用时,这是可取的,并且只做您希望您的调用代码具有访问权限的东西。此类别可能包括算法商业秘密。
另一个技巧是导出崩溃或设置内部状态的诱饵函数,以允许代码知道它已被泄露。在受损状态下,代码可以有目的地生成错误的结果或随机崩溃。它还可以将邮件发送回帐户,其中包含有关窥探者的信息。
答案 5 :(得分:0)
一种非常简单的方法是将其包装在像UPX这样的包装器中 您看到导出的内容只是UPX用来将文件解压缩到内存中的东西
答案 6 :(得分:0)
不,出口的全部意义在于它们是可见的。
这是简短的回答。长答案涉及.def文件。您可以告诉链接器使用[定义文件](http://msdn.microsoft.com/en-us/library/d91k01sh(VS.80).aspx)。
将C函数转换为索引