1. 질문
6단계: 포인터: (PW=098712)
이전 단계에서 코드 파인더를 사용하여 위치 변경을 처리하는 방법을 설명했습니다. 하지만 이 방법만으로는 원하는 값을 설정할 주소를 찾기가 어렵습니다.
그래서 포인터가 있는 것입니다:
하단에는 2개의 버튼이 있습니다. 하나는 값을 변경하고 다른 하나는 값과 값의 위치를 변경합니다.
이 단계에서는 어셈블러를 알 필요는 없지만 알면 많은 도움이 됩니다.
먼저 값의 주소를 찾습니다. 주소를 찾으면 함수를 사용하여 이 주소에 액세스 하는 항목을 찾습니다.
값을 다시 변경하면 목록에 항목이 표시됩니다. 해당 항목을 두 번 클릭합니다. (또는 자세한 정보를 선택하여 클릭)하면 명령어가 실행되었을 때 발생한 일에 대한 자세한 정보가 포함된 새 창이 열립니다.
어셈블러 명령어에 '['와 ']' 사이에 아무것도 없는 경우 목록에서 다른 항목을 사용하세요.
그러면 필요한 포인터의 값이 무엇이라고 생각하는지 알려줄 것입니다.
기본 치트 엔진 창으로 돌아가서(원한다면 이 추가 정보 창을 열어둘 수 있지만, 닫으면 '['와 ']' 사이에 무엇이 있는지 기억하세요) 추가 정보에서 알려준 값에 대해 16진수로 4바이트 스캔을 수행합니다.
스캔이 완료되면 1개 또는 수백 개의 주소가 반환될 수 있습니다. 대부분의 경우 필요한 주소는 가장 작은 주소일 것입니다. 이제 '수동으로 주소 추가' 버튼을 클릭하고 포인터 확인란을 선택합니다.
창이 변경되어 포인터 주소와 오프셋을 입력할 수 있습니다.
방금 찾은 주소를 입력합니다. 다음과 같은 형식일 수 있습니다: “Tutorial-i386.exe"+xxxxxx(프로세스 기준),
또는 주소를 두 번 클릭하여 주소 목록에 추가하고 거기에 표시되는 절대 주소를 사용할 수 있습니다.
어셈블러 명령어 끝에 계산(예: [esi+12])이 있는 경우 주소 필드 위의 끝에 있는 값을 입력합니다. 이것이 오프셋입니다. 그렇지 않으면 0으로 둡니다. 더 복잡한 명령어인 경우 다음 계산을 살펴보세요.
더 복잡한 인스트럭션의 예시:
[EAX*2+EDX+00000310] eax=4C 및 edx=00801234.
이 경우 EDX는 포인터의 값이고 EAX*2+00000310은 오프셋이므로 입력해야 할 오프셋은 2*4C+00000310=3A8이 됩니다. (이 값은 모두 16진수이며, 16진수 값을 계산하려면 Windows에서 프로그래머 모드의 calc.exe를 사용합니다.)
튜토리얼로 돌아가서 확인을 클릭하면 주소가 추가됩니다. 모든 것이 제대로 되었다면 주소에 P->xxxxxxx가 표시되며, xxxxxxx는 찾은 값의 주소입니다. 그렇지 않다면 뭔가 잘못한 것입니다.
이제 5000에 추가한 포인터를 사용하여 값을 변경하고 '활성'을 클릭하여 고정합니다. 그런 다음 포인터 변경을 클릭하고 모든 것이 올바르게 진행되면 다음 버튼이 표시됩니다.
추가:
포인터 스캐너를 사용하여 이 주소에 대한 포인터를 찾을 수도 있습니다
값을 5000으로 수정하고, change pointer 버튼을 눌렀을 때 값이 변하지 않도록 해야 이번 단계를 통과할 수 있다.
지금까지 튜토리얼은 값을 저장한 변수를 바로 수정하면 통과할 수 있었지만 이번 단계는 단순히 변수의 값을 수정해서는 통과할 수 없다. 포인터가 값을 변경하기 때문에 이 포인터를 찾아 5000이라는 값을 가리키도록 해야 한다.
2. 분석 과정
2.1. 변수 값을 바꿔보기
먼저 단순히 변수의 값을 5000으로 바꿔서 step을 통과할 수 있는지 확인해 보자.
시작 값이 100이므로 100으로 first scan을 실행합니다.
Change value 버튼을 눌러 값을 수정해 본다.
변수를 찾아 주소목록에 추가한다.
그런 다음 값을 5000으로 바꾸고 change pointer 버튼을 눌러보았다.
하지만 값은 고정되지 않고 바뀌어버린 것을 볼 수 있었다.
포인터는 그대로 있기 때문에, 포인터에서 변수에 접근하여 값을 바꾸었기 때문이다.
2.2. 값을 바꾸는 포인터를 찾기
이렇듯 변숫값을 바꾸기만 해서는 step을 통과할 수 없으므로 포인터를 찾아야 한다.
그렇다면 포인터를 찾기 위해서는 어떻게 해야 할까?
포인터는 계속해서 값을 바꾸기 위해 변수에 접근하므로 이 변수에 접근하는 목록을 볼 수 있다면 포인터를 찾을 수 있을 것이다.
그러기 위해서는 치트엔진의 [find out what writes to this address] 메뉴를 이용한다.
Change pointer를 눌렀다면 주소가 바뀌었으므로 다시 값을 가리키는 변수를 찾은 다음 진행한다.
다시 한번 change value 버튼을 누른다.
아래와 같이 목록이 하나 생성되는데 이것이 change value 버튼을 눌렀을 때 실행되는 코드이다.
코드를 더블클릭 해보자.
Mov [rdx], eax : eax의 내용을 rdx값을 주소로하여 그곳에 저장하라는 의미이다.
그림으로 표현하면 우리가 찾아야 하는 것은 바로 “?”값이 된다.
오프셋이 없으므로 “014D80E0” 값 그대로 저장한 변수가 있을 것이다. firstscan기능을 이용하여 찾아본다. 주의할 점은 주소값이므로 반드시 “hex”에 체크하고 검색해야 한다.
값이 하나 나온다. 바로 우리가 찾는 포인터이다. 더블클릭하여 주소목록에 추가해 준다.
이제 이 포인터의 동적 주소 변화를 추적하여 계속해서 5000을 가리키도록 한다.
추가한 주소를 더블클릭하여 change address 창을 띄운다.
Hesadecimal 옵션은 값을 16진수로 표현할 것인지를 선택하는데, 편하게 하기 위해 체크해제한다.
그리고 pointer를 체크하여 포인터를 추적하도록 한다.
성공적으로 생성했다면 p->라는 표시가 생긴다.
Value를 더블클릭하여 5000으로 값을 바꿔준다.
Active 옵션에 체크해 값을 고정시킨다.
이제 change pointer 버튼을 눌러 확인해 보자.
Next버튼이 활성화되었다면 성공한 것이다.