카테고리 없음

메모리 접근 행위 기반 안티치트 드라이버 개발

eulb 2024. 12. 6. 05:19

학사 학위 졸업 논문 대주제를 안티치트로 설정하고 각자 역할을 나누었다. 

 

기존 안티치트는 게임사의 서버에서 값의 이상 변화를 감지하거나 클라이언트의 무결성을 검증하거나 실행 중 프로세스를 감시하는 방법등으로 구현이 되어왔다. 하지만 클라이언트가 ring3에서 동작하는 이상 이를 무력화 할 방법 또한 개발되어 왔다.

치트 프로그램이 동작하기 위해서는 게임 클라이언트 프로그램이 동작할 때 해당 프로세스에서 메모리 값을 읽어오는 행위가 대부분 일어나고, 게임 핵 프로세스는 커널 함수를 통해 이 행위가 이루어진다고 생각하여 해당 커널 함수를 사용한 기록을 조회한다면 안티치트의 구현이 가능할 것이라고 생각했다.

ZwReadVirtualMemory를 목표로 하여 후킹을 하면 해당 기능을 구현할 수 있을 것이라고 가설을 세우고 프로그램 코드를 작성했다.

 

코드에 대한 설명에 들어가기에 앞서 해당 드라이버는 드라이버 로더에서 읽어오지 못해 컴파일까지만 시도하고 정상 작동을 테스트 하지는 못했다.

 

후킹 함수는 원래 함수와 같은 값을 인자로 하여 ZwReadVirtualMemory를 호출 한 프로세스가 대상프로세스와 같은지 판별한 후 대상 프로세스를 디버깅 메시지로 로깅하고 원래 함수를 실행한다. 원래 IOCTL을 통해 PID를 전송하고 로그내용을 전송받는것으로 기획했지만 프로그램을 테스트 하는 과정에서 코드 다이어트 중 해당 기능을 제거하였다.

후킹 생성 함수는 ZwReadVirtualMemory의 함수 주소 포인터 값을 가져와 후킹함수로 바꾼다.

드라이버가 unload될 때는 후킹을 해제한다.

 


위 드라이버의 빌드는 성공했지만 경로문제로 인해 동적 디버깅에 실패했다.