후킹 외에도 존재하는 기술
여태껏 글들을 쭈욱 살펴보시면 후킹을 안 쓴 곳이 거의 없을 정도로 엄청나게 많은 곳에
사용을 했습니다. 하지만 직접 Thread를 호출해야 할 때가 있는데 이는 후킹으로 하기에는
좀 힘든 감이 없지 않아 있습니다.
이 경우엔 말 그대로 함수 호출이라는 방식을 사용할건데 어려운 편은 아닙니다.
그 호출하는 함수 개형에 맞게 Parameters 등을 넣어주고 그대로 호출을 해주면 돼서
익히고 나면 또 다른 강력한 무기가 될 것입니다.
이 호출이라는 기술도 필요한 이유가 메모리 CRC 등으로 인하여 메모리를 직접적으로
건드릴 수 없을 때 사용할 수 있는 방법이기에 그렇습니다.
개념만 익히는 거라 그냥 쉬운 걸로 선택하겠습니다.
만드는 과정
지난 시간에 봤었던 화면 밝기 조절을 이용하여 해 볼 건데요.
못 보셨다면 밑의 링크를 타고 가셔서 간단하게 읽어봐 주세요.
이 글에서 사용한 방법은 말 그대로 밝기 부분을 정의하는 실수형인 25.00을 직접 건드려서 했었습니다.
그렇지만 이 25.00 부분에 CRC가 돌아서 변조를 직접 할 수 없을 경우엔 건드릴 수가 없을 겁니다.
물론 CRC 우회하는 게 제일 베스트 판단이지만 그 과정은 매우 험난할 거기에...
그럴 때 사용하는 게 바로 이 호출이라는 개념입니다.
우선 보시면 FPU 레지스터에 25.00이라는 실수를 넣고 밑에 바로 call 하는 함수가 있습니다.
이 call 하는 함수를 통해서 밝기 조절이 켜진다고 볼 수 있어요. 그렇다면 말 그대로 이 함수에
맞게끔 인자들을 끼워 맞춰주고 호출을 하면 켜질 거라고 볼 수 있습니다.
우선 이 부분에 디버깅을 걸어줍니다.
이런 식으로 디버깅이 걸렸을 때 이 모든 레지스터들을 다 끼워줘야 되느냐 하면 그건 아닙니다.
밑의 call 함수에서 어떤 레지스터들을 사용하는지를 보고 필요한 것들만 끼워주면 됩니다.
자 보아하니 사용되는 레지스터는 rbx와 rcx 2가지가 되겠네요.
스택 부분도 맞춰야 되는 게 아니냐 할 수 있는데 저희가 직접 호출하는 거라 스택은 크게 상관없습니다.
강제로 호출하고 리턴으로 빠져나가게끔 스택의 크기 할당만 해주면 문제가 전혀 없다는 거죠.
rbx = 15FD03C5D40
rcx = 15FFCE58040
이렇게 2가지를 확인했습니다. 물론 이 레지스터 2개가 어디 포인터에서 담기는지까지 파악해서
포인터식으로 짜면 매번 디버깅을 해서 레지스터에 들어가는 값을 구할 필요는 없는데 그 부분은
여기서는 생략하겠습니다. 다른 부분에서 해볼 수 있으면 진행을 해볼게요.
우선 스크립을 대충 짜주면 다음과 같습니다.
CreateThread(내가 만든 공간)으로 내가 만든 공간을 임의로 호출할 수 있습니다.
기억해 두시면 좋습니다. Cheat Engine을 다루시다 보면 한 번은 무조건 쓸 일이 있을 거예요.
그러면 이렇게 짠 게 잘 되는지를 한 번 확인해야겠죠?
영상을 확인해 보시면 밝기 조절인 25.00 이 부분은 그대로 내버려두었습니다.
즉, 메모리 변조를 전혀 하지 않은 상태에서 내가 원하는 방향으로 만들어낸 것입니다.
메모리 변조나 후킹을 꼭 하지 않아도 이렇게 적용을 할 수 있는 방법이 있다는 것은 참 좋은 방법이죠.
함수 호출을 하기 위해서는 꼭 그 함수에 맞는 Parameters 들을 넣어줘야 문제없이 작동이 됩니다.
잘못 끼워 넣으면 Crash 나서 클라이언트가 꺼질 거예요.
아이템을 먹는다던가 이런 부분들도 함수 호출 형식으로 진행할 수 있습니다.
나머지 부분들은 한 번 직접 도전하시는 것도 괜찮을 것 같습니다~
'Reversing & Cheat Engine' 카테고리의 다른 글
26. 재유행 하는 메운디 주작 해보자 (0) | 2024.03.11 |
---|---|
25. 코드 난독화 & 가상화 (0) | 2024.03.10 |
23. 간단한 게임 치트 도전 - 좌표 장난 (1) | 2024.03.08 |
22. 간단한 게임 치트 도전 - 밝기 조절 (0) | 2024.03.07 |
21. 간단한 게임 치트 도전 - 월핵(d3d11) (1) | 2024.03.07 |