본문 바로가기
OLD 2018 ~ 2021/BASIC → Hacking

180118_[REVERSING]_닷지게임_안죽게_패치하기

by pogn 2018. 1. 19.
Concept 개념정리


윈도우의 WM_USER 메시지

 : WM_USER은 사용자가 메시지를 전달하고 싶은 경우를 대비하여 시스템에서 쓰는 주소와 곂치지 않도록 미리 시스템에서 사용자가 Windows Messge로 활용할 수 있게 예약해둔 공간을 가리키는 포인터다. WM_USER+1 과 같이 쓴다.
윈도우의 메시지를 처리하는 함수인 WndProc이 있다면,
윈도우 자체에서 메시지를 발생시키는 함수에는 PostMessage와 SendMessage가 있다.

WM_USER에서 보내는 메시지 넘버는 닷지가 죽고, 안죽고와 같은 사용자측의 이벤트가 아니라 
운영체제와 관련된 메시지 인것 같다.

 



Hands-on Practice 실습

닷지게임 안죽게 패치하기


1) 언패킹

해당 파일은 FSG 1.0으로 패킹되어 있었다.
EP : 429000  |  OEP : 407BB6
ollydbg에서 OEP로 바로 이동해주는 옵션을 준 뒤 재 실행 시키니 몇 번 실패하다가 OEP를 찾았다. ( 같은 조건에 실행시켰는데 왜 안 되었는진 잘 모르겠다. ) OEP에 진입한 시점에서 ollydump 하고, ImportREConstructor 툴에서 IAT 테이블을 복구하니, 실행이 잘 되었다.

 
  • break Point 설정

  • OEP에 걸렸다.

  • ollyDump

 
  • 이것도 한번 실행 후에 멈추는 증상이 있어 PEID로 다시 언 팩 하였다.



2) 분석 - 시도 1
게임에서 졌을 때, 메시지 박스가 띄워지므로, MessageBoxA 함수에 모두 브레이크 포인트를 걸고 동적 디버깅을 진행해 보았다.
디버깅 결과, 졌을 때 실행되는 함수는 sub_12B0이었으며 xref 해서 따라가 보니 아래와 같이 두 부분에서 호출되고 있었다.

(1) sub_1400

(2) sub_1AD0

닷지가 죽으면 (2) Sub_1AD0의  line 114 라인으로 분기하게 된다. Sub_1AD0은 a3(메시지 넘버로 추정)에 따라 분기하게 하는 WndProc 함수이다. a3이 0x400이 되면 switch 문에 의해 분기한다.

        

WndProc에서 메시지 넘버가 0x400이 되더라도 다른 분기문으로 jmp하도록 패치 하려 하였으나, 생각보다 쉽지 않았다.

2) 분석 - 시도 2
닷지가 죽는 메시지는 운영체제 자체에서 생성하는 메시지가 아니라 WM_USER 일 것이라는 추측을 하게 되었다. 따라서, 메시지를 보내는 부분을 수정하면 더 쉬울 것 같아 SendMessage와 PostMessage 함수를 찾아보았다.

해당 부분이 죽었을 때 메시지를 보내는 부분이다.
0x400 번 메시지 대신 0x00이나 0x100을 넣어보았는데 MessageBox는 안 뜨는 대신 게임은 종료 된다…



2) 분석 - 시도 3
다른 방법으로는, PostMessage 전의 분기문에서 해당 메시지 전송 함수에 들어가지 않게 하면 된다.

위의 상태는 닷지가 죽기 직전의 상태인데, edi가 1이고, ebp가 2임이 보인다.
닷지가 살아있을 때는 JNZ 구분에 의해서 edi가 1이 아니거나 ebp가 2가 아니면, 1945 로 빠지면서 메시지가 발생하지 않는다.  따라서, edi를 3으로 수정해 보았다.

동적 디버깅을 하다보니 닷지가 살아 있을 때의 ebp 값은 1이고 죽었을 때는 2 라는 값을 가지므로 둘 다 통과할 수 있도록 , cmp를 3으로 수정하였다.

PostMessageA 부근의 코드가 메시지 창을 띄우도록 메시지를 보내는 코드인 것 같다.
게임은 계속해서 종료되었다 ㅠ…

2) 분석 - 시도 4
바로 위의 코드(401920)에서, 동적분석을 통해 알아낸 결과, 닷지가 죽으면 EDI가 2로 변하고, 살아있으면 1로 변했다.
EDI 를 보내는 40D868에 하드웨어 브레이크 포인트를 걸고 실행을 시켜보았다.

위의 부분에서 0x2를 0x1로 바꾸어 주니 게임에서 항상 이기게 되었다.

 







Reference 참고문헌

- WM_USER에 관하여


 




'OLD 2018 ~ 2021 > BASIC → Hacking' 카테고리의 다른 글

180127_REVERSING(5)_key  (0) 2018.01.28
180121_REVERSING(4)_winme  (0) 2018.01.23
170119_REVERSING(3)_snake  (0) 2018.01.18
180113_REVERSING(2)_pick_me  (0) 2018.01.14
170111_REVERSING(1)_whereami  (0) 2018.01.14

댓글