Computer/Crack2009. 5. 22. 20:19


step 6까지 진행하며 약간 어려운 편에 속했던 내용들을 3D Pinball게임을 통해 복습해 보는 시간을 갖도록 하겠습니다.

3D Pinball게임을 실행하고 Cheat Engine으로 오픈 시킨후 ball개수를 저장하는 주소를 찾아 리스트 박스로 옮겨 줍니다. ball의 개수는 10개로 바꿔 주겠습니다.


0121AFAE번지를 오른쪽 마우스 클릭하여 'Find out what writes to this address'를 선택해 debugger를 붙여 줍니다. 그리고 다시 ball을 하나 잃어 어떤 코드가 공의 개수를 줄여주는지 찾아 보겠습니다.


'89 86 46 01 00 00'이군요. 저 코드를 선택해 주고 'Replace'를 클릭해 아무것도 하지 않는 코드로 바꿔주면 더 이상 볼의 개수가 줄어들지 않게 되겠죠? 우리는 포인터를 한번 찾아 보겠습니다. 'More information'을 클릭합니다.


이번에도 역시 우리가 주목할 부분은 붉은색으로 나타난 '>>010175b7 - mov [esi+00000146], eax'입니다. 그 아래에는 0121AE68이 우리가 찾아야 할 값이라고 친절하게 나와 있습니다. 이 값이 포인터가 가지고 있는 값이겠죠? 그럼 Cheat Engine으로 돌아가서 그 값을 찾아 보겠습니다.


346개의 결과가 나왔습니다. 그 중 녹색으로 나오는 주소값이 위에 2개 있군요. 주소값이 static일때 녹색으로 표시 됩니다. 그럼 둘 중 위의 주소값으로 먼저 확인해 보겠습니다.

'Add address manually'버튼을 눌러 포인터를 추가해 줍니다.


offset값은 146입니다. 기억 하시죠? '>>010175b7 - mov [esi+00000146], eax'이 우리가 찾은 코드였습니다. 0121AE68 + 146 = 0121AFAE로 이 값은 우리가 처음 찾아 놓은 주소값과 일치 합니다.

그럼 'OK'버튼을 클릭해 줍니다.


'P->0121AFAE'가 추가 되었습니다. 이 포인터가 우리가 찾던 포인터인지 확인해 보도록 하죠. 'Value'를 20으로 바꿔주고 freeze시킨 후 게임을 진행시켜 공을 잃도록 하겠습니다. 처음 찾아놓았던 주소의 'Value'도 자동으로 똑같이 바뀝니다.


아무리 해도 공의 개수는 변하지 않는군요. 성공입니다.

윈도우 사용자라면 대부분 가지고 있는 3D Pinball게임으로 간단한 포인터 찾기 연습을 해 보았습니다. 포인터에 대해 확실히 이해하고 넘어 가시기 바랍니다.

Posted by J.sean
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
Computer/Crack2009. 5. 19. 22:45


경우에 따라 어떤 데이터가 저장 되어 있는 장소는 프로그램을 다시 실행하거나 프로그램 실행중 바뀔 수 있습니다. 이런 경우에 쓸 수 있는 기술 하나를 step 5에서 배워 보겠습니다.

튜토리얼을 실행 시키고 step 5까지 진행 합니다.


'Change value'버튼이 있고 그 위에 100이 주어져 있습니다. 100이 저장되어 있는 장소는 튜토리얼을 실행할 때마다 바뀌게 됩니다. 수치는 'Change value'버튼을 누를때마다 바뀝니다.

Cheat Engine을 실행 시키고 튜토리얼을 오픈 합니다.


우선 100으로 검색을 시작해 보겠습니다.


50개의 결과가 나왔습니다. 튜토리얼로 돌아가 'Change value'버튼을 클릭 하겠습니다.


938로 바뀌는 군요. Cheat Engine으로 다시 938을 검색 합니다.


0096AB24라는 주소 하나가 남았습니다. 아래 리스트 박스로 옮기겠습니다.


자, 지금 까진 리스트 박스로 옮겨진 주소의 value값을 수정하여 문제를 풀어 왔습니다. 하지만 step 5에선 이 값을 아무리 바꿔주거나 freeze시켜도 소용이 없습니다. 튜토리얼 설명에선 충분히 빠른 속도로 이 값을 고정시켜 주면 step 5가 해결 될 수 도 있다고 하지만 단순히 'Frozen'체크박스를 클릭해 주는것 만으론 해결되지 않습니다. 아마도 프로그램 내부에서 'Frozen'보다 빠른 속도로 값을 체크하는것 같습니다. 보다 근본적인 해결책을 찾아 보도록 하죠.

우리가 리스트 박스에 넣은 0096AB24주소 항목을 오른쪽 마우스 클릭해 줍니다.


위 그림과 같이 여러가지 메뉴가 나오는데 그 중 'Find out what writes to this address'항목을 선택해 줍니다.


Cheat Engine의 debugger를 튜토리얼에 붙이겠냐는 말입니다. 'Yes'를 클릭해 줍니다.


'Yes'를 클릭하고 나면 위 그림과 같은 빈 윈도우가 나타납니다. 이 윈도우는 지금 부터 우리가 선택해 놓은 0096AB24주소에 무엇인가 기록을 시도 하는 코드를 찾아 줍니다. 그럼 다시 튜토리얼로 돌아가 'Change value'버튼을 클릭해 값을 바꿔 보겠습니다.


값이 304로 바뀌었습니다. 값이 바뀌었다는건 어떤 코드가 그 주소에 새로운 값을 대입했다는 뜻이므로 조금전에 생성된 윈도우에 기록이 남아 있겠죠? 포커스를 조금 전에 새로 생긴 윈도우로 다시 옮겨 가 보도록 하죠.


드디어 어떤 코드가 0096AB24번지에 기록을 시도 했는지 찾았습니다. '89 10'이라는 코드 였군요. 오른쪽 아래에 있는 'Stop'버튼을 눌러 추적을 멈추고 이 코드를 선택 해주면 오른쪽의 버튼들이 활성화 됩니다. 'Replace'를 클릭 해 우리가 리스트 박스에 선택했던 0096AB24번지에 새로운 값을 대입하는 '89 10'이라는 코드를 아무런 일도 하지 않는 코드로 대체 합니다.


Replace를 클릭하면 위와 같은 윈도우가 나오는데 새로 대체될 코드의 이름을 지어주는 것 입니다. 그냥 'OK'를 클릭해 줘도 상관 없고 특별한 이름을 지어줘도 됩니다. 'changed'라는 이름을 만들어 주도록 하겠습니다.


'OK'버튼을 클릭 합니다.


다시 이 윈도우로 포커스가 옮겨 갔습니다. 필요한 코드는 모두 찾아 해결 했으니 'Close'버튼을 눌러 닫아 줍니다.


다시 Cheat Engine으로 돌아 왔습니다. 겉보기엔 아무런 변화가 없어 보입니다. 하지만 우린 분명히 위에서 코드를 바꿔 주었습니다. 확인해 봐야 겠죠? 튜토리얼로 돌아가 'Change value'버튼을 클릭해 보겠습니다.


'Change value'버튼을 클릭했는데 값은 바뀌지 않고 'Next'버튼이 활성화 되었습니다. 우리가 위에서 0096AB24번지에 새로운 값을 대입하는 '89 10'이라는 코드를 아무런 일도 하지 않는 코드로 대체 했기 때문에 아무리 'Change value'버튼을 클릭해도 값은 바뀌지 않습니다.


cheat Engine으로 돌아가 화면 왼쪽 하단을 보면 위 그림과 같이 'Advanced options'라는 작은 버튼이 있습니다. 한번 클릭해 보겠습니다.


'Advanced Options'윈도우가 열립니다. 조금전 우리가 이름 지어준 'changed'가 있군요. 오른쪽 클릭해 보죠.


'changed'코드에서 disassembler를 열거나 원래 코드로 복원 하는등 여러가지 메뉴가 나옵니다. 실수로 엉뚱한 코드를 수정 했다면 여기서 복원이 가능합니다.

튜토리얼로 돌아가 'Next'버튼을 클릭하면 Step 6로 넘어갑니다.

Posted by J.sean