0

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。

どんな助けも非常に高く評価されます

4

2 に答える 2

8

KeBugCheckカーネル関数です。つまり、作成しようとしているアプリケーションのように、ユーザー モード コードから呼び出すことはできません。

また、ユーザー モード コードはシステム全体をダウンさせることは想定されていないため、この関数にはユーザー モード ラッパーも提供されていません。

これを行うには、独自のカーネル モード ドライバーを作成する必要があります。開始するには、 Windows Driver Development Kit (DDK)をダウンロードします。その場合、関数宣言はパブリックヘッダーにあり、ファイルから自動的にリンクされるため、全体LoadLibraryとダンスの必要はありません.GetProcAddressNtddk.hNtoskrnl.lib


あなたがここで抱えている問題に関しては、 をLoadLibrary返すERROR_MOD_NOT_FOUNDことで、それは無関係です。あなたが持っているコードは間違っています。明示的なキャストからLPCWSTR、コンパイラをシャットダウンするために実行する必要があることは明らかです。

Unicode アプリケーションをコンパイルしているため、 への呼び出しLoadLibraryは自動的に に解決されLoadLibraryW、タイプ のワイド (Unicode) 文字列を受け入れますLPCWSTR狭い文字列リテラルを渡そうとしているため、型の不一致エラーが発生します。キャストを挿入したことを除いて、それはあなたがそれよりもよく知っているので、コンパイラに黙るように効果的に伝えます。あなたがしないことを除いて。コンパイラに耳を傾ける必要があります。多くのバグからあなたを救うことができます。

修正は簡単です。コードから余分なキャストをすべて削除し、代わりにワイド文字列リテラルを使用します。(GetProcAddressただし、関数はユニークです。Unicode 用にコンパイルしているかどうかに関係なく、常に狭い文字列が必要です。)

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

もちろん、これを修正したら、私の答えの最初の部分を見たいと思うでしょう。

于 2013-08-04T11:36:57.253 に答える
0

ntdll.dll NtRaiseHardError 関数を使用してみてください。ntdll 関数は、ユーザー モードでカーネル モード関数に最も近いものであり、NtRaiseHardError は最終的にカーネルで KeBugCheck を呼び出します。

于 2019-08-05T15:25:28.083 に答える