1.질문
이 7단계: 코드 인젝션: (PW=013370)
코드 삽입은 대상 프로세스에 코드를 삽입한 다음 직접 작성한 코드를 실행하도록 코드 실행 경로를 변경하는 기법입니다.
이 튜토리얼에는 체력 값과 클릭할 때마다 체력이 1씩 감소하는 버튼이 있습니다.
여러분의 임무는 코드 삽입을 사용하여 버튼을 클릭할 때마다 체력이 2씩 증가하도록 만드는 것입니다.
주소를 찾는 것부터 시작해서 그 주소에 쓰여진 내용을 찾습니다.
그런 다음 체력을 감소시키는 코드를 찾으면 디스어셈블러에서 해당 주소를 찾아 자동 어셈블러 창을 엽니다(Ctrl+A).
템플릿을 클릭한 다음 코드 삽입을 클릭하고 생명력을 감소시키는 주소를 입력합니다(아직 올바르게 입력되지 않은 경우).
그러면 코드에 사용할 수 있는 기본 자동 어셈블러 인젝션 프레임워크가 생성됩니다.
과거 윈도우 2000 이전 시스템에서는 메모리에서 코드 케이브(게임에서 사용하지 않는 메모리 영역)를 찾아야 했지만 윈도우 2000 이후에는 다행히도 과거의 일이 되었고, 요즘에는 XP의 SP2와 새로운 CPU의 NX 비트로 인해 사용하려고 할 때 오류가 발생할 수 있으므로 코드 케이브를 위한 메모리 블록을 할당하는 alloc을 주목하세요.
또한 newmem: 및 originalcode: 줄과 “여기에 코드를 입력하세요”라는 텍스트가 보입니다.
짐작했듯이 여기에 체력을 2로 증가시키는 코드를 작성하세요.
이 경우 유용한 어셈블러 명령어는 “ADD 명령어”입니다.
다음은 몇 가지 예시입니다:
“ADD [00901234],9"는 00901234 주소를 9로 증가시킵니다.
“ADD [ESP+4],9"는 ESP+4가 가리키는 주소를 9로 늘립니다.
이 경우 괄호 사이에 원래 코드와 동일한 것을 사용하여 체력을 감소시켜야 합니다.
주의하세요:
원래 코드 섹션에서 체력을 감소시키는 줄을 삭제하는 것이 좋습니다. 그렇지 않으면 3으로 체력을 증가시켜야 하므로(3으로 증가하면 원래 코드는 1로 감소하므로 최종 결과는 2로 증가) 혼란스러워질 수 있습니다. 하지만 이는 모두 여러분과 여러분의 프로그래밍에 달려 있습니다.
참고 2:
일부 게임에서는 원본 코드가 여러 명령어로 존재할 수 있으며, 항상 그런 것은 아니지만 다른 위치의 코드가 점프 명령어 끝으로 점프하여 알 수 없는 동작이 발생할 수 있습니다. 이런 경우 일반적으로 해당 명령어 근처에서 점프 부분을 찾아서 수정하거나 다른 주소를 사용하여 코드 삽입을 수행해야 합니다. 삽입된 코드 내부에서 변경할 주소를 알아낼 수만 있다면 됩니다.
- Step 7을 통과하기 위해서는 hit me 버튼의 기능을 값 1 감소에서 값 2 증가로 바꾸어야 한다.
- 코드 인젝션 기능을 사용해야한다.
2. 분석 과정
우선 해당하는 코드의 주소를 찾기 위해 first scan으로 100을 찾은 다음, health를 감소시켜 감소된 값이 있는 주소를 찾는다.
Hit me를 눌러 health를 감소시켜 그 감소하는 변수를 추적한다.
0016B5F0를 주소목록에 추가하여 이 주소에 접근하는 목록을 추적한다.
방법은 step 6에서 했던 것 처럼 “Find out what writes to this address” 창을 연 채로 hit me 버튼을 한번 눌러 접근하는 목록을 추적한다.
아래 코드가 바로 그것이다. Show disassembler 버튼을 클릭하여 어셈블리 코드창을 띄운다.
그럼 이렇게 주소 순서 대로 어셈블리 코드를 보여준다.
이제 코드를 수정하기 위해 Auto assemble 기능을 사용한다. 커서를 그대로 두고 Ctrl+A를 누르거나, Tools -> Auto Assemble 메뉴를 클릭한다.
그러면 이렇게 아래 창이 뜬다.
코드인젝션 메뉴가 바로 보이지않아 약간 당황했는데, Template – code injection 이다.
OK버튼을 누른다.
originalcode : 부분의 내용을 수정하면 된다.
sub dword ptr [rsi+000007E0], 01
- Sub : substract = 빼다를 뜻하는 영단어의 줄임말이다.
- Dword ptr : 이 메모리 주소에서 4byte 크기의 데이터를 참조한다는 의미이다.
- [rsi+000007E0] : rsi 레지스터에 0x7E0을 더한 위치에 있는 메모리 주소를 가리킨다.
- 01 : 얼마를 뺄 것인지 나타낸다. 여기서는 1 이다.
즉 : 이 코드는 rsi 레지스터에 있는 주소에 0x7E0을 더한 메모리 위치에서 4바이트 값을 읽어오고, 그 값에서 1을 뺀 다음, 그 값을 다시 동일한 메모리 위치에 저장한다.
그래서 버튼을 클릭할 때 체력이 2 씩 증가하도록 바꾸려면
- Sub -> add
- 01 - > 02 로 바꾸어 주면 된다.
아래와 같이 수정한다.
Execute 버튼을 누르고 확인.
Hit me 버튼을 누르면 98에서 값이 2 증가해 100이 되고, Next 버튼이 활성화 된 것을 확인 할 수 있다.