들어가기에 앞서..
본 포스팅은 학술적 연구 및 리버싱 학습을 목적으로 작성되었습니다. 모든 테스트는 오프라인(Local Bot Match) 환경에서 진행되었으며, 실제 멀티플레이 서버나 타인의 게임 경험을 저해하는 행위에는 사용되지 않았습니다.
본인은 게임의 공정성을 해치는 어떠한 바이너리(DLL, EXE)도 배포하지 않으며, 이 글은 DirectX API의 동작 원리와 시스템 후킹 기법을 이해하고자 하는 분들을 위한 기술적 공유임을 밝힙니다.
https://imoracle.tistory.com/67
[게임핵의 원리] 월핵은 어떻게 만들어지는가 -DirectX 후킹 원리 분석- 최종
들어가기에 앞서...본 포스팅은 학술적 연구 및 리버싱 학습을 목적으로 작성되었습니다. 모든 테스트는 오프라인(Local Bot Match) 환경에서 진행되었으며, 실제 멀티플레이 서버나 타인의 게임 경
imoracle.tistory.com
들어가며
약 1년 전 AssaultCube라는 오픈소스 FPS게임을 대상으로 게임 후킹을 공부했습니다만, 당연히 DirectX 환경이라 생각해 D3D9로 접근하다 실패하고선 RenderDoc으로 OpenGL 1.x 기반인걸 알아채고서야 glDrawElements 를 후킹해 월핵을 구현했었죠
이번엔 제대로 된 D3D9 후킹을 공부하기 위해 소스엔진 기반의 CS:S(Counter Strike:Source)를 대상으로 선택했습니다.
D3D9기반의 게임이며 구조가 단순해 학습용으로 적절하다고 판단했습니다.
개발환경
- Visual Studio 2022
- DirectX SDK June 2010 (d3d9.h, d3dx9.h)
- Microsoft Detours Library
- Target : Counter-Strike : Source (x86)
- Injector : Cheat Engine DLL Inject
D3D9 후킹 원리
게임이 화면을 렌더링할 때 D3D9 API 함수들을 호출합니다. 이 함수들을 가로채(후킹) 렌더링 과정에 개입해 월핵을 만들겠습니다
핵심 타겟 함수는 2가지 입니다. 전 글에서도 대충 설명하긴 했습니다만 다시 기재하겠습니다.
EndScene | VTable[42] | 매 프레임 끝에 호출되며 D3D디바이스 포인터 획득용으로 사용합니다.
DIP (DrawIndexedPrimitive) | VTable[82] | 모든 3D 오브젝트를 렌더링합니다, 최종적으로 월핵을 구현하기 위해 사용합니다.
전체흐름
더미 D3D9 디바이스를 생성한 후
-> VTable[42] EndScene 주소 호출 + 후킹
-> hkEndScene에서 g_pDevice 캡처
-> g_pDevice VTable[82] DIP 주소 호출 + 후킹
-> hkDIP에서 메시 필터링 + 월핵 렌더링
VTable 이란?
C++에서 가상 함수를 가진 클래스는 컴파일러가 자동으로 VTable을 생성합니다, D3D9는 COM 인터페이스 기반으로 모든 함수가 VTable로 관리됩니다.

더미 디바이스로 VTable을 얻는 이유
인젝션 직후엔 게임의 실제 디바이스 포인터를 알 수 없습니다. 그래서 임시 디바이스를 직접 생성해서 VTable 주소를 먼저 얻고,
같은 d3d9.dll 을 사용하기 때문에 인덱스 배치가 동일하다는 점을 이용하는 겁니다.


구현과정
EndScene 후킹으로 디바이스를 획득해보겠습니다.

빌드 후 게임에 인젝션을 해보면

후킹이 성공적으로 되는 모습이 보입니다. EndScene은 매 프레임마다 호출되므로, 첫 호출 시 게임의 실제 디바이스 포인터를
획득할 수 있습니다.
DIP 후킹


원리를 이해하고 공부하기엔 직접 구현하는 것도 좋지만, 이전 포스팅 막바지에 OpenGL 의 glDrawElements 를 후킹할때
직접 인라인후킹을 구현했으므로, 실수 여지도 있고 손쉽게 Detours 라이브러리를 사용하는게 좋다고 생각됩니다.
이어가며
이제 다음 포스팅에서는 Stride 분석을 통해 캐릭터 메시를 찾고, 그 메시에 색상을 입혀줘 월핵을 완성하면 되겠네요
https://imoracle.tistory.com/67
[게임핵의 원리] 월핵은 어떻게 만들어지는가 -DirectX 후킹 원리 분석- 최종
들어가기에 앞서...본 포스팅은 학술적 연구 및 리버싱 학습을 목적으로 작성되었습니다. 모든 테스트는 오프라인(Local Bot Match) 환경에서 진행되었으며, 실제 멀티플레이 서버나 타인의 게임 경
imoracle.tistory.com