본 포스트는 게임 Wesnoth의 코드를 변경하여 골드가 소모되지 않도록 해킹하는 방법을 설명한다.
Wesnoth 게임과 Cheat Engine을 실행해주자.
Debugger를 이용해 Wesnoth게임을 디버깅할 것이다.
C:\ProgramData\chocolatey\lib\x64dbg.portable\tools\release\x32\x32dbg.exe를 실행하자.
Wesnoth게임은 32비트 프로그램이기 때문에 x32 디버거를 실행해야 한다.
x32dbg 첫실행화면이다.
우선 설정부터 만져주자.
설정 - 환경설정에 진입하여 TLS 콜백을 꺼주자.
파일 - 부착을 클릭하여 wesnoth.exe를 디버깅하자.
메인화면에 ntdll.dll의 실행코드가 뜬다.
아래쪽에 덤프는 wesnoth가 실행되고 있는 메모리를 나타낸다.
오른쪽 상단에는 레지스터와 레지스터 값을 볼 수 있다.
오른쪽 하단에는 wesnoth의 stack을 볼 수 있다.
기호(Symbol) 탭으로 이동하여 wesnoth.exe를 더블클릭해보자.
그리고 CPU탭으로 돌아오면 게임의 코드를 볼 수 있다.
자, 이제 Cheat Engine으로 들어가 골드가 저장되어 있는 변수의 주소를 알아내자.
주소 0x09F05E54에 저장되어 있음을 알 수 있다.
x32dbg로 돌아와 하단 덤프 영역에서 우클릭 후 이동(Go to...) - 표현식(Expression)을 클릭한다.
아까 Cheat Engine에서 찾은 골드가 저장된 변수의 주소를 넣어준다.
그럼 덤프영역에 주소 09F05E54에 저장되어 있는 값을 보여준다.
0x000002DC(Little Endian이므로)가 저장되어 있다.
현재 나의 골드는 732골드로 16진법으로 변환하면 정확히 일치함을 알 수 있다.
자, 이제 덤프영역에서 해당 주소를 우클릭하고 중단점(Breakpoint) - 하드웨어, 쓰기(Hardware, Write) - DWord를 클릭한다.
이는 해당 주소에 write operation이 일어나는 지점을 중단점으로 설정한다.
중단점 탭으로 이동해 중단점이 잘 설정되었는지 확인해주자.
Wesnoth 게임으로 돌아가 병력을 소집하여 골드를 소모해주자.
그 순간 게임이 freeze될 것이다.
이는 우리의 debugger에 중단점을 설정했기 때문이다.
Debugger로 돌아오면 cmp byte ptr ss:[ebp-385],0에서 코드 실행이 중단된 것을 알 수 있다.
참고로 EIP(Extended Instruction Pointer)는 program의 실행 위치를 나타내는 special purpose register다.
EIP위에 다음 코드가 보인다.
sub dword ptr ds:[edx+4],eax
병력을 소집할 때 위 코드가 실행되고 중단되었다.
아마 edx+4에 RAM에 gold가 저장되어 있는 변수의 주소가 들어있고, eax는 소집한 병력의 가격이 들어있지 않을까?
위 코드가 병력 소집 시 우리의 골드를 깎는 코드가 아닐까하고 합리적인 의심을 해본다.
해당 코드를 nop로 바꿔보자.
표현식은 debugger가 알아서 채워준다.
의심하지말고 확인.
NOP(no operation)가 채워진 모습이다.
이제 실행버튼을 눌러 게임으로 돌아가자.
그리고 병력소집을 해보자.
더 이상 병력을 소집해도 골드가 깎이지 않을 것이다.
해킹 성공.
'Cheating' 카테고리의 다른 글
Wesnoth 해킹하기 (5) Code Cave (0) | 2024.02.28 |
---|---|
Wesnoth 해킹하기 (4) Assembly 유추하기 (1) | 2024.02.27 |
Wesnoth 해킹하기 (2) Memory Scan (1) | 2024.02.27 |
Wesnoth 해킹하기 (1) 기본세팅 (0) | 2024.02.27 |
HxD 사용법 (1) | 2024.02.24 |