33. Cheat Engine Tutorial 6
본문 바로가기
Reversing & Cheat Engine

33. Cheat Engine Tutorial 6

by boosting 2024. 3. 18.
728x90

Step 7은 Code Injection(Hooking)

사실 표현이 Code Injection이지 Hooking이란 개념이랑 크게 다를건 없습니다.

결국 타겟 프로세스에서 원하는 지점에다가 내가 원하는 코드 흐름을 집어 넣는 기술이죠.

일단 문제가 무엇을 요구하는지 한 번 봐야겠죠?

 

튜토리얼

 

또 체력 가지고 노는거 같은데 이 쯤 되면 그냥 미리 체력 값을 찾아둡시다..

이번에는 1씩 감소를 하는 모습을 보이고 있습니다. 이제 이런 부분 찾는건 따로 언급 안하기로

했으니 다들 찾으셨을거라 생각하고 넘어가겠습니다.

 

일단 문제에서 요구하는 부분은 체력이 현재 1씩 감소하고 있는데 이 부분을 2씩 증가하는

방식으로 바꾸라고 합니다. 이게 Hook까지 필요한 내용인지는 모르겠는데 한 번 보겠습니다.

 

튜토리얼

 

우선 Find out accesses를 걸었을 때 나오는건 다음과 같습니다.

일단 명령어들만 쭉 보면 3개는 [rsi+7E0]을 옮겨주는 역할이고 1개는 핵심인 빼기 연산을 하는 곳이고

1개는 0일때 비교해서 아마 체력 100으로 리셋해주는 역할이겠죠.

건드려야 될 곳은 빼기 부분이니까 저기 부분을 봅시다.

 

튜토리얼

 

이런식으로 되어 있긴 한데 이거를 그냥 add dword ptr [rsi+7E0],02로 어셈 자체를 바꿔도 아마 상관이

없지 않나 싶은데.. 한 번 바꿔보겠습니다. 굳이 후킹을 할 필요가 없어보이거든요 아무리 봐도..

 

튜토리얼

 

네 맞네요.. 굳이 후킹을 안해도 어셈을 이렇게 add 연산으로 돌려버려도 문제 없긴 합니다.

또 다른 방식도 있습니다. sub 명령어에다가 음수를 빼는겁니다.

 

튜토리얼

 

이렇게 해도 98에서 100으로 2 증가한 모습을 보실 수 있습니다. 이건 후킹이 필요가

없는 대목인데 굳이 요구를 하는 이유를 모르겠네요.. 아무튼 요구한대로 후킹을 짜보죠.

 

튜토리얼

 

일단 이렇게 짰습니다. 간단하게 해석 해봅시다.

 

Alloc이라 함은 내가 원하는 코드를 삽입할 공간을 선언해주는 것입니다. 그래야 코드를 작성하죠.

뒤의 숫자 128은 128Byte만큼 그 공간의 크기를 할당하겠다는 뜻입니다. 만약 코드가 길어진다면

공간의 크기를 늘려야겠죠? addhook은 제가 임의로 정한 공간의 이름입니다. 맘대로 해도 됩니다.

 

 

RegisterSymbol은 addhook이라는 공간을 심볼화 시켜주는 것입니다.

저렇게 공간을 선언하고 난 뒤에 공간이 잘 만들어졌는지 확인 하려고 주소창에 addhook을 써도

인식을 못하는데 심볼화를 해주고 나면 addhook을 써도 인식을 하여 그 주소로 가줍니다.

 

그 다음 밑의 주소의 경우 Hooking을 할 지점을 작성합니다. 저는 sub 명령어 쪽에다가

타겟을 잡았습니다. 살짝 위 or 아래로 잡을 수도 있습니다. 밑의 addhook은 내가 원하는

코드를 작성하는 공간입니다.

 

여기서 그냥 add 명령어 하나만 써주면 되는거 아닌가라는 의문이 들 수 있겠습니다.

하지만 그렇게 하게 될 경우 프로그램이 크래쉬 나게 될 것입니다. 왜냐하면

Hooking을 하게 될 경우 83 AE E0 07 00 00 01 48 8D 4D F8 E8 A9 B3, 즉 14Byte의 메모리를

변경을 하게 됩니다.

 

튜토리얼

 

명령어로 따지면 이 부분이 jmp xx로 변경이 된다는 얘기입니다.

그러니까 실행이 되어야 하는 어셈 명령어들도 깨져버려서 실행을 못하는 상황이 되죠.

그게 필요 없는 명령어라 정상적으로 작동이 될 수도 있겠지만 대부분 크래시가 납니다.

그러기에 내가 원하는 코드를 삽입해준 뒤, 그 코드 부분을 제외한 나머지 부분들은 다시

뒤에 작성하여서 최대한 흐름을 안 깨게 만드는 것입니다.

그리고 난 뒤에 이 call 명령어까지 실행을 했으면 다음 주소로 넘어가야 흐름이 완벽하게

돌아가겠죠? 그래서 마지막에 jmp Tutorial-x86_64.exe+2DB67를 넣어서 원래의 흐름으로

빠져나가게끔 만드는 것입니다. 

 

자 저대로 작성을 한 뒤 Execute를 눌러보겠습니다.

튜토리얼

 

이렇게 jmp로 바뀌면서 어셈 개형이 깨졌습니다. 그렇기에 저런 복구 작업이 필요한 것입니다.

단, 64Bit 프로그램에선 14Byte에 해당하는 길이를 변경하지만 32Bit 프로그램에선 5Byte에 해당하는 길이를

변경하게 되기에 그 부분만 유의 하셔서 복구 코드를 작성 하시면 되겠습니다. jmp addhook으로 넘어가보겠습니다.

 

튜토리얼

 

addhook으로 넘어왔을 때 기존의 sub 명령어를 add로 바꿔치기 해놓은 것 외에는 정상적인 흐름으로

만들어 놨습니다. 그러면 코드가 잘 실행 되어지는지 확인을 해봐야겠지요? 아까 100이었으니 102가 되면 됩니다.

 

튜토리얼

 

102가 된것을 확인 함으로써 잘 되는것을 확인할 수 있었습니다.

Hooking의 경우도 크게 어려운건 없습니다.

'내가 원하는 코드 흐름을 집어넣고, 바이트 패치로 깨진 어셈들 복구만 해서 최대한 흐름을 깨지 않게 진행하기'

이게 핵심입니다. 

728x90

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

35. Cheat Engine Tutorial 8  (0) 2024.03.20
34. Cheat Engine Tutorial 7  (0) 2024.03.19
31. Cheat Engine Tutorial 4  (0) 2024.03.16
30. Cheat Engine Tutorial 3  (2) 2024.03.15
29. Cheat Engine Tutorial 2  (0) 2024.03.14