LoadLibrary cannot find ntoskrnl
LoadLibrary cannot find ntoskrnl
我正在编写一个小应用程序,它调用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时发生访问冲突。
任何帮助都将非常感谢
KeBugCheck
是一个内核函数。这意味着你不能从用户模式代码中调用它,就像你试图编写的应用程序一样。
也没有为这个函数提供用户模式包装器,因为用户模式代码不应该能够破坏整个系统。
要做到这一点,您必须编写自己的内核模式驱动程序。要开始,请下载Windows驱动程序开发工具包(DDK)。在这种情况下,将不需要整个LoadLibrary
和GetProcAddress
舞蹈,因为函数声明在公共Ntddk.h
头中,并且将从Ntoskrnl.lib
文件自动链接进来。
至于您在这里遇到的问题,LoadLibrary
返回ERROR_MOD_NOT_FOUND
,这是无关的。您的代码是错误的,从为了关闭编译器而必须执行的LPCWSTR
的显式转换中可以明显看出。
您正在编译一个Unicode应用程序,因此对LoadLibrary
的调用会自动解析为LoadLibraryW
,它接受类型为LPCWSTR
的宽(Unicode)字符串。您正试图向它传递一个窄字符串文字,这会产生类型不匹配错误。除了你已经插入了强制转换,这有效地告诉编译器关闭,因为你比它知道得更好。你应该听编译器的;它可以把你从很多错误中拯救出来。
修复方法很简单:从代码中删除所有多余的强制转换,并使用宽的字符串文字。(然而,GetProcAddress
函数是唯一的:它总是需要一个窄字符串,无论你是否为Unicode编译。)
HMODULE bcLib = LoadLibrary(L"ntoskrnl.exe");
void* fnc = (void*)GetProcAddress(bcLib, "KeBugCheck");
当然,一旦你解决了这个问题,你就会想看看我答案的第一部分。
尝试使用ntdll.dll NtRaiseHardError函数。ntdll函数是在用户模式下最接近内核模式的函数,NtRaiseHardError最终会在内核中调用KeBugCheck。
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- OpenMP卸载说'fatal error: could not find accel/nvptx-none/mkoffload'
- 使用.find函数在c++中查找字符和另一个字符之间的大小
- 在 QVector<std::unique_ptr 上使用 std::find<Type>>
- 错误"Could not find Boost"(缺少:上下文标头)
- /usr/bin/ld: cannot find -lc++
- std::find,返回所有找到的值的替代方法,而不仅仅是存在重复的向量的第一个值
- 使用 find 解析文件会给出不同文件的奇怪结果
- 在 ifcondition al中 find() C++ STL 中的 == a.end() 有什么用?
- 如何调用 ntoskrnl.exe srand 函数?
- Cannot find -lglad
- "Cannot find -l<directory>"错误 - CMake
- 为什么在向量上使用 std::find() 时会出现错误?
- 为什么映射插入和 map.find() 的单次迭代比插入和 map.find() 的两次单独迭代慢得多
- C++ find() 在存储为变量时返回不同的值
- set::find 查找不存在的元素
- 使用 std::find 时没有匹配的函数调用错误
- 在先前调用 string::find 后添加内存分配和内存集会导致它返回 npos.为什么?
- Windows cannot find MinGW
- LoadLibrary cannot find ntoskrnl