안경잡이개발자

728x90
반응형

치트 엔진(Cheat Engine) 튜토리얼(Tutorial) 6단계

나동빈


  이번 시간에는 치트 엔진 튜토리얼 6단계를 함께 풀어보도록 하겠습니다. 6단계는 포인터(Pointer)를 활용하여 푸는 문제입니다.


※ 포인터의 개념 알아보기 ※


  포인터 변수란 컴퓨터 메모리 주소를 저장하는 변수를 의미합니다. 메모리 주소를 저장하는 이유는 나중에 특정 메모리 주소에 빠르게 접근하여 값을 변경하거나 활용할 수 있기 때문입니다. 말 그대로 메모리 주소만 저장하고 있다는 점이 특징입니다.


  총 세 개의 변수가 있다고 해봅시다. 포인터 변수가 하나 있고, 정수형 변수가 두 개 있습니다. 포인터 변수는 특정한 변수를 가리키는 역할을 수행한다고 했습니다. 따라서 처음에는 7이라는 값을 가지는 변수의 주소인 0x8A91A983이라는 값을 가지고 있다고 해봅시다.



  이 상황에서 7이라는 값을 다른 값으로 변경하지 않고, 어떠한 유의미한 값을 15로 변경하고자 한다면 포인터 변수의 값만 바꾸어주면 될 것입니다. 왜냐하면 현재 15라는 값을 가지고 있는 변수가 따로 존재하니까요.



  컴퓨터는 메모리(RAM) 내부의 특정한 주소로 바로 접근할 수 있다는 점에서 이렇게 메모리의 주소 값만 잘 저장해 놓으면 특정한 변수에 빠르게 접근할 수 있습니다. 이게 바로 포인터의 기능인데요. 바로 포인터 변수가 저장하고 있는 값을 0x9B8371AA로 바꾸었다고 해봅시다. 그러면 바로 15라는 값에 접근할 수 있는 것입니다.



  결과적으로 7과 15라는 값은 전부 그대로 있는 상태에서, 포인터 변수의 값만 바꾸어서 다양한 처리를 할 수 있는 것입니다.


※ 6단계 문제 풀기 ※


  이제 6단계 문제를 풀어봅시다.


  문제 요약: 'Change value' 버튼은 포인터가 가리키고 있는 변수의 값을 바꾸는 버튼입니다. 'Change pointer'는 포인터의 값을 바꾸는 버튼입니다.



  일단 바로 현재의 값이 100이므로 스캔을 해봅시다.




  값을 바꾸어 본 뒤에 다시 스캔하는 방식으로 특정 변수를 찾아서 주소 리스트에 등록해 봅시다.




  이제 결과적으로 값을 바꿀 때마다 바로 주소 리스트에 반영되는 것을 알 수 있습니다.




  다만 'Change pointer' 버튼으로 포인터의 값을 바꾸는 경우에는 주소 리스트에서 해당 값을 추적하지 못하는 것을 알 수 있습니다.





  따라서 일단 다시 한 번 다음과 같이 변수를 찾아봅시다.



  이번에는 'Find out what accesses this address'를 눌러 어떠한 포인터 변수가 해당 변수를 참조하고 있는지 확인해보도록 합시다.




  값을 변경했을 때 다음과 같이 mov [edx], eax라는 기계어가 색출되는 것을 확인할 수 있습니다.



  여기에서 [ 어떠한 값 ]의 형태는 '어떠한 값'이 가르키고 있는 주소의 값에 접근하겠다는 의미입니다. 다시 말해서 edx 레지스터에 저장된 값에 해당하는 메모리 주소에 접근한 뒤에, 그곳에 eax 레지스터에 저장된 값을 넣어주겠다는 소리입니다.



  따라서 우리는 '016D5F48' 라는 값을 저장하고 있는 포인터 변수가 있다는 사실을 추측할 수 있습니다.




  결과적으로 포인터 변수를 찾은 모습입니다.



  포인터 변수를 찾은 뒤에는 'Add Address Manually'를 눌러 수동으로 포인터 변수를 등록할 수 있습니다.



  포인터 변수로 생성해줍니다.



  그러면 결과적으로 포인터 변수가 가리키는 변수의 값을 성공적으로 추적하는 것을 알 수 있습니다.



  이 값을 5000으로 만들어 준 뒤에 'Active' 체크박스를 클릭하여 값을 강제로 고정해봅시다.




  그럼 이제 포인터 변수의 값을 바꾸려고 해도 계속해서 동일한 위치를 가리킨다는 점에서 값이 유지되는 것을 알 수 있습니다.



  이렇게 6단계까지 풀어보았습니다.


728x90
반응형