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

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
nimvoke — Indirect syscalls + DInvoke をシンプルに。 | Kitploit
ツール/GitHubGitHub/nbaertsch/nimvoke
IDS/IPS回避シェルコードポストエクスプロイトレッドチーミングペイロード開発
GitHubnbaertsch/nimvoke

nimvoke

Indirect syscalls + DInvoke をシンプルに。

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

人気

すべて見る →

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

すべてのツールを探索

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

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

nimvoke

間接システムコール + DInvoke をシンプルに。

自身の Nim プロジェクトに直接インポートできるように設計された nimvoke は、マクロを使って間接システムコールと DInvoke スタイルのデリゲート宣言の詳細を抽象化します。このライブラリは、すぐに使えて比較的 op-sec フレンドリーになることを意図しています。マクロで使用される関数名とライブラリ名はコンパイル時にハッシュ化され、SSN と syscall 命令のアドレスはフックの有無にかかわらず取得されます。すべてのシステムコールは ntdll.dll 内の正しい syscall 命令を経由します。

使用方法

nimble でインストールし (nimble install https://github.com/nbaertsch/nimvoke)、関連するライブラリをインポートして対応するマクロを呼び出すだけです。詳細は examples を参照してください。

DInvoke:

root@kitploit:~
import winim/lean
import nimvoke/dinvoke

dinvokeDefine(
        ZwAllocateVirtualMemory,
        "ntdll.dll",
        proc (ProcessHandle: Handle, BaseAddress: PVOID, ZeroBits: ULONG_PTR, RegionSize: PSIZE_T, AllocationType: ULONG, Protect: ULONG): NTSTATUS {.stdcall.}
    )

var
        hProcess: HANDLE = 0xFFFFFFFFFFFFFFFF
        shellcodeSize: SIZE_T = 1000
        baseAddr: PVOID
        status: NTSTATUS

status = ZwAllocateVirtualMemory(
    hProcess,
    &baseAddr,
    0,
    &shellcodeSize,
    MEM_RESERVE or MEM_COMMIT,
    PAGE_READWRITE)

システムコール:

root@kitploit:~
import winim/lean
import nimvoke/syscalls

var
        hProcess: HANDLE = 0xFFFFFFFFFFFFFFFF
        shellcodeSize: SIZE_T = 1000
        baseAddr: PVOID
        status: NTSTATUS

status = syscall(NtAllocateVirtualMemory,
            hProcess,
            &baseAddr,
            0,
            &shellcodeSize,
            MEM_RESERVE or MEM_COMMIT,
            PAGE_READWRITE
        )

重要な Op-Sec の注意点

DInvoke

すべての Nim バイナリは、一連のコア Win32 関数をインポートします。その他の Win32 関数はすべて dynlib を介して解決されます。dynlib は実行時に関数を解決するために GetProcAddress と LoadLibraryA を使用します。この DInvoke 実装は、他のコード (Nim ランタイム/GC または dynlib を介してインポートする stdlib コード) で使用されていない 新しい 関数が公開されるのを防ぐことができますが、Nim のコアインポートを削除したり、標準またはサードパーティライブラリの動作を変更したりすることはできません。

Syscalls

インポート時に、nimvoke/syscalls は ntdll.dll の EAT を解析してすべてのシステムコールを見つけ、必要なデータを抽出します。すべてのシステムコールに関する情報はメモリに保存されます。

root@kitploit:~
type
    Syscall* = object
        pName*: PCHAR
        ord*: WORD
        pFunc*: PVOID
        pSyscall*: PVOID = NULL
        ssn*: WORD
        hooked*: bool
...
syscallSeq: seq[Syscall] # stores all syscall data
syscallTable* = initTable[string, ptr Syscall]() # maps syscall `Zw` hashed-name to `Syscall` object's in the `syscallSeq`

SSN の取得は、すべてのシステムコールをアドレス順にソートして数えることで行われます。この方法は、フックの有無にかかわらず機能するはずです。関数名の文字列はメモリに保存されませんが、ハッシュ計算のために ntdll.dll の EAT 内の関数名文字列へのポインタが保持されます。

システムコールは、単一のトランポリン (FreshyCalls 由来) を使用して、SSN を eax に移動し、引数を準備し、ntdll.dll 内の正しい syscall 命令にジャンプします。このトランポリンは、新しいプライベートヒープ上に割り当てられます。

このシステムコール初期化コードの前にコードを実行したい場合 (サンドボックス回避や環境キーイングなど)、コード内の import nimvoke/syscalls ステートメントより前に呼び出す必要があります。

今後の予定

  • x86 サポート
  • より堅牢なエラーハンドリングと、プロセスに存在しないライブラリの読み込みを追加
  • 合成スタックフレームのスプーフィングを含める

提案がありますか? イシューを開いてください! PR も歓迎します。

謝辞

  • FreshyCalls と rust_syscalls は、'arg-shifting' システムコールトランポリンを提供してくれたことに感謝します。
  • アイデアをくれた S3cur3Th1sSh1t
  • 素晴らしい学習教材とコミュニティを提供してくれた MrUn1k0d3r
  • 確かなトレーニングを提供してくれた Sektor7
ツールをダウンロード