Computer/Crack2009. 5. 21. 20:56

지난 강좌에선 변수의 위치가 변하는 경우를 다루기 위해 Code finder를 공부했습니다. 하지만 Code finder만으로 변화하는 변수의 위치를 찾아내 값을 바꾸기는 힘듭니다. 그래서 포인터라는게 있는거죠. 포인터에 대해 잘 모르신다면 아래 링크에서 살짝 공부하고 오시기 바랍니다.

Win32 Api - Pointer

이번 강좌에서 어셈블리어를 꼭 알아야 할 필요는 없지만 알고 있다면 상당히 도움이 됩니다. 어셈블리어에 대한 기본적인 설명은 Cheat Engine help - Tutorials - Basic assembler에 나와 있습니다.

Basics of Assembler.rar

Assembler - The Art Of Assembly Programming In Win32.rar



Step 6는 Step 9의 기본이 되는 중요한 내용 입니다. 완전히 이해하고 넘어가시기 바랍니다. 그럼 Step 6에 대해 알아 보겠습니다.


100이라는 값이 주어져 있고 밑에는 'Change value', 'Change pointer'버튼이 있습니다. 이 값을 5000으로 고정 시켜야만 Step 6가 해결 됩니다. 'Change pointer'버튼은 문제 해결 마지막 순간에만 사용합니다. 해결 중간에 누르지 않도록 합니다. 그럼 Cheat Engine으로 튜토리얼을 오픈하고 값을 바꿔가며 주소를 찾은 후 그 변수의 주소를 리스트 박스로 옮겨 놓습니다. 지금까지 잘 따라 오셨다면 이 정도는 혼자 하실 수 있을 겁니다.


값은 836으로 바뀌었고 주소는 0096F3E4로 검색 되었습니다. 여기서 이 값을 5000으로 바꾸고 Freeze시켜도 문제는 해결되지 않습니다. 'Change pointer'버튼을 클릭 하면 변수의 주소가 변하면서 값이 바뀌기 때문입니다. 그래서 우리는 포인터를 찾아 그 포인터가 가리키는 주소의 값을 고정 시켜야 하는 것입니다. 그럼 우선 포인터를 찾아 보도록 하겠습니다. 리스트 박스에 찾아 놓은 주소에서 오른쪽 마우스 클릭을 하여 'Find out what writes to this address'를 선택하고 debugger를 붙여 줍니다. 이제 다시 값을 바꿔주면 어떤 코드가 값을 바꿨는지 찾아 주겠죠?


'89 10'이라는 코드가 잡혔군요. 저 코드를 더블 클릭하거나 코드를 선택해 주고 'More information'버튼을 클릭 합니다.


자세한 정보가 담긴 창이 열렸습니다. 붉은색으로 된 부분이 우리가 찾은 코드 입니다. 여기서 중요한 것은 '[', ']'사이의 값입니다. eax값은 아래에 다시 나와있습니다. 바로 밑에는 친절하게도 우리가 찾아야 할 값까지 말해 주고 있습니다. 그럼 다시 Cheat Engine으로 돌아가 0096F3E4라는 값으로 새로운 검색을 시작해 보겠습니다. 눈치 채셨는지 모르겠지만 이 값은 우리가 처음에 찾아 놓은 변수의 주소값과 일치 합니다. 0096F3E4는 16진수 이므로 'Hex'체크 박스를 클릭해 줘야 겠죠? 지금은 간단히 eax만이 '[', ']'사이에 있지만 식이 조금 더 복잡하게 나올 수 도 있습니다. 예를 들어 '[esi+12]'와 같이 나왔다면 우리가 검색해야 할 수치는 esi이고 offset 값은 12가 되는 것입니다. 잠시후 offset값을 입력해야 하는 상황이 나오니 잘 기억해 두시기 바랍니다.


00460C34번지가 검색 되는군요. 저 주소가 포인터의 주소입니다. 그럼 리스트 박스 오른쪽 위에 있는 'Add address manually'버튼을 클릭해 포인터를 추가 하겠습니다.


'Pointer'버튼을 클릭해 줍니다.


위 그림과 같이 창이 커지게 됩니다. 'Address of pointer'에 포인터의 주소를 넣어주고 'Offset (Hex)'에 오프셋 값을 넣어 주면 됩니다. 우리가 찾은 포인터의 주소와 오프셋 값을 넣어 주도록 하겠습니다. 우리의 offset값은 '0'입니다. 기억 하시죠? '[', ']'사이의 식이 offset값 0인 'eax'로 간단 했었습니다.


값을 모두 넣어주면 자동으로 포인터가 가리키는 주소값이 계산되어 나옵니다. 우리가 포인터의 주소값을 넣은 에디트 박스 바로 위에 'This pointer points to address 0096F3E4'라는 문장 보이시죠? 처음에 Cheat Engine리스트 박스에 찾아 넣어주었던 주소와 일치하는걸 확인할 수 있습니다.


그럼 'OK'버튼을 클릭해 포인터를 추가 합니다.


위 그림처럼 주소가 'P->0096F3E4'라는 포인터 목록이 추가 되었습니다. 이제 튜토리얼로 돌아가 'Chane value'버튼을 누르면 리스트 박스에 들어있는 2개의 value값이 똑같이 변하는걸 확인할 수 있을겁니다. 모든게 제대로 되었다는 뜻 입니다.


그럼 다음 step으로 넘어가기 위해 마무리 짓겠습니다. 'P->0096F3E4'주소의 'Value'를 5000으로 바꿔주고 'Frozen'체크 박스를 클릭합니다. '0096F3E4'의 'Value'도 같이 자동으로 변합니다.


튜토리얼로 돌아가 'Change pointer'버튼을 클릭합니다.


'You've got x seconds left to change the value to 5000'이라는 메세지가 나오고 사라진 후 'Next'버튼이 활성화 됩니다. 성공이군요. 'Next'버튼을 눌러 다음 step으로 이동합니다.

Posted by J.sean