Assembly Fundamentals
1. 데이터 관리
데이터는 일반적으로 메모리에서 레지스터로 이동하는데, 이후 데이터가 다시 메모리로 이동되기 전 해당 데이터에 대한 작업이 수행된다.
이동하는데는 mov 명령어가 사용된다.
mov eax, ecx
mov eax, 1
// ecx 값을 eax로 이동하기. 값 1을 eax로 이동하기.
mov eax, dword ptr ds:[0x12345678]
// 메모리 주소에 저장된 데이터를 레지스터로 이동 (dword ptr ds)
lea eax, dword ptr ds:[ecx]
// 레지스터에 주소를 저장한 다음 해당 주소를 다른 레지스터에 로드하여 클래스 내의 특정 변수 검색
2. 데이터 변경
데이터가 레지스터에 로드되면 명령어를 통해 데이터를 수정하는 것도 가능하다.
inc eax
dec eax
inc나 dec 명령어로 레지스터의 값을 1씩 늘이거나 줄일 수 있다.
add eax, 2
add eax, ebx
sub eax, 4
add 및 sub 명령어를 사용하여 레지스터의 값을 더하고 뺄 수 있다.
mul 4
div 4
곱셈 및 나눗셈도 mul 및 div 명령어를 통해 가능하다. 해당 명령어들은 단일 값을 취하여 eax 에 저장된 값과 연산된다.
shl eax, 2
shr eax, 2
and eax, eax
or eax, ebx
xor eax, eax
레지스터에 저장된 값의 개별 비트를 조작할 때 사용하는 명령어이다.
왼쪽 혹은 오른쪽으로 이동 ( shl 및 shr )과 and , or 및 xor 작업이 포함된다.
3. 흐름 제어
메인 루프에서 기능을 탐색하기 위해 게임은 흐름 제어 명령을 다양하게 사용한다.
jmp 0x12345678
실행을 시작하기 위해 코드의 다른 섹션으로 점프. 게임 실행 위치를 영구적으로 변경
call 0x12345678
호출 명령. jmp와 다르게 게임 실행 위치를 일시적으로 변경
cmp eax, 2
test eax, eax
특정 작업 수행 여부를 결정하기 위해 레지스터 값을 다른 값과 비교 (cmp 및 test)
ex) 플레이어 hp가 0이 될 때 게임 종료 표시
cmp eax, ebx
jz 0x12345678
ebx와 eax가 서로 동일한 경우 해당 주소로 이동
+) 가장 일반적인 조건부 점프는 0일 때 점프( jz ), 0이 아닐 때 점프( jnz ), 같을 때 점프( je ), 같지 않을 때 점프( jne )이다. 특수 경우 jz 와 je는 동일한 것으로 간주될 수 있다.
4. 스택
레지스터 외에도 프로그램을 스택에 정보를 저장할 수 있다.
push 5
pop eax
push로 스택에 저장, pop으로 스택에서 호출
push 5
push eax
call 0x12345678
여러 입력이나 매게변수를 취할 수도 있으며 게임에서 호출 전 스택에 여러 값을 push할 수 있다.
push ebp
mov ebp, esp
sub esp, ...
...
leave
ret
// 대부분의 시작과 끝
처음 세개의 명령어는 함수 프롤로그라고 불리며 함수에 대한 스택 프레임을 설정한다.
각 함수에는 자체 스택 프레임이 있으며 마지막 두 명령어로 이전 함수의 스택 프레임을 복원하고 현재 함수를 호출한 함수로 돌아간다.
PRACTICE
mov eax, dword ptr ds:[0x12345678]
sub eax, 1
mov dword ptr ds:[0x12345678], eax
test eax, eax
jz 0x22222222
jmp 0x22222200
0x22222222: mov ecx, ebx
push 5
push ecx
call 0x45923821
0x12345678 -> 플레이어의 hp를 보유하는 메모리 주소
0x45923821 -> 텍스트를 화면에 인쇄하는 함수
1) 현재 플레이어의 hp를 eax에 로드
2) 해당 값을 1 감소
3) 플레이어의 hp로 다시 이동한 후 hp가 0인지 확인
4) 그렇지 않은 경우 섹션 위의 일부 코드로 다시 이동
5) hp가 0인 경우 스택에 푸시된 두 개의 매개변수가 있는 함수를 호출하는 아래 코드 섹션으로 점프
=> 플레이어의 hp를 확인하여 게임 오버 화면을 표시해야하는지 확인하는 역할을 담당하는 것으로 추측 가능