Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
TamperingSyscalls — C++ライブラリ。ハードウェアブレークポイントと例外ハンドラを使用してWindowsシステムコールの引数を取得・スプーフィングし、EDRテレメトリを迂回します。 | Kitploit
ツール/GitHubGitHub/rad9800/tamperingsyscalls
IDS/IPS回避ポストエクスプロイトレッドチーミングペイロード開発
GitHubrad9800/tamperingsyscalls

TamperingSyscalls

C++ライブラリ。ハードウェアブレークポイントと例外ハンドラを使用してWindowsシステムコールの引数を取得・スプーフィングし、EDRテレメトリを迂回します。

リポジトリを見る
508764年前Kitploit レビュー済み

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

TamperingSyscalls

TamperingSyscalls は、引数スプーフィングとシステムコール取得の 2 つのパートからなる斬新なプロジェクトで、どちらも EH を悪用して EDR を回避します。このプロジェクトは、直接システムコールに代わるソリューションを提供するために、これらの両方のプロジェクトで構成されています。

システムコールの改ざん。

  1. 後で使用するグローバル EH をセットアップします。
root@kitploit:~
SetUnhandledExceptionFilter( OneShotHardwareBreakpointHandler );
  1. 0f05 というバイト列を持つシステムコール命令のアドレスに、Dr0 レジスタを使用してハードウェアブレークポイントを設定します。 システムコールスタブのアドレスは、この簡単なメモリバイト検索で見つけることができます。
root@kitploit:~
BYTE stub[] = { 0x0F, 0x05 };
for( unsigned int i = 0; i < (unsigned int)25; i++ )
{
	if( memcmp( (LPVOID)((DWORD_PTR)function + i), stub, 2 ) == 0 ) {
		return (LPVOID)((DWORD_PTR)function + i);
	}
}
  1. 次に、この関数を呼び出し、<=4 個の引数(プロセスハンドルなどの情報を保持する、より重要な引数である傾向があります)に NULL を渡します。また、この関数に対応する Enum に EnumState を設定します(後で引数を修正できるようにするため)。
  2. EDR が私たちの引数を完全に検査できる一方で、最初の <=4 個の引数に NULL を渡しているため、悪意のあるアクションを実行していると確信を持って判断することはできません。
  3. EDR はその後、システムコール番号(SSN)を返し、それを RAX に格納します。システムコールの取得にのみ関心がある場合は、このリポジトリの stripped ブランチを確認してください。
  4. プログラムはその後、以前に設定したブレークポイントにヒットするシステムコール命令 { 0x0F, 0x05 } に流れ込みます。これにより SINGLE_STEP 例外がスローされ、ステップ 1 でセットアップした例外ハンドラによって処理されます。
root@kitploit:~
if( ExceptionInfo->ExceptionRecord->ExceptionCode == STATUS_SINGLE_STEP )
  1. この例外ハンドラは、Dr0 と RIP が一致する場合にのみ、Dr0 レジスタが指す値を 0 に設定することで(現在の RIP であるはずです)、Dr0 のハードウェアブレークポイントを無効にします。
root@kitploit:~
if( ExceptionInfo->ExceptionRecord->ExceptionCode == STATUS_SINGLE_STEP )
{
	if( ExceptionInfo->ContextRecord->Dr7 & 1 ) {
		if( ExceptionInfo->ContextRecord->Rip == ExceptionInfo->ContextRecord->Dr0 ) {
			ExceptionInfo->ContextRecord->Dr0 = 0;
  1. 次に、以前 NULL に設定した残りのレジスタを修正します。4 つになる理由は、x64 呼び出し規約により、最初の 4 つの引数には RCX、RDX、R8、R9 を使用し、残りはスタック上に設定されるためです。>4 個のパラメータをスタック上に手動で設定することも可能ですが、インラインアセンブリが必要になるため、このプロジェクトの範囲外です。R10 であって RCX ではない理由は、すべてのシステムコールスタブの先頭で mov r10, rcx が実行されるためです。RCX レジスタは次の命令で破壊されるからです。
root@kitploit:~
case NTMAPVIEWOFSECTION_ENUM:
	ExceptionInfo->ContextRecord->R10 =
		(DWORD_PTR)((NtMapViewOfSectionArgs*)(StateArray[EnumState].arguments))->SectionHandle;

	ExceptionInfo->ContextRecord->Rdx =
		(DWORD_PTR)((NtMapViewOfSectionArgs*)(StateArray[EnumState].arguments))->ProcessHandle;

	ExceptionInfo->ContextRecord->R8 =
		(DWORD_PTR)((NtMapViewOfSectionArgs*)(StateArray[EnumState].arguments))->BaseAddress;

	ExceptionInfo->ContextRecord->R9 =
		(DWORD_PTR)((NtMapViewOfSectionArgs*)(StateArray[EnumState].arguments))->ZeroBits;

この例では、NtMapViewOfSection の引数を修正していることがわかります。

使い方

EDR テレメトリの偽装を始めたい場合は、現在 NULL に設定されている p[FunctionName] の定義を変更することが可能です。

生成

必要な関数を生成するには、gen.py を使用します。これは次のいずれかをサポートしています:

  • カンマ区切りの関数
root@kitploit:~
python gen.py NtOpenSection,NtMapViewOfSection,NtUnmapViewOfSection

3 つのファイル(TamperingSyscalls.cpp、TamperingSyscalls.h、main.cpp)が生成されます。プロジェクトに #include "TamperingSyscalls.h" を組み込むことができます。関数名の前に p を付けることで関数を呼び出せます。例:pNtOpenSection(...);

制限事項

NtSetThreadContext またはその亜種にはブレークポイントを設定できません。これはデバッグレジスタを設定するために使用されるためです。 デバッグレジスタが設定される短い期間がありますが、これは非常に短く、Dr0 を開いたまま保持することで検出されることはないと思います。

これらのテクニックに触れた短いブログ記事を公開しました。

TamperingSyscalls の概要ブログ記事

TamperingSyscalls の偽のイントロスペクションブログ記事

ツールをダウンロード