如何隐藏DLL中的导出函数

时间:2009-05-11 13:41:42

标签: c++ visual-studio winapi dll

我不希望用户通过我的DLL中的Dependence看到所有导出功能,有没有办法做到这一点?我使用C ++和MS Visual Studio编译我的DLL。

7 个答案:

答案 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函数转换为索引