본문 바로가기

Memory Hacking

치트엔진 - tutorial step 8 Multilevel pointer

반응형


튜토리얼 풀면서 제일 고민 많이하고 풀었다.


문제의 포인터는


포인터가 4중인데,


포인터에 연산되는 주소와 오프셋 값을 찾아내서 


주소값과 오프셋 값을 연결 시켜 값을 고정시키는게 목표다.


초기 값인 3206를 검색하면




01824818 이라는 주소를 찾았다.


F5를 눌러 이 주소에 접근하는 것들을 봐야함.


Change value를 눌렀을 때 이 주소 접근하는게 있을 텐데,


눌르면, 아래 코드가 나옴.






더블 클릭해서 Extra info를 확인하면,


esi 값은 현재 01824800이고 이를


오프셋 값과 계산한 1824818에 931이 담기게 된다.


그러므로


[  ] 안에있는 오프셋과 레지스터 값중 레지스터 값은


이전 포인터가 가지고 있는 주소값


임을 확인 할 수 있다.




EAX 레지스터의 3E1 값은 3206이 Change된 993임을 확인할 수 있고,


esi와 오프셋 값을 더한 01824818주소는 value가 저장된 주소임을 확인할 수 있다.


계산되기 이전에 01824800을 저장하던 포인터가 존재할 것이다.


검색 창 옆 Hex에 체크를 하고 01824800를 Frist Scan하면,


한가지 값이 나온다.


0181B508는 주소가 01824800 주소값을 가지고있는 주소 이고,


오프셋 값은 더하여 value를 가리 킬 수 있는 포인터가 된다.




0181B508을 하이라이트 시키고, F5를 눌러서 접근하는 것들을 확인하자.


이제 Change value를 눌러 값을 변경하면


0181B508은 값을 가리키도록 연결되어 있는 포인터 이므로 접근 리스트에


항목이 뜬다.



두번째 줄에 mov esi, [esi]의 extra info를 보면,


(하이라이트 시키고 More information을 클릭해도 됨)


이전에 주소를 찾는 과정에선


mov [esi +18] , eax로


value값을 esi+18 에 해당하는 주소에 저장했고,


이번엔 mov esi, [esi]로


esi값인 01824800을 저장한다.



여기서 01824800의 값을 가지고있는 주소인 018B508은 오프셋값이 0이므로


이전 포인터가 가지고 있는 주소 값은 018B508-0을한 018B508이 된다.



0181B508값을 가지고 있는 주소는 018BAAE4


F5를 눌러서 접근하는 것들을 확인하면, (Change Value 버튼 누름)




[ esi + 14 ] 의 값은 018BAAE4이고, 018BAAE4에 있는 0181B508이라는 값이 esi에 저장되게 된다.


따라서, 이전 포인터는 esi - 14를 한 값을 가지고 있다.


018BAAE4 - 14 = 18BAAD0의 값을 가지고 있는 주소를 검색하자.



검색하면 018247CC 라는 주소는 018BAAD0 값을 가지고 있고


이 값과 오프셋 값인 14를 더하면 다음 포인터를 가리키게 되므로,


이 주소가 이전 포인터인 것을 알 수 있다.




이렇게 찾아낸  018247CC를 치트 테이블에 넣고 F5를 눌러 확인.





[esi + 0C] 의값은 018247CC가 되며, 오프셋 연산 전 018247C0을 가진 주소 값을 찾는다.



이번엔 초록색 주소가 나왔다.


문제를 보면 (usually when the base address is a static address, shown up as green)


base 주소는 고정 주소 일 때 녹색으로 나타난다고 적혀있다.


포인터의 base 주소를 찾았으므로,


Add Address Manually를 통해서 수동으로 입력해준다.



주소와 오프셋 연산과정을 하나의 포인터로 합쳐 주고,


치트 테이블에서 5000 값을 고정시키고


Change Pointer를 눌러주면


베이스주소로 부터 오프셋값을 계산한 포인터들을 고정시켜 줬기 때문에


포인터값이 변하여도 value가 고정되게 된다.


로직을 짜보면,


(수식으로 베이스주소 = B, 가지고 있는 값은 Have로 함.)


B --> (B Have+ offset) -->

((B Have + offset) Have + offset )-->

(((B Have + offset) Have + offset ) Have + offset) -- >

((((B Have + offset) Have + offset ) Have + offset) Have + offset) --> value 가 된다.


이 과정에서 offset값을 빼주면서 이전 주소가 가지고 있던 값을 검색하면


베이스 주소를 구할 수 있다.






참고


http://m.blog.naver.com/usas0s/130130019281


 

반응형