Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
nimvoke — Indirect syscalls + DInvoke를 간단하게. | Kitploit
도구/GitHubGitHub/nbaertsch/nimvoke
IDS/IPS EvasionShellcodePost-ExploitationRed TeamingPayload Development
GitHubnbaertsch/nimvoke

nimvoke

Indirect syscalls + DInvoke를 간단하게.

저장소 보기
9591년 전Kitploit 검토 완료

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

nimvoke

간접 syscall + DInvoke를 간단하게 만듭니다.

자체 Nim 프로젝트에 직접 임포트하도록 설계된 _nimvoke_는 간접 시스템 콜 및 DInvoke 스타일 델리게이트 선언을 추상화하기 위해 매크로를 사용합니다. 이 라이브러리는 사용하기 쉽고 기본적으로 비교적 op-sec 친화적인 것을 목표로 합니다. 매크로에 사용된 함수 및 라이브러리 이름은 컴파일 타임에 해시되며, SSN과 syscall 명령 주소는 훅 여부와 관계없이 검색됩니다. 모든 syscall은 ntdll.dll의 올바른 syscall 명령을 통해 이루어집니다.

사용법

nimble로 설치하고 (nimble install https://github.com/nbaertsch/nimvoke), 관련 라이브러리를 임포트한 후 해당 매크로를 호출하기만 하면 됩니다. 자세한 내용은 examples를 참조하세요.

DInvoke:

root@kitploit:~
import winim/lean
import nimvoke/dinvoke

dinvokeDefine(
        ZwAllocateVirtualMemory,
        "ntdll.dll",
        proc (ProcessHandle: Handle, BaseAddress: PVOID, ZeroBits: ULONG_PTR, RegionSize: PSIZE_T, AllocationType: ULONG, Protect: ULONG): NTSTATUS {.stdcall.}
    )

var
        hProcess: HANDLE = 0xFFFFFFFFFFFFFFFF
        shellcodeSize: SIZE_T = 1000
        baseAddr: PVOID
        status: NTSTATUS

status = ZwAllocateVirtualMemory(
    hProcess,
    &baseAddr,
    0,
    &shellcodeSize,
    MEM_RESERVE or MEM_COMMIT,
    PAGE_READWRITE)

Syscalls:

root@kitploit:~
import winim/lean
import nimvoke/syscalls

var
        hProcess: HANDLE = 0xFFFFFFFFFFFFFFFF
        shellcodeSize: SIZE_T = 1000
        baseAddr: PVOID
        status: NTSTATUS

status = syscall(NtAllocateVirtualMemory,
            hProcess,
            &baseAddr,
            0,
            &shellcodeSize,
            MEM_RESERVE or MEM_COMMIT,
            PAGE_READWRITE
        )

중요한 Op-Sec 참고 사항

DInvoke

모든 Nim 바이너리는 핵심 Win32 함수 세트를 임포트합니다. 다른 모든 Win32 함수는 런타임에 함수를 해석하기 위해 GetProcAddress 및 LoadLibraryA를 사용하는 dynlib를 통해 해석됩니다. 이 DInvoke 구현은 다른 코드(Nim 런타임/GC 또는 dynlib을 통해 임포트하는 stdlib 코드)에서 사용되지 않는 새로운 함수가 노출되는 것을 방지할 수 있지만, Nim의 핵심 임포트를 제거하거나 std 또는 타사 라이브러리의 동작을 변경할 수는 없습니다.

Syscalls

임포트 시 nimvoke/syscalls는 ntdll.dll의 EAT를 파싱하여 모든 syscall을 찾고 필요한 데이터를 추출합니다. 모든 syscall에 대한 정보는 메모리에 저장됩니다.

root@kitploit:~
type
    Syscall* = object
        pName*: PCHAR
        ord*: WORD
        pFunc*: PVOID
        pSyscall*: PVOID = NULL
        ssn*: WORD
        hooked*: bool
...
syscallSeq: seq[Syscall] # stores all syscall data
syscallTable* = initTable[string, ptr Syscall]() # maps syscall `Zw` hashed-name to `Syscall` object's in the `syscallSeq`

SSN 검색은 모든 syscall을 주소순으로 정렬한 뒤 세는 방식으로 수행됩니다. 이 방법은 훅 여부와 관계없이 작동해야 합니다. 함수 이름 문자열은 메모리에 저장되지 않지만, 해시 계산을 위해 ntdll.dll의 EAT에 있는 함수 이름 문자열에 대한 포인터는 유지됩니다.

Syscall은 단일 트램펄린(FreshyCalls에서 가져옴)을 사용하여 SSN을 eax로 이동하고, 인자를 준비한 다음 ntdll.dll의 올바른 syscall 명령으로 점프합니다. 이 트램펄린은 새로운 프라이빗 힙에 할당됩니다.

이 syscall 초기화 코드보다 먼저 코드를 실행하려는 경우(샌드박스 회피 또는 환경 키잉 등), 코드에서 import nimvoke/syscalls 문 앞에 해당 코드를 호출해야 합니다.

향후 작업

  • x86 지원
  • 더 견고한 오류 처리 추가 및 프로세스에서 누락된 경우 라이브러리 로드
  • 합성 스택 프레임 스푸핑 포함

제안이 있으신가요? 이슈를 열어주세요! PR도 환영합니다.

감사의 말

  • 'arg-shifting' syscall 트램펄린을 제공한 FreshyCalls 및 rust_syscalls
  • 아이디어를 제공한 S3cur3Th1sSh1t
  • 훌륭한 학습 자료와 커뮤니티를 제공한 MrUn1k0d3r
  • 탄탄한 트레이닝을 제공한 Sektor7
도구 다운로드