【问题标题】:LoadLibrary cannot find ntoskrnlLoadLibrary 找不到 ntoskrnl
【发布时间】:2013-08-04 11:25:37
【问题描述】:

我正在编写一个调用 KeBugCheck 并导致系统崩溃但 LoadLibrary 无法找到 ntoskrnl.exe 的小应用程序(调用 GetLastError 时我得到 126 作为返回值)

这是我的代码:

void* fnc;
HMODULE bcLib;
bcLib = LoadLibrary((LPCWSTR)"ntoskrnl.exe");
fnc = (void*) GetProcAddress(bcLib, (LPCSTR)"KeBugCheck");
int(*KeBugCheck)(ULONG);
KeBugCheck = (int(*)(ULONG))fnc;
KeBugCheck(0x000000E2);

另外,在调试窗口中,我看到了这个错误:

app.exe 中 0x00000000 处的第一次机会异常:0xC0000005: 访问冲突执行位置 0x00000000。

任何帮助都会非常感谢

【问题讨论】:

    标签: c++ windows winapi visual-c++ loadlibrary


    【解决方案1】:

    KeBugCheck 是一个核函数。这意味着您不能从用户模式代码中调用它,例如您正在尝试编写的应用程序。

    也没有为此函数提供用户模式包装器,因为用户模式代码不应该能够关闭整个系统。

    您必须编写自己的内核模式驱动程序来执行此操作。要开始使用,请下载Windows Driver Development Kit (DDK)。在这种情况下,将不需要整个 LoadLibraryGetProcAddress 舞蹈,因为函数声明位于公共 Ntddk.h 标头中,并将自动从 Ntoskrnl.lib 文件中链接。


    至于您在这里遇到的问题,LoadLibrary 返回ERROR_MOD_NOT_FOUND,这无关紧要。您的代码是错误的,从显式转换为 LPCWSTR 很明显,您必须执行才能关闭编译器。

    您正在编译一个 Unicode 应用程序,因此对 LoadLibrary 的调用会自动解析为 LoadLibraryW,它接受类型为 LPCWSTR 的宽 (Unicode) 字符串。您正在尝试向它传递一个 narrow 字符串文字,这会生成类型不匹配错误。除了你已经插入了演员表,这有效地告诉编译器闭嘴,因为你比它更清楚。除了你没有。你应该听编译器的;它可以让你避免很多错误。

    解决方法很简单:从代码中删除所有多余的强制转换,并改用 wide 字符串文字。 (不过,GetProcAddress 函数是独一无二的:它总是需要一个窄字符串,无论您是否为 Unicode 编译。)

    HMODULE bcLib = LoadLibrary(L"ntoskrnl.exe");
    void* fnc = (void*)GetProcAddress(bcLib, "KeBugCheck");
    

    当然,一旦你解决了这个问题,你就会想看看我回答的第一部分。

    【讨论】:

    • 嗯,但是为什么程序返回126作为返回码(ERROR_MOD_NOT_FOUND:找不到指定的模块)?
    • 我这样做了,但我仍然收到相同的错误 (126):HMODULE bcLib = LoadLibrary(L"ntoskrnl.exe"); void* fnc = (void*) GetProcAddress(bcLib, "KeBugCheck"); int(*KeBugCheck)(ULONG); KeBugCheck = (int(*)(ULONG))fnc; KeBugCheck(0x000000E2);
    • 这里有些东西没有通过......我不确定如何才能让它更清楚。该代码将无法正常工作。您不能从用户模式代码调用内核模式函数。我不知道你会得到什么错误信息。可能没有 ERROR_CANT_CALL_KERNEL_FUNCTIONS_FROM_USER_CODE 错误。你希望看到什么?
    • 我知道它不会或可能不会工作,但为什么它返回 ERROR_MOD_NOT_FOUND? Ntoskrnl.exe存在于system32中
    • 我来晚了,但是可以从用户模式调用 NtRaiseHardError 并且可以蓝屏系统。
    【解决方案2】:

    尝试使用 ntdll.dll NtRaiseHardError 函数。 ntdll 函数是您可以在用户模式中获得的最接近内核模式函数的函数,并且 NtRaiseHardError 最终会在内核中调用 KeBugCheck。

    【讨论】:

      猜你喜欢
      • 2017-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-27
      相关资源
      最近更新 更多