代码之家  ›  专栏  ›  技术社区  ›  Yigang Wu

如何在DLL中隐藏导出函数

  •  1
  • Yigang Wu  · 技术社区  · 17 年前

    我不想让用户通过依赖关系在我的DLL中看到所有导出函数,有办法吗?我用C++和MS VisualStudio来完成我的DLL。

    7 回复  |  直到 17 年前
        1
  •  6
  •   Danny Shumer    17 年前

    另一种选择是创建一个导出函数,该函数将返回一个要隐藏的函数的地址数组——一旦有了这些地址,就可以直接调用它们

    static void** Funcs = {&foo, &foo1, &foo2, 0};
    
    __declspec (dllexport) void* GetFuncs (void)
    {
       return &Funcs;
    }
    

    在可执行文件中,可以执行以下操作

    void** Funcs = GetFuncs();
    
    (*Funcs[0]) (1, 2, 3);
    
        2
  •  4
  •   ChrisW    17 年前

    使用*.def文件并使用NONAME属性防止导出名称:请参阅 Exporting Functions from a DLL by Ordinal Rather Than by Name ... 有一个 an example here .

        3
  •  3
  •   Eran    17 年前

    这真的很尴尬,但是如果你不想让别人看到序数,你可以用COM包装你的函数。COM DLL只公开常见的COM函数,因此您的函数将被隐藏。然后,有一些技术可以在不首先注册DLL的情况下使用DLL,因此在系统中找不到有关将要使用的COM类的信息。使用COM确实是一个奇怪的原因,但是请求也很少见。。。

        4
  •  2
  •   Andrey    17 年前

    基本的 用户仍然可以通过GetProcAddress访问它们。

    我认为您必须使用更复杂的方法,例如eran提出的解决方案。

        5
  •  1
  •   Community Mohan Dere    9 年前

    Enumerate COM object (IDispatch) methods using ATL? 了解如何在COM DLL中查找函数名。

    另一个技巧是导出诱饵函数,使其崩溃或设置内部状态,以使代码知道它已被破坏。在受损状态下,代码可能故意生成错误结果或随机崩溃。它还可以将带有窥探者信息的邮件发送回帐户。

        6
  •  0
  •   shoosh    17 年前

    UPX .
    您看到的导出只是UPX用来将文件解压到内存中的东西