이전 포스트에서는 메모리 변수를 이용해서 골드를 해킹했지만, 더 복잡한 해킹은 게임의 코드를 수정해야한다.
(ex. 골드없이 용병모집)
지속적으로 금을 모니터링하고, 유닛을 모집할때마다 수동으로 금을 늘리는것 또한 게임에 추가되는 새로운 유닛과 해당 유닛의 비용을 지속적으로 찾아야함
게임의 코드를 실행중에 보는 것을 디버깅이라 하고, 그 코드를 이해하고 수정하여 원하는것을 수행하는것을 리버싱이라함.
디버거는 의도하지않은 부작용을 일으킬 수 있다.
→ 게임의 코드를 잘못 수정하면 충돌이 나거나, 게임에 따라 컴퓨터 디스플레이가 정지될 수 있다. 해킹 기계와 개인용 기계를 분리 해야하는 이유이다.
중단점
메모리 중단점
→ BP(Break Point)는 아니고 하나의 분석 방법이다. 실행되는 어떤 코드도 변경하지않으며, 특정 메모리를 주시하거나 분리 할 수 있다는 장점을 가짐
동작 방법
- 특정 메모리에 메모리 브레이크 포인트를 설정
- 특정 메모리의 권한이 변경되어 보호 권한이 설정됨
- 메모리에 대한 접근이 발생했을경우 CPU에서 보호 페이지 디버그 예외처리를 발생시킴
- 해당 디버그를 통해 메모리 분석
해당 내용 -> https://dool2ly.tistory.com/76
코드 중단점
→ 텍스트 참조기능을 이용하여 중단점을 설정하고 최상위 함수를 찾는것이 일반적
이경우 월핵으로 예시를 들 수 있는데,
벽을 만드는 텍스쳐를 nop로 설정하고 벽을 안보이게 만들 수 있다.
게임 코드 변경
-> Wesnoth 1.14.9 유닛 모집 금 감소 루틴 무효화
첫번째 단계는 금의 주소를 찾는것이다. DMA라는 프로세스로 이전과는 다른 주소일것이다.
새 골드 주소를 찾으면 치트엔진을 닫되, wesnoth게임은 열어두자
"0x13F52E54" 주소이다.
다음 단계로 x32DBG에서 attach하기
게임의 코드를 보기 위해선 기호 탭으로 이동해서 wesnoth.exe를 클릭해야한다.
게임의 코드와 메모리 공간으로 시야가 전환된다.
디버거 설정
x64dbg의 설정은 우리가 원하지 않을때 멈추게(?) 된다.
이번 실습과 향후 실습을 위해 이런 설정을 끄자
중단점 설정
금 위치에 중단점을 설정한다. 이러면 웨스노스로 돌아가서 부대를 모집하게 되면 중단점이 터지고 실행이 일시 중지 될것이다.
값에 중단점 → 하드웨어,쓰기 → DWORD 선택
이렇게 하면 메모리 주소에 조건부 중단점이 설정된다.
이제 다시 부대를 모집하면
"0x7CCDA1"에서 중단점이 걸리게 된다.
다른부분은 중요하지않고 sub에 관련한 부분만 보면 [edx+4]에서 eax만큼 빼고있다.
그리고 eax는 용병 모집 가격인 0x15를 빼고있다. 이 작업이 금에 영향을 미치고 있으니 코드를 바꿔야 한다.
"sub dword ptr ds:[edx+4], eax"를 nop로 바꾸고 중단점을 풀고 실행하게 되면 모집할때마다
우리의 금이 줄어드는일은 없을것이다. 해당 코드로 가서 ‘space’를 입력하면 코드를 변경할 수 있다.