본문 바로가기
hacking & security/system

Game and Messenger Hooking

by 탁종민 2021. 1. 7.

예전에 (5년 전) 카톡-롤 후킹하기를 주제로 학교 졸작에 제출한 프로젝트에 대한 포스팅이다. 5년전이면 꽤나 오래전 일이기 때문에 여기서 설명한 카톡,LOL에 대한 정보는 현재와는 다를 수 있다.

 

당시 주제는 LOL과 카톡을 둘 다 후킹한 뒤 LOL에서 보내는 메세지를 강제로 카톡으로 전송하는 모듈이었다.

카톡은 Themida 패킹 때문에 암호화, 복호화 루틴을 리버싱하면서 원하는 메세지를 찾는 과정이 꽤나 힘들었던 기억이 난다. 듣기로는 현재는 ThemidaAnti debuggingDLL Injection 방어가 강력해져서 이때 당시 방법으로는 지금의 카톡을 후킹하기가 힘들 거라는 이야기를 들은 적이 있다.

 

함수를 찾는 과정이 힘들었는데 처음에는 큰 프로그램을 소스코드 없이 리버싱 한적이 없어서 고생을 엄청 했었다. 고생을 하면서 삽질을 하다보니 몇가지 노하우가 생기게 되었다.

1. 일단 소켓 Write Windows 32 API 함수나 대략적으로 메세지를 보내는 최종 단계라고 생각되는 부분에 BP를 건다.

2. 메세지를 보낸다.

3. BP가 걸리면 이제 메모리에서 메모리를 찾는다.

3.1 BP가 걸리면 스택메모리에서 메세지를 찾는다. 보통 스택에 메모리가 존재하면 스택프레임을 이용해 해당 스택이 있는 Function을 알 수 있다. 왠만하면 해당 메세지를 다루는 함수다.

3.2 스택에서 못찾겠으면 그냥 메모리에서 찾는다. 그런다음 Hardware BP를 걸어 걸릴때마다 대충 코드를 본다음 감으로 메세지를 다루는 Function인지 찾아낸다.

 

사실 리버싱을 잘하는 사람들이 어떻게 리버싱하는지 본적이 없다. 아마 그런 분들은 더 좋은 방법이 많이 있을 거라 생각한다. 나이를 조금 먹고 느끼는 건데 물론 정보를 혼자 잘 찾는것도 중요하지만 사람들한테 잘 물어보는 것도 굉장히 중요하다. 당시 나는 융통성이 너무 없었던 것 같다.

 

구현한 기능은 다음과 같다. LOL에서 특정 커맨드 ( /카톡 )을 사용하면 카카오톡으로 메세지를 보내는 것으로 간주해 사용자가 선택한 방으로 메세지를 보낸다. 또한 게임 화면에서는 카톡 메세지를 보여준다.

 

 

 

분석 당시 PC카카오톡 어플리케이션의 동작 방식은 대략적으로 다음과 같았다.

 

내가 사용한 방식은 카톡에서 사용하는 포맷에 맞게 LOL메세지를 바꾼 후 암호화 모듈 입구에 집어넣는 방식이었다. 마찬가지로 카톡 서버에서 오는 메세지 역시 복호화 되어 출구에서 나오는 메세지를 가로채 게임으로 가져와 사용했다. 사실 분석당시 암호화/복호화 알고리즘으로 무얼 사용하는지도 몰랐다. 지금 생각해보면 그냥 TLS였을 수도 있을 것 같다는 생각이 든다.

 

당시 해결해야 했던 문제는 카톡과 LOL이 주기적으로 업데이트/패치를 한다는 거였다. 패치를 하면 바이너리가 변해서 후킹을 걸어야 하는 함수 위치가 변한다. 예를 들어 추가로 생긴 함수로 인해 기존 함수의 바이너리상 위치가 뒤로 밀리면서 주소값이 변할 수 있었다. 당시는 그냥 임시방편으로 주먹구구식으로 함수의 Binary값을 탐색해서 주소 위치를 찾아냈었다. 예를들어 패턴 탐색 rule에 x64 어셈블리 코드의 주소 operand는 wildcard처리 하며 부랴부랴 Binary 패턴 탐지 해나갔었다. 다행히 졸업작품 기간 때까지 8개월 동안은 문제가 발생하지 않아서 안도의 한숨을 쉬었던 걸로 기억한다.

 

 

'hacking & security > system' 카테고리의 다른 글

Jerryscirpt Code Execution Vulnerability  (0) 2021.01.07

댓글