Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在没有导入表或导入表中只有Ntdll.dll的情况下创建dll?_C++_Dll - Fatal编程技术网

C++ 如何在没有导入表或导入表中只有Ntdll.dll的情况下创建dll?

C++ 如何在没有导入表或导入表中只有Ntdll.dll的情况下创建dll?,c++,dll,C++,Dll,我想这样做是因为我需要将我的dll注入smss.exe或csrss。 我已经删除了Win32 DLL示例src中的所有代码,但它是无用的;当我将dll放入PEtools时,我在导入表中已经找到了kernel32.dll和msvcXXXX.dll 我试着在谷歌上搜索“本机dll”或“无导入表dll”,但我找不到任何相关信息 #include "stdafx.h" #include "Dr.h" BOOL APIENTRY DllMain( HMODULE hModule,

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

我试着在谷歌上搜索“本机dll”或“无导入表dll”,但我找不到任何相关信息

#include "stdafx.h"
#include "Dr.h"
BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        CreateThread(NULL, 9999, &Foo, NULL, 0, NULL);
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

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

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


在不链接任何.dll的情况下,您唯一能做的就是执行“普通”计算(不使用任何其他库或系统函数),或使用
int 0x2e
/
sysenter
汇编指令(32位)或
syscall
(64位)执行“原始”内核调用-本质上是重新实现ntdll.dll的功能。

如果您链接到
/NoDefaultLib
,您的要求是可能的,但这并不能解决您的问题,因为SMS和CSRSS不使用Win32子系统;它们使用本机NT子系统。如果要将DLL放入SMSS之类的本机程序中,则需要创建本机NT DLL


也就是说,搞乱CSRSS和SMS是个坏主意,但我假设您已经知道…

欢迎使用堆栈溢出。请花点时间阅读并参考您可以在此处询问的内容和方式。“请记住,如果您没有明确链接至少
ntdll.dll
,那么您就无能为力了”。。。事实上,这不是真的,但告诉孩子们这是一个很好的谎言。:-)@Mehrdad:当然,您仍然可以执行“原始”系统调用(正如我在回答的末尾所说的),这不像ntdll是魔术:-)……或者我遗漏了什么?不,我不是指系统调用。即使您不导入任何内容,NTDLL也始终在您的进程中加载。从这里开始,只需要找到一两个关键函数,如
LdrLoadDll
ldrgedllhandle
。天真地说,你可以通过蛮力内存扫描来寻找正确的签名,但实际上也可以直接找到它们,信不信由你。不过我不会把它贴在这里@迈赫达德:当然,我怎么能不去想呢?至于direct方法,我将通过FS寄存器访问TIB,其中有一个指向PEB的指针,其中有一个用于加载模块链表的条目。有趣的是,在新的“Pico进程”和“最小进程”中,这一切都会失败,其中ntdll不是由NtCreateProcess加载的。你真的在你自己的世界里!:-)是的,没错。。。