Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
apiscope — Un framework de hooking de API para interceptar y monitorear aplicaciones de Windows. | Kitploit
Herramientas/GitHubGitHub/kaisonox/apiscope
Análisis Dinámico (Sandboxing)Análisis Dinámico de Código (DAST)Ingeniería InversaPruebas de Seguridad de APIsDepuradoresAnálisis de MalwareAnálisis de Binarios
GitHubkaisonox/apiscope

apiscope

Un framework de hooking de API para interceptar y monitorear aplicaciones de Windows.

Ver Repositorio
2048hace 2 mesesAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Sitio web
Compartir

ApiScope

Build CodeQL

ApiScope es una herramienta de investigación para Windows x64 que permite rastrear llamadas API seleccionadas en un proceso nuevo o en ejecución. Sigue los eventos de carga de DLL a través de la API del depurador de Windows e instala hooks antes de que el proceso depurado continúe desde cada evento.

Hooks incluidos:

  • ntdll.dll!NtCreateFile (registra la ruta de destino)
  • ntdll.dll!NtOpenFile (registra la ruta de destino)
  • ntdll.dll!NtReadFile
  • ntdll.dll!NtWriteFile
  • ntdll.dll!NtClose
  • ntdll.dll!NtOpenKey (registra la ruta de la clave)
  • ntdll.dll!NtSetValueKey
  • ntdll.dll!NtQueryValueKey
  • bcrypt.dll!BCryptOpenAlgorithmProvider
  • Demostración

    Demostración de ApiScope

    Ver el vídeo MP4.

    Compilación

    Requisitos:

    • Windows x64
    • Visual Studio 2019 o posterior con la carga de trabajo de C++
    • CMake 3.20 o posterior
    • Git, utilizado por CMake para descargar el decodificador Zydis fijado
    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 se descarga en un commit fijado y se enlaza únicamente en apiscope.exe. El apiscope-hooks.dll inyectado permanece libre de imports.

    Uso

    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]
    

    Los nombres de hooks siempre están calificados por módulo. La coincidencia de módulos no distingue entre mayúsculas y minúsculas; la coincidencia de exports sí distingue entre mayúsculas y minúsculas.

    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
    

    Los eventos de terminal permanecen legibles mientras que --output opcionalmente duplica texto o JSONL a un archivo. --quiet suprime el espejo de eventos en la terminal. --color auto|always|never controla el color de la terminal (por defecto auto: activo en una TTY, desactivado cuando se redirige o bajo NO_COLOR); el color nunca aparece en los archivos de --output. En una TTY, ApiScope también muestra un pie de estado en vivo (eventos, descartes, tasa y contadores por hook) que se redibuja en su lugar; contrólalo 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)
    

    Los eventos JSONL contienen metadatos genéricos y campos locales del hook:

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

    Consulta SCHEMA.md para conocer la envoltura del evento y las codificaciones de campos por tipo (los punteros y estados se muestran como cadenas hexadecimales 0x).

    Pulsa Ctrl+C o Ctrl+Break para restaurar los hooks activos, liberar la instrumentación remota y desadjuntarte. El objetivo continúa ejecutándose. En una salida natural, ApiScope imprime el estado del objetivo en decimal y hexadecimal, seguido de un resumen de sesión (eventos, descartes y contadores por hook) en stderr.

    Rutas de archivo y correlación de handles

    NtCreateFile, NtOpenFile y NtOpenKey resuelven la path objetivo a partir de OBJECT_ATTRIBUTES e informan del handle resultante. ApiScope registra cada apertura exitosa y anota las operaciones posteriores sobre el mismo handle — lecturas, escrituras, acceso a valores de registro y el NtClose correspondiente — con la path resuelta, de modo que la actividad sea legible sin tener que rastrear handles manualmente. NtClose también expulsa el handle, y las aperturas relativas se resuelven a través de un handle root_directory visto previamente.

    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
    

    La path en los eventos de lectura y escritura se correlaciona a partir del handle, no se observa en la propia llamada.

    Añadir un hook

    Cada hook es un archivo dentro de src/apiscope-hooks/hooks/ y declara conjuntamente su módulo de origen, export, handler, ranura de trampolín, convención de llamada y 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 descubre los descriptores de diseño fijo exportados por la DLL de hooks. No se requiere ninguna lista central de APIs ni un esquema de eventos en el lado del lanzador.

    Cómo funciona

    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

    El controlador crea una sección respaldada por el archivo de paginación del sistema y la mapea en ambos procesos. Los hilos de hooks publican en un anillo multiproductor de capacidad fija mediante números de secuencia por ranura. Un bypass sin parchear de NtSetEvent envía una única activación agrupada para cada lote pendiente, y el controlador drena los eventos por lotes. Los productores nunca esperan al lector; un anillo lleno descarta y cuenta el evento. Las vistas previas de búfer siguen utilizando un bypass sin parchear de NtReadVirtualMemory, de modo que los punteros inválidos del objetivo fallan sin bloquear el hook.

    Estructura del proyecto

    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
    

    Limitaciones

    • Solo Windows x64; la arquitectura del controlador y del objetivo deben coincidir.
    • Solo una sesión de ApiScope debe instrumentar un objetivo.
    • El depurador puede requerir elevación para objetivos protegidos o elevados.
    • La reubicación no admitida de trampolines falla de forma segura (fail closed).
    • No se admiten reenviadores de exports ordinales.
    • La correlación de handle a ruta expulsa en ntdll.dll!NtClose cuando ese hook está activo; sin él, un handle cerrado que se reutiliza conserva su ruta anterior.
    • El mapeador manual es específico de la imagen de hook libre de imports.
    • Si ApiScope se termina forzosamente, DebugSetProcessKillOnExit(FALSE) mantiene vivo al objetivo, pero los hooks y la instrumentación mapeada permanecen residentes hasta que el objetivo sale.
    • Instrumentar internals de procesos puede activar productos de seguridad de endpoints.

    Usa ApiScope solo en sistemas y procesos que estés autorizado a inspeccionar. Consulta SECURITY.md, CONTRIBUTING.md y ROADMAP.md.

    Licencia

    MIT. Los componentes de terceros conservan sus licencias; consulta THIRD_PARTY_NOTICES.md.

    Descargar herramienta