NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 팁 앤 테크
  • 매뉴얼

    팁과 테크니컬 노하우를 확인하세요.

    팁 앤 테크

    팁과 테크니컬 노하우를 확인하세요.

    본 사이트의 컨텐츠는 저작권법의 보호를 받으므로 무단 복사, 게재, 배포 등을 금합니다.

    에디터 치트 엔진 4부 - 메모리 해킹에 대해 배우기.

    페이지 정보

    본문

    안녕하세요. 엔지엠소프트웨어입니다. 어느덧~ 치트 엔진 스텝 6을 할 차례군요. 엔지엠 매크로와는 관련이 없지만, 이미 시작한 공부 내용이니 튜토리얼 끝까지 한번 해볼께요. 치트엔진을 실행하고, 튜토리얼을 실행하세요. 그리고, 스텝 5까지 스킵 버튼을 눌러서 건너뛰세요.

    DsqFV1R.jpg

     

    6단계: 포인터: (PW=098712)
    이전 단계에서는 코드 찾기를 사용하여 위치 변경을 처리하는 방법을 설명했습니다. 하지만 그 방법만으로는 원하는 값을 설정할 수 있는 주소를 찾기가 어렵습니다.
    이것이 바로 포인터가 있는 이유입니다.
    
    하단에는 2개의 버튼이 있습니다. 하나는 값을 변경하고 다른 하나는 값과 값의 위치를 변경합니다.
    이 단계에서는 실제로 어셈블러를 알 필요는 없지만 알면 많은 도움이 됩니다.
    
    먼저 값의 주소를 찾으세요. 그것을 찾았으면 이 주소에 액세스하는 것이 무엇인지 알아내는 기능을 사용하십시오.
    값을 다시 변경하면 목록에 항목이 표시됩니다. 해당 항목을 두 번 클릭하십시오. (또는 추가 정보를 선택하고 클릭) 명령이 실행될 때 발생한 상황에 대한 자세한 정보가 포함된 새 창이 열립니다.
    어셈블러 명령어에 '['와 ']' 사이에 아무 것도 없으면 목록의 다른 항목을 사용하십시오.
    그렇다면 필요한 포인터의 값이 무엇이라고 생각하는지 말할 것입니다.
    기본 치트 엔진 창으로 돌아가서(원하는 경우 이 추가 정보 창을 열어 둘 수 있지만 닫을 경우 '['와 ']' 사이에 무엇이 있는지 기억하십시오) 16진수로 4바이트 스캔을 수행합니다. 당신이 말한 추가 정보를 소중히 여기십시오.
    스캔이 완료되면 1개 또는 수백 개의 주소가 반환될 수 있습니다. 대부분의 경우 필요한 주소는 가장 작은 주소입니다. 이제 "수동으로 주소 추가" 버튼을 클릭하고 포인터 확인란을 선택하세요.
    
    창이 바뀌고 포인터 주소와 오프셋을 입력할 수 있습니다.
    방금 찾은 주소를 입력하세요. "Tutorial-i386.exe"+xxxxxx(프로세스 관련) 형식일 수 있습니다.
    또는 주소를 두 번 클릭하여 주소 목록에 추가하고 거기에 나타나는 절대 주소를 사용할 수 있습니다.
    어셈블러 명령어 끝에 계산(예: [esi+12])이 있는 경우 주소 필드 위 끝에 있는 값을 입력합니다. 이것이 오프셋입니다. 그렇지 않으면 0으로 둡니다. 더 복잡한 명령어인 경우 다음 계산을 살펴보세요.
    
    더 복잡한 명령의 예:
    [EAX*2+EDX+00000310] eax=4C 및 edx=00801234.
    이 경우 EDX는 포인터의 값이고 EAX*2+00000310은 오프셋이므로 채우는 오프셋은 2*4C+00000310=3A8이 됩니다. (이것은 모두 16진수입니다. Windows의 프로그래머 모드에서 calc.exe를 사용하여 16진수 값을 계산합니다.)
    
    튜토리얼로 돌아가서 확인을 클릭하면 주소가 추가됩니다. 모든 것이 제대로 되었다면 주소는 P->xxxxxxx로 표시되며 xxxxxxx는 찾은 값의 주소입니다. 그게 옳지 않다면 뭔가 잘못한 것입니다.
    이제 추가한 포인터를 사용하여 값을 5000으로 변경하고 '활성' 열을 클릭하여 고정합니다. 그런 다음 포인터 변경을 클릭하고 모두 올바르게 진행되면 다음 버튼이 표시됩니다.
    
    
    추가의:
    포인터 스캐너를 사용하여 이 주소에 대한 포인터를 찾을 수도 있습니다. https://cheatengine.org/help/pointer-scan.htm

     

    뭔가 장황하게 설명되어 있긴하지만, 핵심 내용은 메모리 주소를 저장하고 있는 변수 값인 포인터를 고정시키라는 뜻입니다. 포인터는 C나 C++을 배우신 분들은 다 아는 개념일겁니다. 실제로 C 언어로 코딩할건 아니라서 포인터 변수나 문법에 대해서 공부할 필요는 없습니다. 일단 value 값 고정을 위해 100으로 스캔 하고, Change value를 클릭하면서 메모리 주소를 찾습니다. 이 내용은 치트 엔진 1~3부까지 내용을 학습하시면 쉽게 할 수 있을겁니다.

    QwljwaM.jpg

     

     

    이제 Change pointer를 클릭 해보세요.

    280UoSE.jpg

     

     

    에디터에서 변수의 값을 가진 메모리 주소로 값을 가져와볼까요? 이상한 값을 가져오게 됩니다. 보통 게임에서 해킹을 진행할 때 치트엔진에서 포인터를 찾게 됩니다. 윈도우에서 실행되는 모든 프로그램은 껏다가 다시 키면 프로그램안에 있는 체력 값이나 플레이어 위치 좌표와 같은 변수들의 메모리 주소가 계속 변경됩니다. 그래서, 게임을 다시 실행할 때마다 이 작업을 반복하는건 엄청난 시간 낭비입니다.

    URi3O5Z.jpg

     

     

    포인터를 직접 핸들링하면 프로그램안에 있는 메모리 주소를 오프셋과 함께 가리키게 할 수 있습니다. 포인터 주소에 오프셋을 적용하면 메모리 주소의 위치를 바로 처리할 수 있습니다. 코딩에 대한 지식까지 학습하지 않아도 되지만, 일반적으로 구조체 또는 클래스의 속성은 연속해서 나열되어 있는데요. 이 때 각각의 속성들은 하나의 값을 가집니다. 그리고, 연속해서 일정하게 시프트되어 있는데요. 이걸 토대로 오프셋을 주면 각각의 속성 값에 접근할 수 있습니다.

     

    Change pointer를 누르면 메모리 변수 값이 아닌 다른 변수가 출력되었다는걸 확인할 수 있습니다. 변수 값을 고정시키는게 아니라 pointer를 변하지 못하게 조작하는게 이 예제의 핵심 내용입니다. 일단은 현재의 변수 값을 다시 찾아내야 합니다. 변수를 찾아서 하단 테이블에 추가한 후 우클릭하여 Find out what accesses this address를 클릭하세요.

    2f6bgtl.jpg

     

     

    The following opcodes accessed <메모리 주소> 창이 표시됩니다. 이 창에서는 메모리 주소에서 어떤 것들이 접근하는지 어셈블리를 띄워줍니다.

    sfY8kZn.jpg

     

     

    튜토리얼 창에서 Change value를 클릭 해보세요. 아래 그림과 같이 4개의 접근을 보여줍니다. 아래에서 대괄호 안에 있는 값은 주소를 나타냅니다. 그래서, eax로 받아온 값을 [edx]에 넣어주고 있으므로 이 값이 메모리 포인터라는걸 알 수 있습니다.

    2yfr4gs.jpg

     

     

    두번째 명령을 선택하면 하단에 여러가지 추가 정보가 표시됩니다. 여기서 edx 메모리 주소를 복사해줍니다.

    BszFKfU.jpg

     

     

    위에서 복사한 메모리 주소 값을 Value에 입력합니다. 이 때 Hex에 체크해야 합니다. New Scan을 누르면 아래 그림과 같이 Tutorial-i386.exe가 나옵니다. 참고로, 검색에서 나오는 메모리 주소가 녹색으로 표시되는건 메모리 포인터라는 뜻입니다. 이제 처음 변수 값의 포인터 주소를 찾았네요. 더블 클릭해서 테이블로 시키세요.

    vdCWvp4.jpg

     

     

    위에서 추가한 포인터 주소를 더블 클릭하세요.

    Vr6z1Mo.jpg

     

     

    포인터의 구조를 확인할 수 있는 창이 표시됩니다. 그리고, 주소를 변경할 수 있습니다.

    nJoj2Tt.jpg

     

     

    메모리 주소에서 오프셋을 알아내는 공식은 아래와 같습니다.

    • 오프셋 = 찾을 메모리 주소 - 포인터 주소

     

    우리는 찾을 메모리 주소와 포인터 주소 모두 알아냈기 때문에 공식과 같이 계산 해보면 됩니다. ①은 값 주소고, ②는 포인터 주소입니다.

    QFxaQT4.jpg

     

     

    이 예제에서는 값과 포인터의 주소가 같으므로 계산 해보면 0이 됩니다. 그러므로 오프셋의 값은 0인걸 알 수 있습니다. Change addrsss 창에서 포인터에 체크하고 오프셋 값을 입력한 후 OK를 눌러주세요. 이 창은 치트 엔진 하단의 테이블에서 포인터 주소를 더블 클릭하면 표시할 수 있습니다.

    LeG64qw.jpg

     

     

    포인터 주소 앞에 P가 붙었습니다.

    pPyAcom.jpg

     

     

    포인터 변수의 값이 16진수로 표시되고 있을텐데요. Value 값에서 우클릭하고, show as decimal을 클릭하세요. 그러면 아래와 같이 10진수 값으로 변경됩니다.

    Hk9doer.jpg

     

     

    이제 튜토리얼 창에서 Change pointer 버튼을 클릭 해보세요. 아래 그림처럼 처음 값을 가지고 있던 주소는 값이 바뀌지 않지만, 포인터가 연결된 주소의 값은 변경된 값으로 유지되는걸 확인할 수 있습니다. 위와 아래의 값이 서로 다른걸 확인할 수 있습니다.

    mIx7LWG.jpg

     

     

    포인터의 값 260을 더블 클릭한 후 5000으로 변경해줍니다. 그리고, 좌측 끝에 Active에 체크하세요.

    LcK8fdM.jpg

     

     

    튜토리얼 창에서 Next 버튼이 활성화 되었습니다. 이번 예제에서는 포인터가 변화하는 변수 값을 고정시키는 방법에 대해 알아봤습니다. 저 변수가 체력 또는 마나와 같은 값이라고 했을 때 이 값을 5000으로 고정했기 때문에 저 메모리 주소로 접근하면 항상 5000 값을 가져옵니다. 튜토리얼에서 Change value를 몇번 눌러본 후 엔지엠 매크로 에디터에서 메모리 주소의 값을 가져 와보세요. 아래와 같이 5000을 읽어 옵니다.

    8I3GPgl.jpg

     

     

    이번에는 치트 엔진에서 Active 체크를 해제하고, 엔지엠 매크로에서 메모리 쓰기에 3000을 입력해보세요. 실제 메모리 값도 3000으로 변경됩니다.

    eyPcaqw.jpg

     

     

    포인터는 보통 게임에서 해킹을 진행할 때 치트엔진을 이용해서 주소를 알아냅니다. 포인터를 찾는 이유는 해킹하려는 프로그램을 껏다가 다시 켤 때 프로그램안에 있는 변수의 메모리 주소가 다시 변경되는걸 막기 위함입니다. 게임이나 주식 또는 영웅문, 카카오톡, 네이버 밴드등등... 다양한 응용프로그램들을 하루에 한번은 껏다가 킵니다. 이 때 포인터를 찾기 위한 수고를 덜고, 변수 메모리 주소와 오프셋으로 고정시켜서 사용하기 위함입니다.

     

    개발자에게 후원하기

    MGtdv7r.png

     

    추천, 구독, 홍보 꼭~ 부탁드립니다.

    여러분의 후원이 빠른 귀농을 가능하게 해줍니다~ 답답한 도시를 벗어나 귀농하고 싶은 개발자~

    감사합니다~

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천0 비추천0

    댓글목록

    등록된 댓글이 없습니다.