- Implement complete cross-process injection engine via snd_inj_ctx_t - Track explicit remote_entry_point for safe thread hijacking and PE execution - Refactor standalone syscall resolvers into a unified pipeline (scan/sort) - Perfect status code system by purging generic fallbacks in favor of highly-specific, domain-aware error codes - Fix minor pointer validation and parsing bugs in the reflective loader
2.2 KiB
Hash Manifest (config/hashes.ini)
Location: config/hashes.ini
This INI-style manifest is the single source of truth for compile-time API string hashes. CMake runs scripts/generate_hashes.py at configure time, emitting sindri_hashes.h into the build directory (${CMAKE_BINARY_DIR}/generated/).
Purpose
Every time SindriKit needs to resolve a Windows API — whether walking the PEB for a module base, parsing an export table for a function address, or matching an import descriptor's DLL name — it compares a runtime-computed hash against a compile-time constant. This manifest defines exactly which strings get pre-hashed.
Format Specification
Module Sections: [module::<dll_name>]
Groups API names under a specific DLL. The build system generates a hash for both the module name itself and every API listed beneath it.
[module::ntdll.dll]
NtAllocateVirtualMemory
NtProtectVirtualMemory
NtFreeVirtualMemory
NtOpenSection
NtMapViewOfSection
NtClose
LdrLoadDll
This produces:
SND_HASH_NTDLL_DLL— hash of the module namentdll.dllSND_HASH_NTALLOCATEVIRTUALMEMORY— hash of the export name- ... one per API listed.
Extras Section: [extras] (optional)
Standalone strings that do not belong to any module (e.g., registry keys, object paths). The generator supports this section (scripts/generate_hashes.py), but config/hashes.ini does not currently define one — only [module::…] sections are present today.
When added, each line produces an individual SND_HASH_… define (no module hash for the section):
[extras]
SomeStandaloneString
Comments and Whitespace
Lines beginning with # are comments and are ignored by the parser. Blank lines are ignored.
Adding a New Domain
When implementing a new SindriKit domain that requires runtime API resolution:
- Add a new
[module::<dll_name>]section for the target DLL. - List every API the domain implementation calls beneath it.
- Rebuild. One
cmake --buildregenerates the entire header automatically.
# -- user32.dll ---------------------------------------------------------------
# APIs required by a future GUI evasion domain.
[module::user32.dll]
MessageBoxA
FindWindowA