如何在没有导入表的情况下创建一个dll,或者在导入表中只创建Ntdll.dll?

时间:2017-02-13 00:05:40

标签: c++ dll

我想这样做因为我需要将我的dll注入smss.exe或csrss。 我删除了Win32 DLL示例src中的所有代码,但它没用;当我把我的dll放到PEtools时,我已经在导入表中找到了kernel32.dll和msvcXXXX.dll。

我尝试使用Google搜索“native dll”或“no import table dll”,但我找不到任何相关内容。

Content-Type

2 个答案:

答案 0 :(得分:1)

您可以通过静态链接(/MT命令行开关)来删除CRT dll中的依赖项。

对于ntdll.dll和kernel32.dll,您可以使用/NODEFAULTLIB命令行开关来避免任何隐式依赖,但请记住,如果您没有显式链接至少ntdll.dll那么没有太多你可以做的 - CRT将无法工作(即使静态链接它仍然取决于核心Win32 dll),你将无法使用任何Win32或NT API(使用{{1}例如,你需要kernel32.dll,而后者依赖于ntdll.dll;对于NT本机API等价 - CreateThread - 你只需要ntdll.dll就可以了。)

如果不链接任何.dll,你唯一能做的就是做“普通”计算(不使用任何其他库或系统函数),或使用NtCreateThread / {{1执行“原始”内核调用汇编指令(在32位上)或int 0x2e(在64位上) - 这实际上是重新实现ntdll.dll的功能。

答案 1 :(得分:1)

如果您与/NoDefaultLib链接,则可以提出要求,但由于SMSS和CSRSS不使用Win32子系统,因此无法解决您的问题。他们使用本机NT子系统。如果要将DLL放在像SMSS这样的本机程序中,则需要创建本机NT DLL。

那就是说,搞乱CSRSS和SMSS是一个坏主意,但我假设你已经知道......