LoL 매니아 칼럼 게시판

전체보기

모바일 상단 메뉴

본문 페이지

[분석] 핵 & 매크로에 대해서 분석해보자.

아이콘 ThisPlus1
댓글: 81 개
조회: 20921
추천: 25
2015-08-03 20:32:50

안녕하세요 

할일없는 백숩니다.

요즘 핵에 대한 추측글이 나돌아서 이렇게 쓰려고 해요

매칼게에 핵 원리라고 써놓은 글과 댓글들이 기가 차서 말도 안나와서... 
(그런식으로 해킹할 수 있으면 누구나 해커!)

시작합니다.

참고로 들어가기 전에 아마 이 글은 좀 전문적인 글이 될꺼에요!
(급식충은 읽기 힘드나 대학교 3학년정도 되면 읽을 수 있을듯.. 공대기준..)

-------------------------------------------------------------------------------------------------------------------------------------

1. 릴레이 소켓 패킷 스니핑

먼저 서버와 클라이언트 관계에 대하여 알아봅시다.

우리가 롤 게임을 다운받고 롤을 실행시키면

롤(클라이언트) <----------> 서버 이렇게 통신합니다.

그리고 롤과 서버 사이에는 여러 데이터들이 와리가리 하죠.

예를들면 제가 챔피언 카시오페아를 오른쪽으로 1티모미터만큼 움직였습니다.

그걸 그 방에 접속한 다른 게임 유저들도 봐야하잖아요..

즉, 카시오페아가 오른쪽으로 이동하는 데이터를 서버에게 쏩니다.

그걸 받고 서버는 그 게임 안에 있는 10명의 유저에게 카시오페아가 오른쪽으로 이동하게 하는 그래픽을 처리하게 하죠.
(물론 좌표 등등도 처리할꺼에요!)

즉, 클라이언트와 서버 사이에는 여러 중요정보들이 섞여 있습니다.

무빙부터 상대방 챔피언의 방어력, 마저, AP, 체력, 아이템 구매, 스킬 사용 거리 등이 다 적혀있을꺼에요.

그러면 그 데이터를 내 프로그램이 읽을 수 있으면.. 흔히 말하는 자동매크로를 만들 수 있을꺼에요!

클라이언트 <--------> 내 프로그램 <---------> 서버

이런식으로 내 프로그램을 사이에다가 설치하면 되겠네요!

이 방식을 릴레이 소켓 방식이라 합니다.

2. 클라이언트가 서버로 보내는 데이터를 어떻게 가로채죠?

이게 핵심이죠.

만약 내 프로그램이 데이터를 못받으면 어떻게 되나요..

클라이언트 <-----------> 서버 이렇게 되겠죠. 즉, 우리는 클라이언트의 데이터 서버 발송 주소를 바꿔야 해요.

어떻게?

클라이언트는 보통 Connect 함수를 이용해서 서버에 연결해요.

Connect 함수는 상대방의 주소, 포트 등을 받고 서버 파일 디스크립터(또는 소켓 넘버)를 반환합니다.

상대방의 주소를

127.0.0.1(localhost) 이고 포트는 내 프로그램의 포트로 써 주면 되겠네요.

어떻게 바꿔요?

Connect 함수 내부를 들여다보면

push ebp 
....
....
ret

라는 어셈블리어가 있을꺼에요!

보나마나 위에는 스택프레임 형성이고 아래는 리턴이겠죠.

Connect 내부 어셈블리 상위 5바이트를 코드 인라인 패칭해서 jmp 내 프로그램 루틴

으로 바꿔준다음에 변수를 마음껏 바꿔주시면 됩니다! 참 쉽죠.

아! 물론 그때는 Virtual Address 에 접근하기 위해서 dll injection이 필요해요!!

즉, 롤 클라이언트가 Connect함수를 호출해서 서버 소켓 넘버를 받으려고 할때, 그 변수들을 조작해서

다른 방향으로 조작할 수 있겠네요.

물론 원래의 변수값들은 백업해서 나중에 내 프로그램에서 서버로 데이터를 쏠 때 쓰면 되겠네요!

3. 데이터가 16진수로 쭉 나열되어있는 숫자만 있는데?

보통은 클라이언트가 서버로 패킷을 보내기 전에 암호화를 해줘요.

즉, 의미있는 숫자는 볼 수 없는거죠.

즉, 우리는 이 패킷을 복호화 해야되요!

당연히 공용 알고리즘은 무겁고 알고리즘이 다 공개되어 있어서 안쓰겠죠!

그러면 복호화, 암호화 루틴을 어떻게 찾아야 할까요?

자 이제 역공학 기법이 나옵니다!

생각을 해봅시다.

클라이언트에서는 패킷을 만들었습니다.

그다음 암호화를 하겠죠.

그 뒤, send 함수로 보낼껍니다. 

오! 그럼 send 함수에 브레이크포인트를 걸면 되겠네요.

보통 게임 패킷 처리는

PacketMakeFunc
GameSendPacket
...Encrypt
......Send

이런식으로 되어있거나

PacketMakeFunc
GameSendPacket
...Encrypt
...Send

이런식으로 되어있어요!

물론 다를수도 있어요!

만약 전자 구조로 되어있을때

Send 함수에다가 브레이크 포인트를 걸면

send 함수에 진입하는 순간 스택을 살펴보면 Encrypt 안 루틴의 주소가 있겠네요!

이것을 IDA로 슈도코드로 보면 C언어로 이쁘게 암호화 함수가 나오겠네요!!

자, 암호화 함수를 찾았으니 복호화 함수도 찾아보죠.

Recv 함수에다가 브레이크 포인트를 걸어보죠.

보통은

PacketProcess
...Recv
...Decrypt

으로 함수가 병렬화 되어있어요!

즉, Recv 함수에가 리턴값을 받은 뒤, 다음 몇개 함수중에 하나가 복호화 함수겠네요!

그것을 IDA로 쭉 보면 와.. 복호화 알고리즘이 있습니다. 

그리고 암호화와 복호화 알고리즘이 서로 대칭적이네요!

근데 게임을 다시 시작했을때는 어떤 전역변수(DWORD_0xxxxx)가 가리키는 숫자가 달라졌어요!

그건 게임 초반에 서로 암호키 셋팅을 하는 과정에 나옵니다! 
(암복호화 알고리즘을 공부하면 이 정돈 알 수 있겠죠!)

그리고 의미있는 패킷이 흘러서 복호화 되는것을 보니 끝에는 실제로 의미있는 숫자가 나오네요!


-------------------------------------------------------------------------------------------------------------------------------------


오늘은 챕터 3개에서 끝낼께요~

다음에는 의미있는 데이터를 어떻게 Unserialize 하는지, 어떻게 활용될 수 있는지 에 대해서 알아볼께요!

끝에는 어떻게 핵감지를 해서 차단하는지, 핵감지를 또 어떻게 바이패스 하는지!

아마 이정도면 컴퓨터 잘하는 사람은 핵이나 매크로가 어떻게 동작하는지 알 수 있을꺼에요!

(핵이나 매크로나 현재 작동방식은 동일합니다~!!)


Lv71 ThisPlus1

모바일 게시판 하단버튼

댓글

새로고침
새로고침

모바일 게시판 하단버튼

지금 뜨는 인벤

더보기+

모바일 게시판 리스트

모바일 게시판 하단버튼

글쓰기

모바일 게시판 페이징

최근 HOT한 콘텐츠

  • LoL
  • 게임
  • IT
  • 유머
  • 연예