Post

HyperDbg

HyperDbg

HyperDbg는 Intel EPT를 활용하여 사용자에게 보이지 않는 Stealth hook을 실행가능한 오픈소스 디버거입니다. 커널 및 유저레벨 디버깅을 모두 지원합니다.

Disable DSE

HyperDbg는 vmm이라는 서명되지 않은 드라이버 파일을 로드합니다. 해당 파일을 실행하기 위해서는 테스트모드 또는 DSE 기능을 비활성해야 합니다. 테스트모드로 부팅하게 되면 대부분 게임에서 이를 탐지하여 종료시키기 때문에, 해당 글에서는 DSE를 비활성화하는 방식으로 진행합니다.

wind64 (WindowsD)

취약한 드라이버를 통해 커널에 엑세스하고 DSE 기능을 비활성화하는 툴입니다. GitHub에서 다운로드가 가능합니다.

설치가 완료되면 다음과 같은 명령어를 통해 실행합니다. 설치가 성공하면 서명되지 않은 드라이버도 실행할 수 있게됩니다.

1
2
3
4
C:\Windows\system32>cd C:\Users\jh\Downloads

C:\Users\jh\Downloads>wind64.exe /i
WinD64 installed successfuly.

DSE를 다시 활성화하려는 경우, 다음과 같은 명령어를 통해 uninstall이 가능합니다.

1
2
3
C:\Users\jh\Downloads>wind64.exe /u
Service deleted.
WinD64 uninstalled.

DSEfix

wind64와 비슷한 툴이며, GitHub에서 다운로드가 가능합니다.

Attach to HyperDbg

Attach to local machine

HyperDbg는 현재 Intel Processor 에서만 사용이 가능하며, 사용하기 위해서는 VT-x 기능을 활성화해야 합니다. VT-x가 비활성화 된 상태에서 vmm을 로드하면 다음과 같은 오류가 발생합니다.

1
2
3
4
5
6
7
8
9
HyperDbg> .connect local
local debugging (vmi-mode)

HyperDbg> load vmm
loading the vmm driver
current processor vendor is : GenuineIntel
virtualization technology is vt-x
vmx operation is not supported by your processor
failed to install or load the driver

vmm은 서명되지 않은 드라이버 파일이기 때문에, 테스트 모드에서 실행하거나 DSE 기능을 비활성화 해야합니다. 해당 글에서는 다음과 같이 wind64를 사용하여 DSE를 비활성화하고 진행하였습니다.

1
2
3
4
C:\Windows\system32>cd C:\Users\jh\Downloads

C:\Users\jh\Downloads>wind64.exe /i
WinD64 installed successfuly.

HyperDbg를 관리자 권한으로 실행하고, 다음과 같이 .connect 명령을 통해 로컬 디버거에 연결합니다. 로컬 디버거에 연결하면 vmi-mode로 실행하게 됩니다.

1
2
HyperDbg> .connect local
local debugging (vmi-mode)

그런 다음, load 명령을 통해 vmm 모듈을 로드합니다.

1
2
3
4
5
6
7
HyperDbg> load vmm
loading the vmm driver
current processor vendor is : GenuineIntel
virtualization technology is vt-x
vmx operation is supported by your processor
vmm module is running...
interpreting symbols and creating symbol maps

Operation Modes

HyperDbg는 다음과 같은 세 가지 모드로 동작합니다.

VMI Mode

일반적으로 사용되는 모드입니다. 로컬 디버거로 연결 시 자동으로 해당 모드가 실행됩니다. 해당 모드는 로컬 디버깅 및 원격 디버깅 모두에서 사용할 수 있습니다.

해당 모드로 HyperDbg의 대부분 기능은 사용 가능하지만, 로컬 디버깅 시 코드 실행을 중단하고 완전히 제어하는 행위는 불가능합니다. 다만, script 또는 code를 통해 이벤트 트리거는 동작 가능합니다. 코드 실행을 완전히 제어하려는 경우 Debugger Mode를 실행해야합니다.

1
2
HyperDbg> !epthook 7FFCB83F0760 pid 1BBC
err, it's not possible to break to the debugger in VMI Mode. You should operate in Debugger Mode to break and get the full control of the system. Still, you can use 'script' and run 'custom code' in your local debugging (VMI Mode)

Debugger Mode

커널에서 시스템을 정지하여 디버깅을 수행하는 모드입니다. 로컬 디버깅에서는 해당 모드 사용이 불가능하며, vm 장치 또는 원격 디버깅을 통해 사용이 가능합니다.

Transparent Mode

특정 프로세스를 anti-debugging 및 anti-hypervisor로부터 보호하는 스텔스 모드입니다.

먼저 !measure 명령을 통해 해당 모드가 사용 가능한 상태인지 확인합니다.

1
2
3
4
5
HyperDbg> !measure
hypervisor not detected
rdtsc/p emulation not detected
the measurements were successful
you can use the '!hide' command now

그리고 다음과 같이 !hide 명령을 통해 특정 프로세스를 숨깁니다.

1
2
HyperDbg> !hide pid 10236
transparent debugging successfully enabled :)

Commands

Debugging Commands

load (load the kernel modules)

HyperDbg 커널 드라이버 모듈을 로드합니다. 실행 가능한 모듈 파일은 vmm이 존재합니다.

1
2
3
4
5
6
7
HyperDbg> load vmm
loading the vmm driver
current processor vendor is : GenuineIntel
virtualization technology is vt-x
vmx operation is supported by your processor
vmm module is running...
interpreting symbols and creating symbol maps

unload

로드된 커널 드라이버 모듈을 언로드합니다.

1
2
3
HyperDbg> unload vmm
start terminating...
you're not on HyperDbg's hypervisor anymore!

Meta Commands

.connect (connect to a session)

원격 또는 로컬 디버거에 연결합니다. 다음과 같은 명령어를 통해 로컬 디버거에 연결할 수 있습니다.

1
2
HyperDbg> .connect local
local debugging (vmi-mode)

Extension Commands

measure

!hide 명령이 사용 가능한 상태인지 확인합니다. 해당 명령은 vmm이 로드되기 전에 실행되어야 합니다.

1
2
3
4
5
HyperDbg> !measure
hypervisor not detected
rdtsc/p emulation not detected
the measurements were successful
you can use the '!hide' command now

hide

anti-hypervisor 또는 anti-debugging 으로부터 특정 프로세스를 숨깁니다. 해당 명령이 실행되기 전에 !measure 명령이 실행되어야 합니다.

1
2
3
4
5
HyperDbg> !hide name TaskMgr.exe
transparent debugging successfully enabled :)

HyperDbg> !hide pid 10236
transparent debugging successfully enabled :)

unhide

Transparent Mode를 해제합니다. 숨겨진 프로세스가 다시 활성화됩니다.

1
2
HyperDbg> !unhide
transparent debugging successfully disabled :)

epthook

EPT (Extended Page Table)를 통해 사용자에게 보이지 않는 중단점(0xCC)을 설치합니다. 유저 및 커널 모드 전부 사용이 가능하며, 로컬 디버거를 사용하는 경우 script 또는 code 형태로 트리거가 가능합니다.

다음과 같이 script를 통해 RIP를 조작하여 특정 코드 위치로 점프할 수 있습니다. 해당 코드가 트리거되는 경우 vm-exit가 발생합니다.

1
2
3
// hookcode.
1431E5F0000 - 48 31 C0              - xor rax,rax
1431E5F0003 - C3                    - ret 
1
2
// !epthook [Address (hex)] [pid ProcessId (hex)] [script { Script (string) }]
HyperDbg> !epthook 7FF9B5F20760 pid 16C0 script { @rip = 0x1431E5F0000; }

유저레벨에서 ReadProcessMemory를 통해 해당 메모리를 확인해보면 설치된 중단점(0xCC)이 확인되지 않습니다.

1
2
// 0x7FF9B5F20760
KERNEL32.TerminateProcess - 48 FF 25 A9240600     - jmp qword ptr [KERNEL32.DLL+82C10]

WriteProcessMemory를 통해 코드를 변경하여도 실행에 아무런 영향이 없습니다.

1
KERNEL32.TerminateProcess - EB FE                 - jmp KERNEL32.TerminateProcess

epthook2

숨겨진 인라인 후킹을 설치합니다. vm-exit가 발생하지 않으며 epthook 보다는 속도가 빠르나, 커널 모드 주소에만 실행이 가능합니다.

다음과 같은 형태로 명령을 실행합니다.

1
2
// !epthook2 [Address (hex)] [script { Script (string) }]
HyperDbg> !epthook2 fffff802`0b400000+6b3bd4 script { @rip = 0xfffff802`0bab3cdd; }

Reference

This post is licensed under CC BY 4.0 by the author.