안경잡이개발자

728x90
반응형

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

나동빈


  이번 문제는 다중 포인터(Multi-level Pointer)를 바르게 이해하고 있는지를 물어보는 문제입니다. 지난 번에는 단순히 하나의 포인터만이 사용되었지만 이번 문제에서는 여러 개의 포인터가 중첩되어 있습니다.


  문제 요약: 특정한 변수를 가리키는 포인터의 포인터의 포인터의 포인터의 포인터를 찾아내어 값을 5000으로 고정시킵니다.


※ 그림 요약 ※


  현재 5중 포인터가 사용되는 상태인데 그 대표적인 예시를 그려보면 다음과 같습니다.




  바로 문제를 풀어보도록 합시다. 현재 변수의 값은 2227입니다. 따라서 2227을 값으로 가지는 변수를 검색합니다.



  이후에 변수가 발견되면 바로 주소 리스트에 등록합니다.



  이후에 어떠한 포인터가 해당 변수를 가리키는지 Find out what accesses this address를 눌러 확인합니다.



  이제 값을 바꾸어서 확인해 봅시다.



  결과적으로 다음과 같이 mov [esi+18], eax 라는 기계어가 수행되는 것을 확인할 수 있습니다. 이는 esi 레지스터가 가지는 값에 18을 더한 메모리 주소에 eax 레지스터의 값을 넣겠다는 의미입니다. 즉 어떠한 포인터 변수가 esi 값 정보를 저장하고 있는 것입니다.




  따라서 위와 같이 레지스터의 값을 어떠한 포인터 변수가 가지고 있는지 확인합시다.



  포인터 변수를 위와 같이 발견했으므로 바로 다시 주소 리스트에 추가합니다.



  마찬가지로 다시 해당 변수의 주소를 참조하는 포인터 변수를 찾아봅시다.




  이번에는 위와 같이 mov, esi, [esi] 라는 어셈블리어를 확인할 수 있습니다. 우리는 이미 포인터 변수의 주소를 다른 포인터 변수가 가지고 있다는 것을 알고 있습니다. 다시 말해서 위 명령어는 이중 포인터를 의미하는 명령어인 것입니다.


  따라서 다음과 같이 0173D5D0 이라는 값을 가지는 변수를 검색하면 됩니다.




  그러면 결과적으로 다음과 같이 포인터 변수를 확인할 수 있습니다. 마찬가지로 이를 주소 리스트에 추가하고 다시 를 참조하는 포인터 변수가 있는지 확인할 수 있도록 합니다.





  이번에는 다음과 같이 mov esi, [esi+14] 라는 명령어를 확인할 수 있었습니다. 이 또한 마찬가지로 이중 포인터를 의미하는 명령어입니다. 다만 오프셋(Offset)으로 14가 붙어 있는 것을 알 수 있습니다. 즉 특정한 주소에서 14를 더하여 참조한다는 의미입니다.


  다시 말해서 현재 주소 값에서 14를 뺀 값을 어떠한 포인터 변수가 가지고 있다는 의미가 됩니다.




  따라서 0175D264에서 14를 뺀 값을 찾아봅시다. 계산기를 이용해보니 0175D250이라는 값이 나오네요.




  따라서 이렇게 해당 값을 가지는 포인터 변수를 찾아서 다시 주소 리스트에 등록한 뒤에 마찬가지로 또 참조하는 포인터 변수를 찾습니다.





  이번에는 오프셋(Offset)이 0C입니다. 따라서 기존의 주소에서 0C를 뺀 값인 016CD478으로 스캔을 수행하면 됩니다.





  결과적으로 00601660이라는 시작 포인터 주소를 찾을 수 있었습니다. 일반적으로 시작 포인터 주소는 초록색으로 표시됩니다.



  이제 수동으로 주소를 등록하면 됩니다.



  다중 포인터 변수는 Add Offset 버튼을 이용해 추가할 수 있습니다. 다음과 같이 오프셋을 이용하여 다중 포인터 값을 색출합니다.



  결과적으로 시작 포인터 변수를 주소 리스트에 등록할 수 있었습니다.



  이 값을 5000으로 설정하고 Active 체크박스를 클릭하여 값이 고정되도록 해줍니다.




  결과적으로 문제를 푼 것을 알 수 있습니다.




728x90
반응형