Wesnoth 해킹하기 (5) Code Cave
Wesnoth 해킹하기 (4) 편에서는 assembly어의 기능을 유추함으로써 인게임에서 terrain description, recruit, recall 등에 해당하는 assembly어를 찾을 수 있었다.
Wesnoth 해킹하기 (5)편에서는 code cave를 만들고 terrain description 진입 시 code cave를 실행하도록 만들 것이다.
그리고 code cave에는 999 골드를 주는 코드를 넣어 terrain description 진입 시 999 골드를 받을 것이다.
바로 시작해보자.
주소 0x134360E 번지로 내려가보자.
위와 같이 아무 의미없는 코드가 분포되어 있다.
프로그램의 코드는 항상 이런 빈공간이 있는데 우린 이 공간을 활용하여 code cave를 만들 수 있다.
Wesnoth 해킹하기 (4)편에서 아래 코드가 terrain description을 담당하는 코드임을 알아내었다.
opcode instruction
----------------------------------------
8B01 mov eax, dword ptr ds:[ecx]
8D7426 00 lea esi, dword ptr ds:[esi]
FF50 28 call dword ptr ds:[eax+28] // terrain description
B0 01 mov al,1
위 코드를 jmp 0x0134360E로 바꿔줄 것이다.
0x0134360E 번지는 우리의 code cave의 위치다.
위 코드를 아래와 같이 바꿔주자.
nop가 들어가는 이유는 opcode의 길이를 6바이트로 맞춰주기 위해서다.
opcode의 길이를 맞춰주지 않으면 게임이 충돌한다.
opcode instruction
----------------------------------------
E9 7F866700 jmp 0x134360E
90 nop
FF50 28 call dword ptr ds:[eax+28] // terrain description
B0 01 mov al,1
Assembly어를 바꾸는 방법은 다음과 같다:
바꾸고 싶은 assembly를 우클릭하고 Assemble을 클릭한다.
jmp 0x0134360E라고 입력하자.
잔존 바이트를 NOP로 채우기를 체크하면 알아서 opcode의 크기를 맞춰준다.
이제 code cave를 작성해보자.
우리의 code cave가 위치할 0x134360E로 이동해보자.
우클릭 후 이동 - 표현식을 이용하면 0x134360E로 편하게 이동할 수 있다.
0x134360E에 다음과 같이 작성하자.
pushad
mov dword ptr ds:[your gold address], 0x3E7 // our code cave codes
popad
mov eax, dword ptr ds:[ecx]
lea esi, dword ptr ds:[esi]
jmp 0xCCAF90
keypoint1
pushad와 popad는 각각 현재 레지스터값을 스택에 저장하고 꺼내는 어셈블리어다.
pushad와 popad 사이에는 우리의 gold를 조작할 코드가 들어간다.
keypoint2
mov dword ptr ds:[your gold address], 0x3E7
위 코드는 보유골드를 999골드로 바꿔주는 코드다.
keypoint3
mov eax, dword ptr ds:[ecx]와 lea esi, dword ptr ds:[esi]는 원래 terrain description 코드다.
우리가 이 2줄을 jmp 0x134360E로 대체했으므로 code cave에서 이 코드를 수행해주는 것이 안전할 것이다.
keypoint4
0xCCAF90은 code cave를 호출한 코드(jmp 0x134360E)의 다음 번지 주소다.