10. 리버싱의 꽃 후킹(Hooking)
본문 바로가기
Reversing & Cheat Engine

10. 리버싱의 꽃 후킹(Hooking)

by boosting 2024. 2. 24.
728x90

내가 원하는 명령으로 낚아채는 기술

 

Hooking이란 단어의 사전적 의미 자체가 낚시 같은 거에서 낚아챈다 라는 의미가 있습니다.

이 말 그대로 '실행될 명령 주소 부분을 내가 만든 공간으로 낚아채서 다른 명령으로 바꾸는 기술'

요렇게 이해를 하시면 후킹이란 단어의 이해는 끝입니다.

이 기술은 제 생각엔 50% 이상을 먹고 들어가는 정도로 필수로 사용해야 하는 기술이라고 생각합니다.

 

사실 이전 글들에서도 이미 후킹을 사용하고 있었습니다.

 

9. 간단한 크랙미 첫 번째

시작은 크랙미부터 글을 써보기 위해서 이래저래 크랙미 버전들을 찾아봤는데 적당한 난이도의 크랙미들도 많더군요. 기존에 썼던 내용들을 최대한 써가면서 풀어보는 게 실력 쌓는 데에 도움

poppintip.co.kr

 

후킹의 생김새

 

이 글 밑 부분을 보시면 jmp xorfunc 이런 식으로 기존 명령어인 mov eax,0을 내가 만든 공간인 xorfunc라는 곳으로

점프를 시켜서 실행 흐름을 바꿔버리는 것입니다.

 

32Bit 프로그램에서는 5Byte 에 해당하는 메모리 길이를

E9 XX XX XX XX 이런식으로 진행하고

 64Bit 프로그램에서는 14Byte에 해당하는 메모리 길이를

FF 25 00 00 00 00 XX XX XX XX XX XX XX XX 이런 식으로 바꿔버립니다.

 

그러니까 후킹이라는 것을 할 때 내가 원하는 흐름을 끼워 넣는 건 좋지만

기존의 흐름을 최대한 안 깨야하기 때문에 후킹이 된 지점에서 내가 원하는 명령을 다 넣고

원래 주소로 빠져나갈 땐 후킹으로 깨진 명령어들을 정상적으로 넣어야 오류가 없습니다.

5Byte 길이는 기껏해봐야 1~2개의 명령어만 복구해 주면 되는데 14Byte 길이는 꽤 길기에

잘 보고 깨진 명령어들을 넣어주는게 좋습니다.

 

 

또 다른 후킹 IAT

 

그러면 후킹이라는 것에 대해선 알겠는데 이것도 종류가 있냐 하면 크게 2가지가 있습니다.

위에서 설명했던대로 메모리를 직접적으로 후킹 하는 방식과 IAT 후킹이라는 방법이 또 있습니다.

그러면 IAT 후킹이라는 것은 무엇인가 하면 포인터 주소를 내가 원하는 공간으로 수정해 주는

방식입니다.

 

이게 무슨 말인고 하면 

 

 

 

다음 어셈 명령어를 보시면 FF 25 963F3D00        - jmp qword ptr [gtutorial-x86_64.exe+3D4FBC]

요런 식으로 되어있습니다. 명령어를 해석하면 대충 이런 뜻일 겁니다.

[ ] 안에 있는 주소의 8바이트만큼의 벨류를 읽어서 점프해라.

옆에 Comment를 보면 TlsGetValue라는 API의 주소가 담긴 포인터인 거로 확인이 가능합니다.

이 점프하는 함수를 바꾸고 싶을 때 gtutorial-x86_64.exe+3D4FBC의 벨류를 내가 지정한 공간 쪽의

주소로 바꾸는 게 IAT 후킹이라고 이해하면 되겠습니다.

 

IAT 후킹 같은 경우 이런 의문을 품을 수도 있습니다.

그냥 TlsGetValue API를 후킹 하면 되지 않냐라고요.

맞습니다. 사실 TlsGetValue 함수를 직접적으로 후킹을 하나 이 IAT 방법을 쓰나 큰 차이는 없습니다.

그러나 단순한 프로그램이 아니라 여러 프로세스들이 서로 엮여 있을 경우 이 API 함수를 쓰는 곳이

한 두 군데에서만 쓰는 게 아니기 때문에 그런 부분들을 모두 다 예외처리를 하기에는 너무 힘들어집니다.

그렇기 때문에 어떤 특정 모듈 부분에서만 접근하는 것을 처리하기 위해서 사용하고는 합니다.

 

저기 레지스터에 보시면 rdx가 218로 되어있는데 저는 이걸 0으로 처리해서 보내고 싶다고 가정해 보죠.

 

 

 

자 보시면 TlsGetValue로 점프하던 게 myfunc 쪽으로 점프를 하게 바꿔봤습니다.

 

 

 

보시면 Myfunc의 내용은 단순합니다.

mov rdx,0을 해주고 기존에 있던 TlsGetValue 쪽으로 점프를 하게 해 둔 것이죠.

즉 이런 식으로 사용을 할 수 있다는 뜻입니다.

 

 

스크립트 내용 자체는 다음과 같습니다.

단순하죠? DQ 라 함은 8바이트 주소를 선언할 때 사용하는 데이터 표시예요.

대충 기억해 둘 거만 보면 다음과 같습니다.

 

DB = 1Byte

DW = 2Byte 

DD = 4Byte 

DQ = 8Byte 

 

더 많기는 한데 웬만해선 잘 안 쓰이고 이거 4개만 기억해 둬도 됩니다.

자세히 알아보고 싶으신 분은 밑의 주소로 가서 한번 읽어보시길 바랍니다.

 

 

d, da, db, dc, dd, dD, df, dp, dq, du, dw(메모리 표시) - Windows drivers

지정된 범위의 메모리 내용을 표시하는 d* 명령에 대해 알아봅니다. 여러 옵션을 지정할 수 있습니다.

learn.microsoft.com

 

이 후킹 기술은 앞으로도 매번 등장할 것이고 이 기술을 어떻게 다루냐에 따라 리버싱 숙련도가

크게 달라질 거라 생각하기에 그 점을 염두에 두고 스크립트를 많이 짜보셔야 합니다.

스크립트도 많이 짜보면 짜볼수록 실력이 늘어나니까요. C, C++ 등 고급언어 소스 짜보는 거랑

결이 비슷하다고 봅니다.

 

다음번엔 다시 크랙미를 찾아서 분석해 보든 하는 시간 가져볼게요.

 

 

11. 크랙미 두 번째

쉬운 거부터 꾸준히 연습하자 처음부터 어려운 거 해봐야 벽만 크게 느끼고 돌아설 가능성이 높습니다. 그러므로 비교적 쉬운 거부터 확실하게 다루고 넘어가야 어려운 거에서도 자그마한 성과

poppintip.co.kr

 

728x90

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

12. 크랙미 세 번째 (파도콘)  (0) 2024.02.26
11. 크랙미 두 번째  (0) 2024.02.25
9. 크랙미 첫 번째  (0) 2024.02.23
8. API 함수를 통한 리버싱 & 크랙  (0) 2024.02.22
7. 치엔 게임 튜토리얼 Step 3  (0) 2024.02.20