Skip to content
KitploitKITPLOIT
도구익스플로잇블로그
제출
도구익스플로잇블로그
제출

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
antidbg — 은밀하게, 완전히 syscall로 구현된 Windows용 C/C++ 유저랜드 안티디버깅 라이브러리로, 소프트웨어를 리버스 엔지니어링으로부터 보호하도록 설계되었습니다 | Kitploit
도구/GitHubGitHub/notrequiem/antidbg
Defensive ToolsStatic AnalysisDynamic Analysis (Sandboxing)Reverse EngineeringMalware AnalysisBinary AnalysisAnti-Bot
GitHubnotrequiem/antidbg

antidbg

은밀하게, 완전히 syscall로 구현된 Windows용 C/C++ 유저랜드 안티디버깅 라이브러리로, 소프트웨어를 리버스 엔지니어링으로부터 보호하도록 설계되었습니다

저장소 보기
32131362일 전Kitploit 검토 완료

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

AntiDBG

antidbg는 Windows용 x64 사용자 모드 안티 디버깅 라이브러리로, 소프트웨어를 디버깅으로부터 보호하도록 설계되었습니다.

이 라이브러리를 안티 디버깅 보호의 기반으로 고려하되, 유일한 방어 수단으로 삼지 마십시오.

이 라이브러리는:

  • 사용이 매우 간편합니다 (함수 호출 한 번만 필요).
  • 높은 성능과 최소한의 리소스 사용을 위해 설계되었습니다 (CPU 사용률 1%; 메모리 2MB 미만).
  • 외부 의존성이 전혀 없습니다.
  • 완전한 MIT 라이선스입니다.
  • CFG를 준수합니다.

구조

위협 모델은 디버거가 어떤 종류의 권한 수준에서든 이 보호 시스템으로 보호되는 소프트웨어를 가로챌 수 있다고 가정하며, 권한 수준이 높을수록 탐지 효과가 떨어집니다.

이 소프트웨어는 다음과 같은 방법으로 사소한 CPL > 0 가로채기를 우회하도록 강화되었습니다:

  • 인라인 어셈블리를 통한 시스템 콜로 모든 종류의 API 후킹을 회피합니다.
  • 현재 프로세스에 대해 가상 메모리 보호 및 인젝션 완화 정책을 시행합니다.
  • 비합법적인 계측 콜백을 탐지하거나 덮어써서 RAX의 시스템 콜 스푸핑을 방지합니다.
  • 디스크 상 vs 메모리 내 비교를 통해 모니터링되는 .text 섹션에 대한 모든 종류의 인라인 패치를 탐지합니다.
  • 예외 처리 전달(VEH, SEH, LPTOP_LEVEL_EXCEPTION_FILTER) 및 소프트웨어 중단점을 분석합니다.
  • PAGE_GUARD 리다이렉션 동작을 테스트합니다.
  • 중요한 스텁을 쓰기 불가능한 메모리로 보호하고, 이후 별도 스레드에서 하드웨어 가속 해싱으로 모니터링합니다.
  • TLS callbacks로 프로세스 진입점을 디버거 부착으로부터 보호하고, 스레드 시작 주소 검사를 수행합니다.
  • DbgBreakPoint 및 DbgUiRemoteBreakin과 같은 디버거 진입점에 트랩을 생성하여 프로세스를 충돌시키거나 반환합니다.
  • 디버거 이벤트 및 프로세스 정지로부터 모든 스레드를 숨깁니다. 스레드 우선순위 상태가 영향을 받지 않도록 보장합니다.
  • 보호가 시작되는 즉시 전역 벡터화 핸들러를 설정합니다.

검사를 수행하는 유일한 방법이 시스템 콜이 불가능한 내보낸 함수를 사용하는 것이라면, 해당 함수는 수동으로 리버스 엔지니어링되어 보호 스레드의 모듈 주소 공간에서 실행되도록 재구성됩니다. 모든 사용자 모드 메모리 구조는 API를 사용하는 대신 직접 메모리 내성을 통해 순회됩니다.

보호 루틴은 일부 실행 경로를 사용자 모드 후킹에 대한 보호 없이 명시적으로 남겨두어 메모리 허니팟 역할을 합니다. 이들은 상태 비교 및 공격자 교란에 사용됩니다.

보호 루틴은 의사 무작위로 실행됩니다. 엔트로피는 순수 하드웨어 기반 ASLR, 스택 동작 및 약간의 수학으로 결정되며, 커널을 호출하거나 사용자 모드 API를 사용하거나 하이퍼바이저에 의해 조건부 또는 무조건 종료 명령을 발행하지 않습니다.

보안 위반이 탐지되면, 보호 시스템은 모든 예외 핸들러를 우회하여 STATUS_SXS_EARLY_DEACTIVATION과 함께 INT 29h를 호출하여 현재 프로세스를 충돌시킵니다. 경우에 따라 현재 프로세스를 종료하기 위해 커널에 APC를 큐에 넣기도 합니다.

탐지

이 라이브러리의 메인 진입점(abdg.c)에서 발견되며, 순서대로 설명됩니다.

요약된 설명이며, 특정 탐지는 여기 설명된 것보다 더 많은 추가/하위 검사를 수행할 수 있습니다.

antidebug\archived 폴더에서 다른 탐지 개념의 소스 코드를 더 찾을 수 있습니다.

  • 1. kernel32의 내보낸 함수를 사용하여 PEB의 BeingDebugged 필드를 읽습니다.
  • 2. 내보낸 IsRemoteDebuggerPresent를 호출하여 대상 프로세스가 자체 컨텍스트 외부에서 디버깅되고 있는지 확인합니다.
  • 3. INT 2D 소프트웨어 인터럽트를 실행하여 해당 명령어 다음의 바이트가 건너뛰어지고 EXCEPTION_BREAKPOINT 핸들러를 통해 라우팅되지 않는지 확인합니다.
  • 4. 중단점 인터럽트 INT 3D를 실행한 다음, 예외가 가로채지는지 또는 정상적으로 통과되는지 관찰합니다.
  • 5. ICE/0xF1을 호출하여 EXCEPTION_SINGLE_STEP을 발생시키고, 디버거가 이 예외를 RFlags 레지스터에 단일 단계 비트가 설정된 상태에서 명령어를 실행하여 생성된 정상 예외로 간주하는지 확인합니다.
  • 6. 플래그를 설정하고 디버거가 에서 이를 지우는지 확인하여 스택 세그먼트 레지스터를 조사합니다. 일반적으로 디버거는 각 디버거 이벤트가 전달된 후 트랩 플래그를 지웁니다.

사용법

  1. 가드 모드: 스레드가 프로그램에서 실행되기 시작하고 부착된 디버거를 지속적으로 모니터링합니다. 언제든지 디버거가 탐지되면, 프로그램은 시도(디버그 모드로 컴파일된 경우)를 기록하고 다른 프로그램이 충돌을 중지하지 못하도록 강제로 종료합니다.

예:

root@kitploit:~
#include "adbg.h"

int main() {
    StartDebugProtection();

    return 0;
}
  1. 단일 실행 모드: 언제든지 호출하여 디버거가 프로세스에 부착되었는지 탐지할 수 있는 함수입니다.

예:

root@kitploit:~
#include "adbg.h"

int main() {
    if (isProgramBeingDebugged()) {
        printf("Debugger detected.\n");
    }
    else {
        printf("No debugger was detected.\n");
    }

    return 0;
}

빌드

1. 바이너리 모드

테스트 러너 실행 파일을 빌드하려면 -DBUILD_EXAMPLE=ON을 활성화하십시오. 이는 example/main.c를 컴파일하고 진입점으로 코어 라이브러리를 오염시키지 않고 antidebug에 링크합니다.

Visual Studio (GUI)

  1. Visual Studio에서 저장소 폴더를 엽니다 (또는 생성된 .sln 파일을 엽니다).
  2. 원하는 구성을 선택합니다 (x64-Release 또는 x64-Debug).
  3. antidebug_runner를 시작 프로젝트로 설정하고 Build를 클릭합니다 (또는 F5를 눌러 실행).

CLI (MSVC / Ninja / Clang)

프로젝트 루트에서:

root@kitploit:~
cmake -B build -S . -DBUILD_EXAMPLE=ON
cmake --build build --config Release

실행 파일은 다음 위치에 있습니다:

  • MSVC 멀티 구성: build/Release/antidebug_runner.exe
  • Ninja 단일 구성: build/antidebug_runner.exe

디버그 빌드에 대한 참고: 디버그 모드(--config Debug)로 컴파일하면 core/debug.c를 통해 콘솔/디버거 진단 로그가 활성화됩니다. 릴리스 모드는 로깅을 완전히 제거합니다.


2. 라이브러리 모드 (정적 또는 공유)

기본적으로 CMake는 정적 라이브러리(antidebug.lib 또는 libantidebug.a)를 생성합니다. **동적 링크 라이브러리(DLL)**를 빌드하려면 -DBUILD_SHARED_LIBS=ON을 전달하십시오.

옵션 A: MSVC (cl.exe)

Visual Studio 생성기 사용:

root@kitploit:~
# Static Library (.lib)
cmake -B build -S . -A x64 -DBUILD_SHARED_LIBS=OFF
cmake --build build --config Release

# Dynamic Library (.dll + import .lib)
cmake -B build -S . -A x64 -DBUILD_SHARED_LIBS=ON
cmake --build build --config Release

옵션 B: Clang-CL (MSVC 통합이 포함된 LLVM)

clang-cl과 함께 Ninja 사용:

root@kitploit:~
# Ensure clang-cl is in your PATH or run from the VS x64 Native Tools Command Prompt
cmake -B build -S . -G Ninja -DCMAKE_C_COMPILER=clang-cl -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF
cmake --build build

옵션 C: Clang (MinGW / LLVM-MinGW)

64비트 LLVM-MinGW 셸(PATH에 x86_64-w64-mingw32-clang)을 실행하고 Ninja를 사용하십시오:

root@kitploit:~
# Static Library (.a)
cmake -B build -S . -G Ninja -DCMAKE_C_COMPILER=clang -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF
cmake --build build

# Shared Library (.dll)
cmake -B build -S . -G Ninja -DCMAKE_C_COMPILER=clang -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON
cmake --build build

3. CMake를 통한 설치

컴파일된 라이브러리와 헤더를 로컬 접두사에 설치하려면:

root@kitploit:~
cmake --install build --prefix "C:/local/antidebug"

이것은 다음을 생성합니다:

root@kitploit:~
C:/local/antidebug/
├── bin/
│   └── antidebug.dll           (if BUILD_SHARED_LIBS=ON)
├── lib/
│   └── antidebug.lib           (or libantidebug.a)
└── include/
    └── antidebug/
        ├── adbg.h
        └── ...

법적 고지 및 면책 조항

이 프로젝트의 악의적인 사용을 통해 발생하는 모든 손해에 대해 책임지지 않습니다.

BUILD 문서 생성은 AI로 이루어졌으니, 문제가 있으면 보고해 주십시오.

라이선스: MIT

도구 다운로드
TF
RFLAGS
  • 7. 접두사 기반 명령어 흐름 엣지 케이스를 사용하여 PREFIX REP로 디스어셈블되는 0xF3 0x64가 0xF1 건너뛰기를 강제하는지 확인합니다.
  • 8. 트랩 플래그를 설정하고 pushfd mov dword ptr [esp], 0x100 popfd nop을 호출한 후 EXCEPTION_SINGLE_STEP 핸들러에 들어가는 대신 nop에 도달하는지 확인합니다.
  • 9. DBG_CONTROL_C 및 DBG_RIPEXCEPTION 이벤트를 발생시켜 예외가 가로채지고 SEH를 통해 라우팅되지 않는지 확인합니다.
  • 10. NtQueryInformationProcess로 ProcessDebugObjectHandle을 쿼리하여 부착된 디버그 객체 핸들을 확인합니다.
  • 11. NtQuerySystemInformation으로 SystemKernelDebuggerInformation을 사용하여 커널 디버거의 존재를 쿼리하고, KUSER_SHARED_DATA 메모리 페이지에서 KdDebuggerEnabled 필드를 직접 읽습니다. 추가로 커널 타이머 ISR이 비동기적으로 틱하고 있는지 확인합니다.
  • 12. FLG_HEAP_ENABLE_TAIL_CHECK (0x10), FLG_HEAP_ENABLE_FREE_CHECK (0x20) 및 FLG_HEAP_VALIDATE_PARAMETERS (0x40)의 마스크에 대해 NT 전역 플래그를 읽습니다.
  • 13. ProcessDebugFlags를 검사하여 디버깅이 활성화되었는지 또는 억제되었는지 추론합니다.
  • 14. 프로세스 핸들을 복제하고 디버거가 핸들을 터치하는지, 핸들을 상속하는지, 또는 다시 열거나 복제하는지 확인합니다. 보호된 복제 핸들을 생성한 다음 다시 깨끗하게 복제할 수 있습니까?
  • 15. 부모 프로세스 체인을 검사하여 디버거 런처 또는 vsjitdebugger, x64dbg 또는 유사한 의심스러운 계보를 찾습니다.
  • 16. 내보내기를 사용하지 않고 기본(__readgsqword(0x60))에서 오프셋 *(BYTE*)((uintptr_t)peb + 2에서 직접 읽어 디버그 PEB 필드를 확인합니다.
  • 17. 현재 프로세스에 대해 ProcessDebugPort를 쿼리합니다.
  • 18. 스레드 디버그 레지스터(Dr0–Dr7)를 검사하여 하드웨어 중단점을 확인합니다.
  • 19. 허니팟을 배치하고 변경 사항을 모니터링하여 가상 메모리가 디버거에 의해 적중되었는지 확인합니다.
  • 20. 프로세스 및 창 핸들로 두 개의 잘못된 핸들 닫기 테스트를 수행하고, ERROR_INVALID_WINDOW_HANDLE 및 EXCEPTION_INVALID_HANDLE이 가로채지지 않는지 관찰합니다.
  • 21. 디버그 객체가 디버거에 의해 가로채지는지 및 핸들 스트리핑이 발생하는지 확인합니다.
  • 22. 디버거에 의해 액세스가 필터링되거나 리다이렉션되는지 드러내는 방식으로 프로세스를 열려고 시도합니다.
  • 23. HANDLE_FLAG_PROTECT_FROM_CLOSE로 표시된 뮤텍스 핸들을 직접 닫을 수 있는지 확인합니다.
  • 24. SysDbgGetTriageDump와 함께 NtSystemDebugControl을 호출하고 커널 디버거가 호출을 차단하는지 또는 호출을 스푸핑하지만 메모리 버퍼를 건드리지 않는지 확인합니다.
  • 25. 자체 스택의 메모리 읽기가 계측되거나 가로채지는지 확인합니다.
  • 26. 프로세스가 디버거에 의해 생성된 화이트리스트에 없는 작업 객체 내부에 있는지 확인합니다.
  • 27. 메모리 중단점 스타일 액세스 테스트를 사용하며, 일반적으로 워치포인트가 활성화된 경우 페이지 가드 또는 폴트 동작을 예상합니다.
  • 28. 페이지 예외 중단점 시나리오를 트리거하고 예외 체인이 STATUS_GUARD_PAGE_VIOLATION을 올바르게 전달하는지 검사합니다.
  • 29. 실행 타이밍을 측정하여 단일 단계 실행, 중단점 또는 동적 바이너리 계측/JIT 재컴파일로 인한 오버헤드를 탐지합니다.
  • 30. 디버거 도구와 관련된 창/클래스/제목을 열거하여 디버거 창 또는 UI 아티팩트를 검색합니다.
  • 31. 디버거가 자체 단일 단계 실행을 수행하기 위해 DR7에서 이전에 설정된 LBR/BTF 비트를 지우는지 확인하여 빈 ExceptionInformation 배열이 되는지, 또는 디버거가 LBR을 활성화된 상태로 두지만 icebp에 의해 호출된 EXCEPTION_SINGLE_STEP을 여전히 가로채기로 결정한 경우 커널 모드 분기 주소가 탐지되는지 확인합니다.
  • 32. 힙을 직접 순회하고 0xABABABAB 및 0xFEEEFEEE 매직 값을 확인합니다. 사실상 12와 동일하지만 후킹 가능한 Heap API를 사용합니다.
  • 33. 이전에 공유된 페이지가 디버거에 의해 터치되었는지 확인하여 가상 메모리에서 Copy-On-Write가 발생했는지 확인합니다.
  • 34. 콘솔 이벤트(CTRL_C_EVENT)를 보내고 디버거가 이를 가로채고 전달을 제어 핸들러로 변경하는지, 또는 DBG_CONTROL_C를 발생시키는지 확인합니다.
  • 35. 프로세스가 인젝션 시도를 위해 외부에서 일시 중단되었는지 확인합니다. 우리 프로세스를 가리키는 NtResumeProcess에 대한 외부 호출을 탐지합니다.
  • 36. 다양한 SE_DEBUG_PRIVILEGE 권한 수준으로 NtSetDebugFilterState를 호출하고 커널 디버거가 액세스를 잘못 처리하는지 확인합니다.
  • 37. 장치 객체를 분석하고, 커널 디버거가 파일 읽기를 가로채는지도 확인합니다.
  • 38. 스레드를 커널 디버거와 ContextFlags 구조를 읽는 커널 자체 모두와 경쟁시킵니다. DEBUG_REGISTERS가 제거되었는지/Dr0이 설정되지 않았는지 확인합니다.
  • 39. 가상 섹션의 매우 큰 뷰를 생성하고 매핑하여 일부 디버거를 정지시킵니다. NtMapViewOfSection 호출이 변조되었는지 탐지합니다.
  • 40. 구현되지 않은 시스템 콜(에뮬레이터에서 흔함)을 확인합니다.
  • 41. 네 개의 연속 NOP에 DR0에서 DR3까지 네 개의 하드웨어 실행 중단점을 설정하고 VEH를 통해 결과 EXCEPTION_SINGLE_STEP 전달을 계산합니다.
  • 42. 레거시 Windows XP/2000에서 OutputDebugString 부작용을 통해, 그리고 디버거가 가로챌 수 있는 DBG_PRINTEXCEPTION_{C,WIDE_C} 예외를 통해 디버거 개입을 테스트합니다.
  • 43. 자체 디스크 상 이미지의 첫 번째 바이트가 0xCC인지 확인하고, 디버거에서 LoadLibrary가 파일을 비배타적으로 액세스 가능한 상태로 남길 수 있는 Windows 로더 파일 핸들 동작을 악용합니다.