DBVM: 게임 해킹의 강력한 도구

오늘은 게임 해킹 커뮤니티에서 주목받고 있는 DBVM에 대해 알아보겠습니다. DBVM은 Cheat Engine의 개발자 DarkByte가 만든 Virtual Machine Monitor(VMM)으로, Intel의 VT-x 하드웨어 가상화 기술을 활용하여 기존 운영체제를 Guest로 올리고, 모든 인터럽트를 제어할 수 있게 해줍니다.

DBVM의 주요 특징

DBVM은 여러 가지 강력한 기능을 제공합니다:

  1. 강력한 디버깅 기능: DBVM은 Anti-Debugging 기술을 우회하고, 흔적을 남기지 않고 프로세스를 디버깅할 수 있습니다. 이는 게임 해킹에서 중요한 요소로, 보안 프로그램의 탐지를 피할 수 있습니다.(Themida, VMProtect 안티디버깅 우회 가능)
  2. 커널 메모리 접근: 일반적인 디버거와 달리, DBVM은 커널 공간의 메모리에도 제한적으로 브레이크포인트를 설정할 수 있습니다. 이는 시스템의 내부 동작을 분석하는 데 유용합니다.
  3. 시스템 타임스탬프 조작: DBVM을 이용하면 rdtsc 명령어의 반환값을 조작할 수 있어, 게임의 시간 흐름을 조작할 수 있습니다. 이는 게임 속도 조절에 유용하게 사용될 수 있습니다.

DBVM 사용하기

DBVM을 사용하려면 Intel VT-x가 지원되는 시스템이 필요합니다.

Cheat Engine을 통해 DBVM을 활성화할 수 있으며, "Your system supports DBVM" 메시지를 확인할 수 있습니다.

DBVM의 기능을 활용하는 예시는 다음과 같습니다:

 
1.Edit -> Settings 클릭
 
2.DBVM 들어간거 둘중 하나 선택

 

주의사항

DBVM은 강력한 도구이지만, 악용될 가능성도 있습니다. 보안을 위해 DBVM 사용 시 기본 비밀번호를 변경하는 것이 좋습니다. 또한, DBVM은 게임 해킹 커뮤니티에서 강력한 도구로 자리잡고 있지만, 윤리적인 사용이 중요합니다. 개인의 학습과 연구 목적으로만 사용하시기 바랍니다.

DBVM은 게임 해킹의 세계에서 중요한 역할을 하고 있으며, 다양한 기능을 통해 사용자에게 강력한 도구를 제공합니다. 이 글을 통해 DBVM의 기본적인 기능과 사용법을 이해하고, 윤리적으로 사용하는 방법에 대해 생각해 보시기 바랍니다. 감사합니다!


Perplexity로부터의 답변: pplx.ai/share

 

📝 Lumina 서버란?

IDA Pro에서 제공하는 Lumina 서버

"다른 사람이 이미 분석한 함수 이름과 정보를 내 프로젝트에 자동으로 반영해주는 시스템"입니다.

분석하고 있는 바이너리가 낯설고 함수명이 죄다 sub_XXXX일 때,
Lumina 서버는 그 함수가 어떤 함수인지 자동으로 찾아주고,
함수명/타입 정보를 IDA에 바로 적용해줍니다.

Hex-Rays Decompiler를 사용하는 경우, Lumina 서버와 연계하면 훨씬 효율적인 분석이 가능합니다.


🚀 Lumina 서버를 왜 써야 할까?

  • 분석 속도 증가
    → 이미 검증된 함수 정보를 자동으로 매칭해줍니다.
  • 팀 협업 효율
    → 사설 서버를 통해 팀원 간 시그니처 데이터를 공유할 수 있습니다.
  • 중복 분석 제거
    → 여러 번 분석한 함수 정보를 다시 쓸 수 있습니다.

🌐 기본 제공 Lumina 서버 사용법 (Hex-Rays 공식 서버)

1️⃣ 기본 설정 확인

  1. Options → General 메뉴로 이동합니다.
  2. 하단에 Lumina server 설정 부분이 보입니다.
  3. Use Lumina server 체크 박스를 활성화합니다.
    기본 주소는 https://lumina.hex-rays.com 입니다.

2️⃣ 함수 시그니처 다운로드

  • 메뉴 → Edit → Other → Lumina → Download metadata
    → 분석 중인 함수에 자동으로 이름과 타입 정보가 적용됩니다.

3️⃣ 자동 다운로드 설정 (권장)

Options → General 메뉴에서
Auto-download function metadata 옵션을 활성화하면

IDA가 함수 분석 시마다 자동으로 Lumina 서버에서 정보를 가져옵니다.


🔒 사설 Lumina 서버 구축하기 (Private Lumina Server)

외부로 데이터가 나가는 게 걱정된다면?
사내에서 분석 데이터를 안전하게 공유하고 싶다면?
→ 사설 Lumina 서버를 구축하세요!


1️⃣ 서버 실행파일 받기

  • Hex-Rays에서 제공하는 lumina_srv 실행 파일 필요
    (Hex-Rays 고객 포털에서 다운로드 가능)

2️⃣ 서버 실행하기

아래 명령어로 서버를 실행합니다.

bash
복사편집
lumina_srv -d ./lumina_db -p 5000

옵션 설명:

옵션설명
-d 데이터베이스 디렉터리 경로
-p 포트 번호 (기본 5000)

예시:

bash
복사편집
lumina_srv -d /opt/lumina_db -p 5000

3️⃣ IDA에서 서버 연결

  1. Options → General 메뉴로 이동
  2. Lumina server 주소를 변경
    cpp
    복사편집
    http://<서버IP>:5000
  3. Download metadata로 테스트
    → 정상 동작 시 서버에 등록된 함수 시그니처가 내려옵니다.

🛡️ 사설 서버 운영시 주의사항

  • ✅ 기본 HTTP이므로, HTTPS 프록시(Nginx 등)를 사용해 암호화 권장
  • ✅ 외부 접근을 제한하여 내부망 전용 서버로 운용 권장
  • ✅ 서버 데이터는 SQLite나 Key/Value 저장소 형태
  • ✅ 서버 포트 개방 시 인증 시스템이 없기 때문에 방화벽 필수!

📂 Lumina 서버 데이터 관리

  • 서버 실행 시 -d 옵션으로 지정한 폴더에 모든 데이터가 저장됩니다.
  • 팀원들이 업로드한 함수 정보도 이곳에 누적됩니다.
  • 필요 시 백업/이전이 가능하며, 협업 환경에서는 주기적 백업을 권장합니다.

✅ Lumina 서버 전체 명령어 정리

bash
복사편집
lumina_srv -d <데이터베이스 경로> -p <포트번호>

추가 옵션

옵션설명
-h 도움말 출력
-v 자세한 로그 출력

🎉 Lumina 서버, 이런 분들께 추천합니다!

대상이유
분석팀 리더 팀원들 간 분석 데이터 통합/공유
보안 관제팀 외부에 정보 노출 없이 안전한 분석 환경
개인 리버서 함수 식별 자동화로 빠른 리버싱

 

 

유저모드 디버거하면 바로 가장 유명한 올리디버거(OllyDBG)가 있죠. 요즘은 x64dbg도 많이 쓰이는것 같습니다.


올리디버거 플러그인 중에 프로그램이 실행되면 자동으로 어태치시켜주고 어태치하는 시간도 설정할 수 있는 유용한 툴이 있죠

바로 AutoAttach 라는 플러그인 입니다.




About 매뉴는 제작자에 관한 메뉴라 눌러보실 필요 없고


Set process name 은 어태치할 프로세스명을 설정하는 칸입니다. 여기서 설정한 이름의 프로세스가 있으면 바로 어태치 시킵니다.


Set delay time은 Set process name에서 설정한 프로세스 발견시 얼마나 딜레이(밀리세컨드)를 주고 어태치 시킬지 설정하는 매뉴입니다.


하지만 이 툴의 단점이 있으니 바로 




확장자가 .xem같이 exe로 끝나지 않는 프로그램은 어태치 시키지 못한다는 것입니다.


일반적인 프로그램은 대부분 .exe로 되어있지만 


보안프로그램이나 악성코드, 게임핵툴의 경우 탐지/분석을 회피하기 위해 특수한 확장자명으로 되어있는 경우가 많습니다.




위와 같이 프로세스 명을 적고 해당 프로세스를 실행해도 어태치가 되지 않습니다.


다시 한번 Set process name 매뉴에 가보면





위 그림과 같이 내가 적은 프로세스명 뒤에 자동으로 + .exe 문자열을 붙여주는것을 확인 할 수 있습니다.


자 그럼 이것을 한번 수정해 보도록 하겠습니다.


아주 쉽고 간단하니 편하게 따라오시기 바랍니다.


IDA Hexray로 한번 대략적으로 플로그인 모듈을 살펴보도록 하겠습니다.





여러 함수가 보이는데 하나하나 살펴보다 보니 _ODBG_PluginMainloop에 주요 소스가 있는것을 확인 할 수 있습니다.


.exe를 붙인다는것을 감안해서 문자열 보기 (shift + f12)를 통해 찾아가셔도 좋습니다.





.exe 문자열을 찾고 그와 관련된 작업을 하는것을 알 수 있습니다.


여기서 분석가능하신 분도 계시겠지만 더 쉽게 툴의 힘을 빌려 f5를 눌러줍니다.






HexRay의 위엄... 거의 원본 소스 상태로 보여줍니다.


strstr 함수를 사용해서 사용자가 입력한 프로세스명이 .exe를 포함하지 않으면 뒤에 .exe를 붙여주는 코드가 있습니다.


이 코드때문에 .xem 파일을 어태치 할 수 없었습니다. 저 부분을 nop처리 하면 가뿐히 해결될걸로 보이네요.


수정은 OllyDBG로 해보도록 하겠습니다.







플러그인을 넣은 올리디버그를 실행하고 하나 더 실행해서 첫번째 실행한 올리디버그를 어태치 시켜줍니다.(올리디버그를 올리디버그로 어태치)


모듈 목록에 AutoAttach.dll이 보입니다.





문자열 검색을 해보니 역시나 .exe 부분이 나옵니다. 저기로 이동





exe가 있는지 비교하는 부분이 보이네요. 저 JNZ를 무조건 점프시키는 JMP로 변경하면 해결되겠네요.





이렇게 변경시킨뒤 파일로 저장합니다. 


저장법은 우클릭 -> Copy to executable -> All modifications


다음 save file로 저장해줍니다.


이렇게 변경한 플러그인으로 실행하면 







잘 어태치 되는것을 확인 할 수 있습니다.



원본 파일과 수정한 두 파일을 첨부해 놓겠습니다.


AutoAttach.dll

AutoAttach_m.dll


불친절한 설명을 읽어주셔서 감사합니다.


 



WinDBG 명령어 정리

 

명령어

옵션

설명

 일반명령어

u

Unassemble

 

언어셈블

f

함수 전체 언어셈블

b

언어셈블(ip이전의 8개 명령어)

bl

BreakPoint List

 

브레이크 포인트 리스트 출력

be

BreakPoint enable

 

브레이크 포인트 활성화

bd

BreakPoint Disable

 

브레이크 포인트 비활성화

bc

BreakPoint Clear

 

브레이크 포인트 모두 제거

ba

BreakPoint On Access

 

특정 주소에 access시 브레이크포인트

bp

Set BreakPoint

 

브레이크 포인트 설정

g

go

 

실행

p

step

 

한 단계씩 실행

pc

step to next call

 

다음 call 까지 실행

d

Display 

b : byte 출력

출력

dw : word 출력

dd : double word로 출력

dq : Quad word 로 출력

ds

Display String

 

문자열 출력

r register

 

레지스터 정보 출력

k

call stack

 

콜스택정보 출력

 

 

p

함수정보 출력

 

 

b

인자표시

 

 

n

프레임 번호

 

 

v

FPO 정보 표시

 

 

f

스택 사용량 표시

lm

loaded module

 

로드된  모듈 표시

F9

 

 

Start

F5

 

 

Break

메타 명령어

.cls

 

 

커맨드 창의 내용 지우기

.attach

 

 

대상 프로세스에 어태치

.bugcheck

 

 

버그 내용 표시

.crash

 

 

강제로 크래쉬 발생
.dump

 

 

dump 파일 생성

.reboot

 

 

재부팅

.cxr

 

 

context record 표시

.exr

 

 

exception record 표시

.excxr

 

 

exception context record 표시

.trap

 

 

Trap Frame 표시

.exepath

 

 

실행파일 경로설정

.srcpath

 

 

소스파일 경로 설정

.sympath

 

 

심볼 패스 설정/확인

.symfix

 

 

MS 심볼경로 설정

.reload

 

 

심볼 경로를 설정한 후에 WinDBG가 심볼을 다시 로드

.load

 

 

dll 로드

확장 명령어 

!process

 

 

현재 또는 실행중인 모든 프로세스의 정보 출력

!gle

 

 

GetLastError 출력

!error

 

 

에러 코드 해석

!analyze      자동 분석
!cpuid       cpu 정보 출력

!peb

     peb(process environment block) 정보 출력

!teb

     teb((thread environment block) 정보 출력
!token      security token 정보 출력

!stack

     현재 커널 스택 정보 출력

!drivers

     로드된 드라이버 정보 출력


유져 디버깅은 올리디버그나 x64디버그가 편하지만 덤프 분석이나 커널디버깅시 유일신인 WinDBG

WinDBG의 자주쓰이는 명령어 위주로 정리해 보았습니다.

기능별 주요 API

 

 

프로그램 실행관련
WinExec : 프로세스 생성하고 초기화가 다 될때까지 기다렸다가 리턴함. 내부적으로 CreateProcess 호출

CreateProcess : 프로세스 생성 후 곧바로 리턴함 

ShellExecute :

LoadModule : 모듈 로드(dll)

입력관련
keybd_event : 키 입력

mouse_event : 마우스 입력

SendInput : 키 입력
SendMessage : 키 입력

PostMessage : 키 입력

 WaitforInputIdle : 사용자 입력 받을수 있을때가지 기다리는 함수

프로세스 종료
TerminateProcess : 프로세스 종료 (작업관리자(taskmgr)에서 응용프로그램탭의 작업 끝내기도 ZwTerminateProcess 호출됨)
ExitProcess : 프로세스 종료 (내부적으로 TerminateProcess 호출됨)


파일 관련 

CreateFile : 파일생성, 파일열기
URLDownloadToFile : 파일 다운
DeleteFile : 파일 삭제

DeleteDirectory : 폴더 삭제

PathFileExists : 파일 존재 검사

FindFirstFile : 파일 찾기

GetfileAttributes : 파일 정보 얻기

ini 파일 

GetPrivateProfileInt : ini 값 일기(숫자)
GetPrivateProfileString : ini 값 읽기(문자열)
WritePrivateProfileString : ini값 쓰기(숫자)
WriteProtfileString : ini값 쓰기(문자열)

Registry 관련

RegCreateKeyEx
RegSetValueEx
RegQureyValueEx
RegOpenkeyEx
RegCloseKey
RegQueryInforkey

드라이버 관련 
NtDeviceIoControlFile :

ZwDeviceIoControlFile :

명령인수
GetCommandLine() : 명령인수 가져오기


디버깅 관련
IsDebuggerPresent : 디버깅중인지 검사

NtQueryinformationProcess = 디버깅 중인지 검사 CheckremoteDebuggerPresent와 동일
NtQueryinformationProcess(hProcess, 7 , &hport, sizeof hPrt, & result); 디버그 포트 검사
NtQueryinformationProcess(GetCurrentProcess(0, 0x1e, &hDebugObject, 4, NULL); 디버그 오브젝트 검사
NtQueryObject
NtQueryinformationProcess(xx, 3)NtQueryinformationProcess(xx, 0x1f // ProcessDebugFlag, 4 , NULL );
NtSetinformationThread : 쓰레드를 디버거로부터 감추기
NtSetinformationThread(GetCurrentThread(), 0x11, 0, 0);

자작 플러그인 소개합니다.

Spy++이나 ProcessExplorer의 윈도우 찾기 기능과 동일하게 드래그하여 윈도우를 선택하여 어태치 할 수 있게 도와주는 플러그인입니다.

 

File -> Attatch -> 프로세스 선택 하는 복잡한 과정없이 간단하게 드래그 한방이면 끗

 

 

Plugin 폴더에 넣고 실행시 다음과 같이 아이콘이 나타납니다.

 

클릭하면 OllyDbg 윈도우가 최소화 되고 다른 윈도우를 선택하면 하일라이트 됩니다. 클릭한 버튼을 때면 그 윈도우에 어태치 됩니다.

 

Explorer.exe에 어태치 하면 난감한 상황이 발생하니 그 경우는 어태치 되지 않도록 예외처리 해놨습니다.

DrAttacher.dll

 

상당히 불친절한 풀이 시작하겠다.

http://reversing.kr/

[Challenge]

1.Easy Crack

 

다운 받고 실행하면 다음과 같은 그림이 나온다.

 

혹시나 싶어서 마음의 소리를 입력해보면 틀렸다고 나온다. 제대로된 패스워드를 입력하면 Good Boy! 같은 소리를 해주는 전형적인 크랙미 문제이다. 

 

 

가장 먼저 확인해야 될 부분은 Exeinfo 같은 프로그램으로 패킹상태와 어떤 언어로 작성되었는지를 보는것이다.

첫번째 문제라 다행히 가장 스탠다드한 언어인 c++로 작성되었고 패킹되어 있지 않았다. 안도의 한숨을 쉬자. (Themida나 VMProtect 같은 글자가 보이면 조용히 다음 문제를 보도록...)

 

IDA PRO 를 이용해서 전체 코드 구조를 파악해본다.

GetDlgItemTextA 함수 호출후  ( v3 != 97 || strncmp(&Str1, "5y", 2u) || strcmp(&v5, "R3versing") || String != 69 ) 이 관문들만 통과하면

MessageBoxA(hWnd, "Congratulation !!", "EasyCrackMe", 0x40u);

이런 축하합니다 소리를 들을수 있다.시작해보자

 

문자열을 검색해보니 반가운 글자들이 보인다. 자비없는 브레이크 포인트를 선사해 주기위해 거침없이 들어가자

 

1.GetDlgItemTextA 함수를 통해 사용자가 입력한 글자를 얻어온뒤

2.두번째 글짜[ESP+5]가 0x61('a') 인지 검사한다.

3.세번째 네번째 글자[ESP+A](중간에 Push 명령어가 있어 ESP가 변경됨)가 5y 인지 검사

4.나머지 뒤에 글자가 R3versing 인지 검사

 

5.첫번째 글자가 0x45('E') 인지 검사

 

답은 나왔다. 지금까지의 검사 조건들을 종합해보면

2.두번째 글자가 'a'                                                    Xa

3.세번째 네번째 글자가 "5y"                                        Xa5y

4.네번째 "R3versing"                                                 XaR3versing

5.첫번째 글자가 'E'                                                    EaR3versing

답 : EaR3versing

 

                  

 

 

 

 

+ Recent posts