
Библиотека Nim для разработки инструментов наступательной безопасности
Bitmancer — это библиотека для разработки инструментов offensive security для операционной системы Windows, написанная на Nim. Она предоставляет общие API, процедуры и макросы с высококонфигурируемыми, позиционно-независимыми автономными реализациями.
Если вы хотите разработать имплант, проверить быстрый PoC или написать новый блестящий инструмент — Bitmancer поможет вам начать!
⚠️ Этот репозиторий в настоящее время является масштабной незавершённой работой (WIP)! При использовании могут возникать проблемы, и на данный момент стабильность не гарантируется. ⚠️
Bitmancer частично использует winim для своих типов. Для установки выполните:
nimble install winim
Bitmancer пока не является частью репозитория nimble. На данный момент вы можете установить его с GitHub, просто выполнив:
nimble install https://github.com/zimawhit3/Bitmancer
MingW и Nim вводят зависимости от MSVCRT и Kernel32, а также глобальные переменные, используемые модулем System в Nim. Если вы хотите избежать этого для позиционно-независимого кода, используйте предоставленный nim.cfg.
Для компиляции:
nim c -d:mingw <Your_Nim_File>
Для всех модулей:
import Bitmancer
Если вам не нужны процедуры NTDLL или системные вызовы, вы можете просто использовать:
import Bitmancer/core
Только для процедур хеширования:
import Bitmancer/core/obfuscation/hash
Если вы хотели бы, чтобы какая-то функция/техника была реализована, сообщите мне!
Stack Strings:
var wStr {.stackStringW.} = "Hello!"
var cStr {.stackStringA.} = "World!"
Если вы хотите создать обёртку для системного вызова, которого сейчас нет в наличии, основной порядок действий следующий:
## Import syscalls
import Bitmancer/syscalls
## For hashing
import Bitmancer/core/obfuscation/hash
## Define your type
type NtClose = proc(h: HANDLE): NTSTATUS {.stdcall, gcsafe.}
## Generate the wrapper
genSyscall(NtClose)
## Define configurations for how to retrieve and execute the syscall
## The procedure's symbol enumeration method - available options are:
## UseEAT - use the export address table to resolve the symbol
## UseIAT - use the import address table to resolve the symbol
## UseLdrThunks - use the NTLoader's LdrThunkSignatures to map a clean NTDLL to resolve symbols from
const symEnum = SymbolEnumeration.UseEAT
## The SSN enumeration method - available options are:
## HellsGate
## HalosGate
## TartarusGate
## ZwCounter
const ssnEnum = SsnEnumeration.HellsGate
## Finally, the execution method - available options are:
## Direct - use the direct syscall stub
## Indirect - use the indirect syscall stub
const exeEnum = SyscallExecution.Indirect
## Define an ident to use to identify the symbol
const NtCloseHash = ctDjb2 "NtClose"
## Retrive NTDLL
let Ntdll = ? NTDLL_BASE()
## Call ctGetNtSyscall, retrieving the NtSyscall object containing the SSN, pointer to the address of the function
## and a casted stub to your type.
let NtSyscall = ctGetNtSyscall[NtClose](Ntdll, ModuleHandle(NULL), NtCloseHash, symEnum, ssnEnum, exeEnum)
## Finally, call the wrapper!
NtCloseWrapper(h, NtSyscall.wSyscall, NtSyscall.pSyscall, NtSyscall.pFunction)
Полный пример см. в примере runShellCode.
Дополнительные примеры также можно найти в ntdll.