8. API 함수를 통한 리버싱 & 크랙
본문 바로가기
Reversing & Cheat Engine

8. API 함수를 통한 리버싱 & 크랙

by boosting 2024. 2. 22.
728x90

API는 함수라고 생각하자.

 
기존 글에서 함수라는 말은 많이 봤을 겁니다.
명령어들의 집합 정도라고 설명을 드렸었죠.
컴퓨터의 운영체제가 돌아가는 데에도 당연히 이 수많은 함수들이 사용이 될 것입니다.
그런데 일반 프로그램 개발자들이 운영체제의 복잡한 내부 함수 동작까지 다 이해를 하는 건
거의 불가능에 가깝기 때문에 운영체제에서 기본적인 동작을 하는 함수를 제공을 합니다.
 
이를 API 함수라고 부른다고 보시면 됩니다.
영어로 표현하면 Application Programming Interface의 약자인데 그냥 알아만 두죠.
처음 접할 때 어떤 API 함수를 익혀야 하나요 등등 순서를 정하는 경우들이 종종 있는데
굳이 그럴 필요가 없습니다.
어차피 다 하나의 운영체제 안에서 움직이는 것들이라 C, C++의 문법을 공부하다가
필요할 때마다 검색으로 차차 익혀 나가는 게 좋습니다.
 
그러면 이 API 함수를 왜 언급을 하느냐 하면 저희가 Cheat Engine으로 프로그램 내부를
들여다볼 때 이 API 함수들에 디버깅을 해서 그 프로그램에서 어떤 식으로 이 API 함수를
썼는지 읽고 수정을 할 때가 종종 있습니다.
 
리버싱 기준으로 왜 필요한지에 대해서 간단하게 실습으로 해보겠습니다.
기존에 켰었던 gtutorial 이것으로 말이죠.
 

API 함수를 통한 접근

 
내용을 다 따라 하셨다면 클리어를 다 했을 것이기에 Step 1로 다시 돌아가줍니다.
 

메시지박스

 
클리어를 할 경우 이렇게 메시지박스가 뜨는 것을 보셨을 겁니다.
저는 이 메시지 박스의 문구가 마음에 들지 않아서 바꾸고 싶습니다.
이럴 경우 이 메시지박스를 띄우는 API를 찾아야 이걸 바꾸든지 하겠죠?
 
'CE Game tutorials'를 String으로 검색을 합니다.
이 문구가 저장된 주소의 메모리 속성이 Read Only라서 검색이 안될 겁니다.
 

스캔

 
빨간색 테두리 친 곳을 클릭을 하면 v 모양 체크가 - 로 변하면서
모든 메모리 속성을 다 스캔할 수 있게 변경이 됩니다. 알아두시면 좋아요.
그러면 값 1개가 떴고 이 부분을 Memory viewer로 열어주세요.
 

디버깅

 
열어서 우클릭하시고 Data Breakpoint -> Break on Access를 눌러주면
여기 메모리 부분에 디버깅이 걸립니다.
즉 이 문구가 담긴 주소에 접근하는 명령어가 있으면 캐치를 해내는 역할인 거죠.
디버깅을 걸어두시고 Step 1을 클리어해 주세요.
혹시나 잘 모르겠다 하시는 분들은 밑의 글을 다시 한번 읽어서 클리어를 해주세요.
 

3. 치엔 게임 튜토리얼 Step 1

[이전글] - 2. Cheat Engine 설치 및 세팅 1. gtutorial-x86_64.exe 와 Cheat Engine을 실행해 놓읍시다. 일단 둘 다 실행시켜 놓으면 다음과 같은 화면이 뜰 것입니다. Step 1이라는 무슨 영어가 있습니다. 영어로

poppinss.tistory.com

 
클리어를 하고 나시면 아마 디버깅이 걸릴 겁니다.
 

디버깅

 
걸리면 아마 이런 식으로 나오게 될 텐데 Return Address들이 쫙 나와있습니다.
여기서 살짝 내리시면 user32.OffsetRect, user32.DispatchMessageW를 보실 수 있습니다.
위에서 설명했던 API 함수들에 해당하는 것들이죠.
 
OffsetRect 같은 경우 지정된 사각형을 개발자가 정한 Offset만큼 밀어주는 역할을 하고
DispatchMessageW 같은 경우 창 프로시저에 메시지를 디스패치 해주는 역할을 합니다.
즉 간략하게 해석을 하면 'CE Game tutorials'라는 메시지를 창에다가 보내준다는 말인 거죠.
 

이 분석을 통한 빠른 답 도출

 
그러면 이것으로 무엇을 할 수 있는가 하면 제일 먼저 떠오르는 건 문구를 바꿔보는 거겠죠.
근데 문구만 바꾸고 끝내기에는 조금 아쉬운 감이 없지 않아 있습니다.
이렇게 생각을 해봅시다. Step 1의 기준입니다.
 

1. 타깃의 체력을 0으로 만든다.
2. 이를 프로그램에서 검증 후 통과가 되면 클리어 처리를 한다.
3. 클리어 처리가 되면 메시지 박스를 띄워준다.

 
이렇게 3개로 또 쪼개어 볼 수 있겠죠?
그러면 그냥 1,2번을 생략해 버리고 메시지박스를 띄워버리면 어떨까요?
그러면 꼼수 클리어를 할 수 있지 않을까요?
 
한 번 시도를 해보겠습니다.
일단 클리어를 했을 때 well done이라는 문구가 뜨는 것을 기억하실 겁니다.
이 문구로 접근을 해보죠. well done 문구를 스캔해 봅시다. 총 4개가 뜰 겁니다.
 
1개는 메모리뷰를 열어보면 well done!이라고 느낌표가 있기 때문에 아닌 거고
나머지 3개는 똑같이 well done으로 되어 있습니다. 그러면 여기서 느낌이 좋은
분은 바로 파악을 하셨을 겁니다.
 
이 나머지 3개는 각 스테이지 클리어를 했을 때 띄워주는 문구 주소들이겠구나 라는걸.
이런 걸 빠르게 캐치하시는 분들이 실력이 좋은 건데 못해도 상관은 없습니다. 3개 다
확인을 해보면 되는 거니까요.
 

어셈블리 스캔

 
메모리뷰를 열고 위에칸을 누르고 Ctrl+G 를 누르면 주소를 입력할 수 있습니다.
주소를 gtutorial-x86_64.exe를 쓰시고 Search 탭에 Find assembly code를 눌러줍니다.
스테이지 별로 well done이라는 문구를 쓴다는 가정하에 1번째가 1번째 스테이지를
의미할 확률이 높으므로 이렇게 설정해 주세요.
 

어셈블리 스캔

 
아 어차피 주변 문구들을 보니까 튜토리얼 1번에 해당하는 문구가 맞는 듯하네요.
1002B6788 이 주소를 써주시고 Scan을 눌러주세요.
 

어셈블리 스캔

 
문구가 하나 뜨셨을 거예요.
더블클릭 하면 이곳으로 바로 넘어와집니다. 위를 살짝 올려보면 조건문이 여러 가지가 있는데요.
 

디버깅

 
조건문에다가 디버깅을 걸어보니 현재 스테이지 1에서 작동하고 있고 점프를 하고 있는 상황입니다.
즉 well done이라는 문구 쪽으로 가지 않는 상황인 거고 클리어 조건을 만족하지 못했다는 것이겠죠.
여기서 살짝 위를 올리면
 

gtutorial-x86_64.exe+3D69C - E8 2FEBFFFF           - call gtutorial-x86_64.exe+3C1D0
gtutorial-x86_64.exe+3D6A1 - 84 C0                 - test al,al
gtutorial-x86_64.exe+3D6A3 - 0F84 73000000         - je gtutorial-x86_64.exe+3D71C < 현재 점프중

 
이렇게 명령어가 되어있는데 이 call 함수에서 무언가를 체크하는 거 같습니다.
그렇다면 체크할게 뭐가 있냐 하면 당연히 체력을 체크하겠죠. 함수 안을 봐보죠.
 

gtutorial-x86_64.exe+3C1D0 - 8B 41 70              - mov eax,[rcx+70]
gtutorial-x86_64.exe+3C1D3 - 85 C0                 - test eax,eax
gtutorial-x86_64.exe+3C1D5 - 7F 03                 - jg gtutorial-x86_64.exe+3C1DA
gtutorial-x86_64.exe+3C1D7 - B0 01                 - mov al,01 { 1 }
gtutorial-x86_64.exe+3C1D9 - C3                    - ret 
gtutorial-x86_64.exe+3C1DA - 30 C0                 - xor al,al
gtutorial-x86_64.exe+3C1DC - C3                    - ret 

 
이런 식으로 되어있는데 이 rcx+70의 벨류를 보시면 64, 즉 10진수로 100이 되어 있습니다.
상대 체력을 의미하는 게 맞네요. 밑의 조건문을 보면 test eax, eax라고 되어 있습니다.
이 test도 cmp랑 자주 쓰이는 거니 기억해 두시면 좋아요. 그러니까 이걸 풀어서 보면
eax가 1보다 크면 점프를 하라 이 소립니다. 0이 되어야 mov al,01로 가는 거예요.
그러면 이 점프문을 jng로 바꿔보죠.
 
이렇게 하면 클리어가 됐을까요? 아닙니다.
프로그램에서 무결성 검사로 한 번 더 검사를 하고 있는 걸 볼 수 있습니다.
 

디버깅

 
아까 체력 바로 밑 조건인데요. 안에 내용을 보면 다음과 같습니다.
 

gtutorial-x86_64.exe+3AED0 - 53                    - push rbx
gtutorial-x86_64.exe+3AED1 - 48 8D 64 24 E0        - lea rsp,[rsp-20]
gtutorial-x86_64.exe+3AED6 - 48 89 CB              - mov rbx,rcx
gtutorial-x86_64.exe+3AED9 - 80 7B 40 00           - cmp byte ptr [rbx+40],00 { 0 }
gtutorial-x86_64.exe+3AEDD - 74 18                 - je gtutorial-x86_64.exe+3AEF7
gtutorial-x86_64.exe+3AEDF - E8 2CC3FFFF           - call gtutorial-x86_64.exe+37210
gtutorial-x86_64.exe+3AEE4 - 48 8B 53 38           - mov rdx,[rbx+38]
gtutorial-x86_64.exe+3AEE8 - 48 81 C2 D0070000     - add rdx,000007D0 { 2000 }
gtutorial-x86_64.exe+3AEEF - 48 39 D0              - cmp rax,rdx
gtutorial-x86_64.exe+3AEF2 - 0F93 C0               - setae al
gtutorial-x86_64.exe+3AEF5 - EB 02                 - jmp gtutorial-x86_64.exe+3AEF9
gtutorial-x86_64.exe+3AEF7 - 30 C0                 - xor al,al
gtutorial-x86_64.exe+3AEF9 - 90                    - nop 
gtutorial-x86_64.exe+3AEFA - 48 8D 64 24 20        - lea rsp,[rsp+20]
gtutorial-x86_64.exe+3AEFF - 5B                    - pop rbx
gtutorial-x86_64.exe+3AF00 - C3                    - ret 

 
rbx+40의 벨류를 통해 0이면 점프를 하고 있는 상황이네요.
이게 어떤 걸 검사하는 건지는 잘 모르겠는데 굳이 읽을 필요는 없어 보이네요. 이 je 조건문을
jne로 바꿔보도록 하죠. 바꾸시면 뭐 아무것도 안 해도 클리어 처리가 된 것을 보실 수 있습니다.
실제로 Ok를 누르면 Step 2로 바로 넘어가고요.
 

클리어

 
이것을 크랙의 일종으로도 볼 수 있습니다.
프로그램이 제시하는 방향이 아닌 다른 방향으로 비틀어버려서 진행을 했으니까요.
실제 크랙이 이루어지는 방법들도 이러한 방식들로 진행이 됩니다.
 

클리어

 

클리어

 
위의 스샷들도 보시면 기존 클리어 글에서는 클리어를 위해 개고생을 했었는데
이러한 방식으로 클리어를 해버리면 그런 개고생을 할 필요가 없어집니다.
하지만 이전글들의 방식을 꼭 해야 합니다. 이런 식으로 편법만 쓰면 분석 실력이 안 늘어납니다.
 
꼭 프로그램이 요구하는 방식으로만 생각해 볼게 아니라 진짜 여러 가지 해결 방법들이 있습니다.
이런 것들을 꾸준히 연습하고 생각을 해보는 과정이 리버싱 실력을 늘리는 데에 도움을 줄 겁니다.
 
다음번에는 간단한 크랙미 같은 걸로 해볼까 해요.
이렇게 다듬고 실력을 늘리다 보면 온라인 게임 핵 같은 거에도 손을 댈 수는 있겠죠.
물론 추천을 드리진 않습니다... 혹시나 해보시더라도 어디까지나 재미에만 그쳤으면 좋겠습니다.

728x90

'Reversing & Cheat Engine' 카테고리의 다른 글

10. 리버싱의 꽃 후킹(Hooking)  (0) 2024.02.24
9. 크랙미 첫 번째  (0) 2024.02.23
7. 치엔 게임 튜토리얼 Step 3  (0) 2024.02.20
6. 어셈 명령어  (0) 2024.02.19
5. 어셈블리어  (0) 2024.02.19