Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
apiscope — Un framework di API hooking per intercettare e monitorare le applicazioni Windows. | Kitploit
Strumenti/GitHubGitHub/kaisonox/apiscope
Analisi Dinamica (Sandboxing)Analisi Dinamica del Codice (DAST)Reverse EngineeringTest di Sicurezza delle APIDebuggerAnalisi MalwareAnalisi di Binari
GitHubkaisonox/apiscope

apiscope

Un framework di API hooking per intercettare e monitorare le applicazioni Windows.

Vedi Repository
2042 mesi faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi
Sito web

ApiScope

Build CodeQL

ApiScope è uno strumento di ricerca per Windows x64 che traccia chiamate API selezionate in un processo nuovo o già in esecuzione. Segue gli eventi di caricamento delle DLL tramite l'API del debugger di Windows e installa hook prima che il processo sottoposto a debug continui da ogni evento.

Hook inclusi:

  • ntdll.dll!NtCreateFile (registra il percorso di destinazione)
  • ntdll.dll!NtOpenFile (registra il percorso di destinazione)
  • ntdll.dll!NtReadFile
  • ntdll.dll!NtWriteFile
  • ntdll.dll!NtClose
  • ntdll.dll!NtOpenKey (registra il percorso della chiave)
  • ntdll.dll!NtSetValueKey
  • ntdll.dll!NtQueryValueKey
  • bcrypt.dll!BCryptOpenAlgorithmProvider

Demo

Demo di ApiScope

Guarda il video MP4.

Compilazione

Requisiti:

  • Windows x64
  • Visual Studio 2019 o successivo con il carico di lavoro C++
  • CMake 3.20 o successivo
  • Git, usato da CMake per recuperare il decoder Zydis ancorato a un commit fisso
root@kitploit:~
cmake -S . -B build -A x64
cmake --build build --config Release
ctest --test-dir build -C Release --output-on-failure
powershell -ExecutionPolicy Bypass -File .\scripts\validate-apiscope-hooks.ps1 .\build\bin\Release\apiscope-hooks.dll
powershell -ExecutionPolicy Bypass -File .\scripts\smoke.ps1 -SkipBuild

Zydis v4.1.1 viene recuperato a un commit fisso e collegato solo in apiscope.exe. La DLL iniettata apiscope-hooks.dll rimane priva di import.

Utilizzo

root@kitploit:~
apiscope.exe [--help | --version | --list-hooks]
apiscope.exe run -k <module!export|all> [-k <module!export>] [-f text|jsonl] [-o <path>] [-q] -- <program> [args...]
apiscope.exe attach -p <pid> -k <module!export|all> [-k <module!export>] [-f text|jsonl] [-o <path>] [-q]

I nomi degli hook sono sempre qualificati dal modulo. La corrispondenza dei moduli non fa distinzione tra maiuscole e minuscole; la corrispondenza degli export fa distinzione tra maiuscole e minuscole.

root@kitploit:~
.\apiscope.exe run `
  --hook ntdll.dll!NtCreateFile `
  --hook bcrypt.dll!BCryptOpenAlgorithmProvider `
  -- C:\path\app.exe

.\apiscope.exe attach --pid 4242 --hook all

.\apiscope.exe run --hook all --format jsonl --output trace.jsonl --quiet -- app.exe

Gli eventi sul terminale rimangono leggibili mentre --output facoltativamente invia una copia del testo o JSONL su un file. --quiet sopprime il mirror degli eventi sul terminale. --color auto|always|never controlla il colore del terminale (default auto: attivo su una TTY, disattivato quando si usa una pipe o sotto NO_COLOR); il colore non compare mai nei file --output. Su una TTY, ApiScope mostra anche una barra di stato live (eventi, drop, velocità e conteggi per hook) che si ridisegna in posizione; controllala con --status auto|always|never.

root@kitploit:~
[*] ntdll.dll!NtWriteFile ----------
    timestamp      : 2026-06-07T17:44:23.3834340Z
    thread_id      : 3508
    sequence       : 3
    file_handle    : 0x000000000000008C
    length         : 16
    buffer_ascii   : Hello, ApiScope!
    result         : STATUS_SUCCESS (0x00000000)

Gli eventi JSONL contengono metadati generici e campi specifici dell'hook:

root@kitploit:~
{"schema_version":1,"sequence":1,"module":"bcrypt.dll","api":"BCryptOpenAlgorithmProvider","hook":"bcrypt.dll!BCryptOpenAlgorithmProvider","fields":{"flags":0,"result":"STATUS_SUCCESS (0x00000000)"}}

Vedi SCHEMA.md per l'involucro dell'evento e le codifiche dei campi per tipo (i puntatori e gli stati vengono mostrati come stringhe esadecimali 0x).

Premi Ctrl+C o Ctrl+Break per ripristinare gli hook attivi, rilasciare la strumentazione remota e scollegarti. Il processo target continua a essere eseguito. All'uscita naturale, ApiScope stampa lo stato del target in decimale ed esadecimale, seguito da un riepilogo della sessione (eventi, drop e conteggi per hook) su stderr.

Correlazione tra percorsi file e handle

NtCreateFile, NtOpenFile e NtOpenKey risolvono il path target da OBJECT_ATTRIBUTES e riportano l'handle risultante. ApiScope registra ogni apertura riuscita e annota le operazioni successive sullo stesso handle — letture, scritture, accesso ai valori del registro e la corrispondente NtClose — con il path risolto, così l'attività è leggibile senza dover tracciare manualmente gli handle. NtClose rimuove anche l'handle, e le aperture relative vengono risolte tramite un handle root_directory già visto in precedenza.

root@kitploit:~
[*] ntdll.dll!NtCreateFile ----------
    sequence          : 2
    path              : test_file.txt
    file_handle       : 0x000000000000008C
    result            : STATUS_SUCCESS (0x00000000)

[*] ntdll.dll!NtReadFile ----------
    sequence       : 3
    file_handle    : 0x000000000000008C
    buffer_ascii   : Hello, ApiScope!
    result         : STATUS_SUCCESS (0x00000000)
    path           : test_file.txt

Il path negli eventi di lettura e scrittura viene correlato dall'handle, non osservato direttamente nella chiamata.

Aggiunta di un hook

Ogni hook è un file in src/apiscope-hooks/hooks/ e dichiara insieme modulo sorgente, export, handler, slot del trampoline, convenzione di chiamata e firma:

root@kitploit:~
DEFINE_API_HOOK(
    BCryptOpenAlgorithmProvider,
    "bcrypt.dll",
    "BCryptOpenAlgorithmProvider",
    NTSTATUS,
    WINAPI,
    PVOID* Algorithm,
    const wchar_t* AlgorithmId,
    const wchar_t* Implementation,
    ULONG Flags) {
    TraceEvent event;
    InitializeTraceEvent(&event, "bcrypt.dll", "BCryptOpenAlgorithmProvider");
    AddTraceUInt32(&event, "flags", Flags);

    NTSTATUS result = CALL_ORIGINAL(
        BCryptOpenAlgorithmProvider,
        Algorithm,
        AlgorithmId,
        Implementation,
        Flags);
    AddTraceStatus(&event, "result", result);
    EmitTraceEvent(&event);
    return result;
}

apiscope.exe --list-hooks individua i descrittori a layout fisso esportati dalla DLL degli hook. Non è richiesto un elenco API centrale né uno schema eventi lato launcher.

Come funziona

root@kitploit:~
sequenceDiagram
    actor User
    participant ApiScope as apiscope.exe
    participant Debugger as Windows debugger API
    participant Target as Target process
    participant Modules as Loaded DLLs
    participant Hooks as apiscope-hooks.dll
    participant Ring as Shared-memory ring

    User->>ApiScope: run program or attach PID
    alt run
        ApiScope->>Debugger: CreateProcess(DEBUG_ONLY_THIS_PROCESS)
    else attach
        ApiScope->>Debugger: DebugActiveProcess(PID)
    end
    ApiScope->>Debugger: DebugSetProcessKillOnExit(FALSE)
    Debugger-->>ApiScope: CREATE_PROCESS_DEBUG_EVENT
    ApiScope->>Target: Map import-free hook image
    ApiScope->>Ring: Create and initialize bounded ring
    ApiScope->>Target: Map shared section with NtMapViewOfSection

    loop CREATE_PROCESS / LOAD_DLL events
        Debugger-->>ApiScope: Module base and file handle
        ApiScope->>Modules: Register module name and base
        alt ntdll.dll loaded
            ApiScope->>Target: Build unpatched NtReadVirtualMemory bypass
        end
        ApiScope->>Modules: Resolve module.dll!Export and forwarders
        alt export and dependencies are loaded
            ApiScope->>Hooks: Resolve handler and trampoline slot
            ApiScope->>Target: Allocate trampoline and patch export
        else dependency is not loaded yet
            ApiScope->>ApiScope: Keep hook pending
        end
        ApiScope->>Debugger: ContinueDebugEvent
    end

    Target->>Hooks: Call patched API
    Hooks->>Target: CALL_ORIGINAL through trampoline
    Hooks->>Ring: Publish bounded TLV event
    opt first event in a pending batch
        Hooks->>Target: Signal reader through unpatched NtSetEvent
    end
    Ring-->>ApiScope: Drain event batches
    ApiScope-->>User: Readable text and optional JSONL

    opt UNLOAD_DLL_DEBUG_EVENT
        Debugger-->>ApiScope: Module unloaded
        ApiScope->>Target: Release associated hook state
        ApiScope->>Debugger: ContinueDebugEvent
    end

    alt target exits
        Debugger-->>ApiScope: EXIT_PROCESS_DEBUG_EVENT and exit status
        ApiScope->>Ring: Drain queued events
        ApiScope-->>User: Print decimal and hexadecimal exit status
    else Ctrl+C or Ctrl+Break
        User->>ApiScope: Stop tracing
        ApiScope->>Target: DebugBreakProcess
        ApiScope->>Target: Restore hooks and free instrumentation
        ApiScope->>Debugger: DebugActiveProcessStop
        ApiScope-->>User: Target continues running
    end

Il controller crea una sezione basata sul file di paging e la mappa in entrambi i processi. I thread degli hook pubblicano su un anello multi-produttore a capacità fissa usando numeri di sequenza per slot. Un bypass non patchato di NtSetEvent invia un risveglio aggregato per ogni batch in attesa, e il controller scarica gli eventi in batch. I produttori non aspettano mai il lettore; un anello pieno scarta e conta l'evento. Le anteprime dei buffer usano ancora un bypass non patchato di NtReadVirtualMemory, così puntatori target non validi falliscono senza mandare in crash l'hook.

Struttura del progetto

root@kitploit:~
cmake/                 Dependency configuration
docs/                  Event schema and format reference
scripts/               Validation and runtime smoke tests
src/apiscope/          CLI, debugger, mapper, patcher, and renderer
src/apiscope-hooks/    Import-free hook DLL and standalone hooks
src/include/           Shared contracts
tests/                 Unit and runtime test targets

Limitazioni

  • Solo Windows x64; l'architettura del controller e quella del target devono corrispondere.
  • Una sola sessione di ApiScope dovrebbe strumentare un target.
  • Il debugger potrebbe richiedere privilegi elevati per target protetti o elevati.
  • Le rilocazioni di trampoline non supportate falliscono in modo sicuro.
  • I forwarder di export ordinali non sono supportati.
  • La correlazione handle-percorso rimuove l'handle su ntdll.dll!NtClose quando quell'hook è attivo; senza di esso, un handle chiuso e riutilizzato mantiene il percorso precedente.
  • Il mapper manuale è specifico per l'immagine dell'hook priva di import.
  • Se ApiScope viene terminato forzatamente, DebugSetProcessKillOnExit(FALSE) mantiene vivo il target, ma gli hook e la strumentazione mappata restano residenti finché il target non esce.
  • La strumentazione delle parti interne di un processo può attivare i prodotti di sicurezza degli endpoint.

Usa ApiScope solo su sistemi e processi che sei autorizzato a ispezionare. Vedi SECURITY.md, CONTRIBUTING.md e ROADMAP.md.

Licenza

MIT. I componenti di terze parti mantengono le proprie licenze; vedi THIRD_PARTY_NOTICES.md.

Scarica lo strumento