我正在编写一个小应用程序,它调用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: 0xC0000005:执行位置0x00000000的访问冲突中,在0x00000000处出现第一次机会异常。
任何帮助都将是非常有用的。
发布于 2013-08-04 11:36:57
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");当然,一旦你解决了这个问题,你会想看到我的答案的第一部分。
发布于 2019-08-05 15:25:28
尝试使用ntdll.dll NtRaiseHardError函数。ntdll函数是用户模式下最接近内核模式的函数,NtRaiseHardError最终在内核中调用KeBugCheck。
https://stackoverflow.com/questions/18042390
复制相似问题