안경잡이개발자

728x90
반응형

  다이얼로그 플로우(Dialog Flow)에서 스몰 토크(Small Talk)는 다양한 일상적인 대화들을 포함하는 내장 에이전트(Prebuilt Agent)입니다. 따라서 이 스몰 토크를 이용하면 순식간에 대부분의 일상 대화를 에이전트에 담을 수 있습니다. 한 번 스몰 토크 에이전트를 만들어 보겠습니다.



  기본적으로 자신의 프로젝트의 언어를 새롭게 만들 스몰 토크 에이전트의 언어와 일치하도록 만듭니다. 이후에 'Small Talk'를 눌러서 스몰 토크 에이전트를 만들어주겠습니다.



  IMPORT 버튼을 누르면 바로 에이전트를 생성할 수 있습니다.




  스몰 토크 에이전트가 생성된 이후에는 다음과 같이 기본적인 인텐트(Intent)들이 형성되어 있는 것을 볼 수 있습니다.



  이제 여기에 추가적인 개인 인텐트 파일을 업로드 해서 완전한 형태의 챗봇(Chat Bot)을 하나 만들 수 있습니다.



  실제로 스몰 토크가 만들어 준 인텐트를 확인해보면 다음과 같이 안정적으로 기본 예문들이 들어와 있습니다.



  반면에 한국어(KO) 설정에서도 스몰 토크 에이전트를 이용할 수 있습니다. 한국어 프로젝트에서 Prebuilt Agents 탭에 들어가 보시면 다음과 같이 몇 개의 내장 기능들이 존재합니다. 영어에 비해서 상대적으로 적은 기능들이지만 스몰 토크는 포함이 되어 있네요.



  한글로 만든 스몰 토크 에이전트는 다음과 같이 기본적인 한글 질문들이 포함되어 있지만 한글 대답은 포함되어 있지 않으므로 본인이 직접 넣어주셔야 합니다.




728x90
반응형

Comment +2

728x90
반응형

  다이얼로그 플로우는 다양한 Intent를 JSON 형식의 파일에서 불러오는 기능을 제공합니다. 따라서 JSON 파일의 형식이 잘못되었거나, 다이얼로그 플로우에서 설정하고 있는 기본적인 형식을 지키지 못하면 오류 메시지가 출력됩니다.



  일단 위와 같이 장문의 오류가 발생하면 당황하지 말고 개발자 도구를 열어서 오류 메시지를 정확히 복사합니다.




  오류 메시지가 위와 같이 굉장히 많이 나왔네요.



  이를 위와 같이 텍스트 파일에 옮겨줍시다. 이제 오류가 발생하는 해당 파일들을 일일이 삭제할 수 있습니다.



  혹은 텍스트 파일에 담은 뒤에 파일 이름만 파이썬으로 추출할 수 있습니다. 다음과 같이 말이죠.



import os 


FIND_DIR="./error messages.txt"


def find_all(string,substring):

    length = len(substring)

    c=0

    indexes = []

    while c < len(string):

        if string[c:c+length] == substring:

            indexes.append(c)

        c=c+1

    return indexes


f = open(FIND_DIR, "r")

s = f.read()

all_errors = find_all(s, "intents/")

for i in range(0, len(all_errors)):

  index = all_errors[i]

  # get only 12 characters

  print(s[index+8:index + 20])

f.close()


위 스크립트를 실행하면 정확히 오류가 발생하는 파일의 이름 앞 부분을 구할 수 있습니다.



  이제 이러한 파일들을 삭제해야 하는데요. 만약 삭제해야 할 파일의 개수가 많다면, 다음과 같이 파이썬 스크립트를 이용해서 일괄 삭제할 수도 있습니다. 저는 다음과 같이 삭제하고자 하는 파일을 배열에 하나씩 담아서 하나씩 순회하면서 삭제되도록 만들었습니다.


import os 


DIR="./Dialog Flow Example Project/intents/"


# deleting some intents that have an error sententce.

targets=[

'145127b6428c',

'14015d374076',

'1401cc8a40b3',

'1451bc4266be',

'1451b39a0148',

'105137cdd164',

'1401fec0f8e8',

'1051e6b4632a',

'145138afb780',

'1451bc4266be',

'1451e8f0d5cb',

'1051b5472e66',

'1001bb2b5200',

'1451153fae0e',

'1451bc0aa2a9',

'1001956e5832',

'105112bdd48a',

'1451bcdef726',

'1451ef55eba6',

'1051b3439dd6',

'1051bb288765',

'1001d0245578',

'14011ae6df96',

'1101cab5bc06',

'145103636150',

'140141837fb0',

'1401c7dde1b5',

'140192c0fdf1',

'1451400f135b'

]


for ROOT, DIRS, FILES in os.walk(DIR): 

  for F in FILES: 

    filename = "{}/{}".format(ROOT, F) 


    for i in range(0, len(targets)):

      if targets[i] in filename: 

        print("Deleting file \"{}\"".format(filename)) 

        os.remove(filename) 



  다만 위와 같이 하면 수동으로 파일명을 입력해야 하므로, 오류 메시지로부터 자동으로 파일 이름을 읽어서 오류가 발생하는 파일만 삭제하도록 스크립트를 합칠 수 있습니다.


import os 


FIND_DIR="./error messages.txt"

ERROR_DIR="./Dialog Flow Example Project/intents/"


def find_all(string,substring):

    length = len(substring)

    c=0

    indexes = []

    while c < len(string):

        if string[c:c+length] == substring:

            indexes.append(c)

        c=c+1

    return indexes


f = open(FIND_DIR, "r")

s = f.read()

all_errors = find_all(s, "intents/")


for ROOT, DIRS, FILES in os.walk(ERROR_DIR): 

  for F in FILES: 

    filename = "{}/{}".format(ROOT, F) 


    for i in range(0, len(all_errors)):

      index = all_errors[i]

      if s[index+8:index + 20] in filename: 

        print("Deleting file \"{}\"".format(filename)) 

        os.remove(filename)



  결과적으로 특정 인텐트의 JSON 파일에 오류가 나오는 경우 오류 메시지를 error message.txt에 기록만 해주고, 이 스크립트를 실행하면 알아서 오류 메시지에 적힌 오류 인텐트 파일들을 찾아서 그 파일들만 intents 폴더에서 지워주게 됩니다.



  결과적으로 위와 같이 더이상 문법과 관련한 오류는 나오지 않는 것을 알 수 있습니다.

728x90
반응형

Comment +0

728x90
반응형

윈도우 파일 관리 소프트웨어 에브리띵(Everything) 설치 및 사용 방법

나동빈


  일반적으로 윈도우 운영체제를 이용하시는 분들은 흔히 파일 관리의 어려움을 느끼곤 합니다. 저도 용량이 큰 압축 파일의 압축을 푼 뒤에 압축 파일을 제거해주지 않는 등의 귀찮음으로 많은 용량이 낭비되곤 합니다. 다음 사진은 제 컴퓨터의 C 드라이브 용량의 상황입니다.



  Everything 다운로드: https://software.naver.com/software/summary.nhn?softwareId=MFS_120816


  Everything 프로그램은 네이버 소프트웨어에서 쉽게 다운로드하여 설치할 수 있습니다. 현재 유통되고 있는 Everything 프로그램은 한국어 버전 및 영어 버전으로 유통되고 있습니다. 한국어 버전 및 영어 버전은 기능적으로는 모두 동일합니다.


  기본적으로 확인(OK) 버튼만 눌러서 설치를 진행해도 문제가 없습니다.





  다만 설치를 하실 떄는 NTFS 색인을 사용하도록 설정해주셔야 합니다. NTFS윈도우의 파일 시스템 서비스로 빠르게 파일을 검색하고 다양한 확장 기능을 제공합니다.



  프로그램 설치는 일반적으로 3분 내외의 짧은 시간이 소요되며 설치가 끝나면 바로 프로그램을 이용할 수 있습니다.




  설치가 완료되었으면 바로 Everything 프로그램을 실행할 수 있습니다.



  가장 많이 사용되는 기능은 크기로 정렬하여 파일을 살펴보는 기능입니다. 단순히 '크기' 탭을 눌러주시면 알아서 정렬이 수행됩니다. 이처럼 Everything은 매우 빠르게 파일의 목록을 보여주기 때문에 손쉽게 큰 용량의 파일을 찾아서 지우는 작업을 할 수 있습니다.



  또한 Everything은 실제 파일에 바로 접근할 수 있도록 해주기 때문에 우클릭한 뒤에 '열기' 등의 작업을 수행할 수 있습니다.



  그리고 '고급 검색' 기능을 이용해서 자신이 원하는 내용으로 쉽게 검색할 수 있습니다.



  저는 C++ 소스코드 파일만 찾아보기 위하여 .cpp라고 검색해보았습니다. 그러면 다음과 같이 성공적으로 cpp 확장자의 파일만 검색되는 것을 알 수 있습니다.



  









728x90
반응형

Comment +0

728x90
반응형

치트 엔진으로 포켓몬스터 파이어 레드 게임 해킹해보기 ④ 상점 구매 가격 조작하기

나동빈


  이번 시간에는 치트 엔진으로 자신의 컴퓨터 내의 포켓몬스터 파이어 레드 게임에서 상점 구매 가격을 조작해보는 실습을 해보도록 하겠습니다. 먼저 다음과 같이 상점에 들어가서 하나의 상품을 선택합니다.



  이제 구매하려는 상품의 개수를 하나씩 늘려보면서 가격 정보를 스캔합니다. 포켓몬 볼의 가격은 200원이므로 초기에는 200원으로 변수를 스캔하고 이후에 개수를 늘린 뒤의 가격도 스캔하는 방식으로 메모리 내의 변수를 찾습니다.






  결과적으로 찾은 변수를 주소 리스트에 등록합니다.



  이후에 구매할 수 있는 최대 개수로 설정한 뒤에 구매할 가격 정보를 0원으로 수정합니다.





  그러면 다음과 같이 실질적으로 구매할 가격이 0원으로 책정되는 것을 알 수 있습니다.



  이제 한 번 다른 상품도 구매해보도록 하겠습니다.



  이번에는 구매 비용 변수의 값을 항상 0이 될 수 있도록 고정(Fixed) 하시면 됩니다.



  그러면 다음과 같이 어떠한 상품을 구매하든지 간에 항상 최종 가격이 0원으로 책정되어 무료로 구매할 수 있게 됩니다.



728x90
반응형

Comment +1

728x90
반응형

치트 엔진으로 포켓몬스터 파이어 레드 게임 해킹해보기 ③ 포켓몬 능력치 조작하기

나동빈


  이번 시간에는 자신의 컴퓨터 내에 설치된 포켓몬스터 파이어 레드 게임에서 포켓몬의 능력치를 조작해보는 시간을 가져보도록 하겠습니다.  기본적으로 능력치가 변경되는 순간은 레벨 업(Level Up)을 할 때입니다. 따라서 레벨 업을 했을 때 HP 정보를 확인합니다.



  저는 따라서 다음과 같이 45로 변수를 스캔했습니다.



  이후에 다시 레벨 업을 할 때 HP 정보를 다시 확인합니다.



  다시 스캔하여 다음과 같이 HP 정보를 저장하는 변수를 주소 리스트에 담습니다.




  저는 이름을 HP로 바꾸고 값을 999로 설정한 뒤에 값을 고정시켰습니다.




  이후에 에뮬레이터를 종료하지 않은 상태로 게임을 재시작(Reset) 하시면 체력이 999로 고정되어 있습니다.



  저는 다음과 같이 재시작해서 포켓몬의 레벨이 다시 초기화 되었음에도 체력 정보가 999로 고정되어 있는 것을 확인할 수 있습니다.



  다만 이 때 레벨 업을 마치면 최대 체력은 999로 고정이 되어 있지만 현재 체력은 다시 초기화됩니다.



  따라서 현재 체력 정보도 스캔해 봅시다.




  결과적으로 현재 체력 정보도 다음과 같이 2개 찾아서 주소 리스트에 등록할 수 있었습니다.




  다음과 같이 현재 체력 정보도 999로 고정을 해줄 수 있도록 합니다.



  이후에는 항상 체력이 999/999로 고정되어 사실상 무적 상태가 되는 것을 알 수 있습니다.



  결과적으로 이와 같은 방식으로 체력 정보를 제외하고 다른 정보도 조작할 수 있습니다.



  저는 공격력(ATTACK) 정보도 변수를 스캔해보았습니다.






  이어서 공격력 변수를 메모리에서 스캔하여 주소 리스트에 등록했습니다.



  결과적으로 공격력 또한 999로 고정하여 완전히 한 번의 공격으로 상대방의 포켓몬을 이기게 되었습니다.




728x90
반응형

Comment +0

728x90
반응형

치트 엔진으로 포켓몬스터 파이어 레드 게임 해킹해보기 ② 경험치 및 레벨 조작하기

나동빈


  이번 강좌에서는 자신의 컴퓨터에 설치된 포켓몬스터 파이어 레드 게임 내에서 경험치를 조작해보는 시간을 가져보도록 하겠습니다. 이 방법은 이미 잘 알려진 방법으로 치트 엔진의 가장 기본적인 기능만 이용해서 쉽게 조작할 수 있습니다.


  경험치 및 레벨을 조작하기 위해서는 일단 포켓몬 대전에서 승리를 해야 합니다. 승리 이후에는 얼마만큼의 경험치가 늘어났는지 출력됩니다.



  포켓몬스터는 옛날 게임이며 과거에는 정수를 나타낼 때 INT 자료형 대신에 SHORT 자료형을 사용하곤 했습니다. 그래서 '2 Bytes'로 경험치에 해당하는 값을 가지는 변수를 스캔하면 됩니다.



  이후에 스캔을 하면 매우 많은 변수가 나오게 됩니다. 그 중에서 정확히 어떠한 변수가 경험치를 담고 있는지 알아내기 위해 한 번 더 대전을 해서 승리합니다.



  이번에는 경험치 23을 얻었네요. 따라서 저는 다음과 같이 연속 스캔을 통해 경험치를 의미하는 변수만을 찾아보았습니다.



  결과적으로 4개의 변수가 경험치와 관련되어 있다는 것을 확인할 수 있었습니다.



  이제 이를 효과적으로 관리하기 위해 주소 리스트에 추가합니다.



  이제 모든 변수의 값을 9999로 설정해 봅시다.



  이후에 게임을 실행해보면 계속해서 레벨 업(Level Up)이 되는 것을 알 수 있습니다.



  레벨 업이 될 때마다 4번째 변수만 값이 줄어드는 것을 확인할 수 있습니다.



  따라서 값을 9999로 설정하고 변하지 않도록 고정해주었습니다.



  그러면 다음과 같이 레벨이 50 이상으로 한 번에 쭉쭉 오르는 것을 확인할 수 있습니다.



728x90
반응형

Comment +0

728x90
반응형

치트 엔진으로 포켓몬스터 파이어 레드 게임 해킹해보기 ① 게임 실행

나동빈


  이번 강좌에서는 치트 엔진을 이용해서 포켓몬스터 파이어 레드 버전 게임을 해킹해 보는 시간을 가져 볼 것입니다. 이번 강좌에서는 자신의 컴퓨터에 설치된 소프트웨어를 동적으로 분석하는 과정을 통해 어떠한 방법으로 컴퓨터 메모리 영역에 접근하여 데이터를 바꿀 수 있는지 학습하게 될 것입니다.


※ 포켓몬스터 파이어 레드 소개 ※


  포켓몬스터 게임으로는 매우 많은 종류가 있습니다. 최신 게임 세대 분들은 잘 모르시겠지만 과거에 온라인 게임이 지금처럼 많이 발전하기 전에는 포켓몬스터 게임과 같은 CD 게임류를 정말 많이 즐겨 했습니다. 강좌의 대상으로 파이어 레드 게임을 잡은 이유는, CD 게임류를 해킹하는 것은 자신의 컴퓨터의 메모리만 조작하는 것이기 때문에 다른 사람에게 피해를 끼치지 않고 보안 공부가 가능하기 때문입니다.



  국내에서는 포켓몬스터 골드(Gold) 버전 및 파이어 레드(Fire Red) 버전이 가장 유명합니다. 우리는 3세대 포켓몬스터 게임인 파이어 레드 버전을 대상으로 잡고자 합니다. 파이어 레드 버전은 2004년에 출시된 버전으로 지금까지도 사랑을 받고 있는 고전 게임이라고 할 수 있습니다.


※ 비주얼 보이 에뮬레이터 설치 ※


  비주얼 보이 에뮬레이터는 다양한 옛날 게임을 현대의 컴퓨터에서 손쉽게 구동시키기 위해서 사용하는 가상환경 도구의 한 종류입니다. 비주얼 보이 에뮬레이터는 현재 오픈소스(Open Source)로 관리되고 있습니다. (깃 허브: https://github.com/visualboyadvance/visualboyadvance)


  비주얼 보이 다운로드: https://romsmania.com/emulators/gameboy-advance/visualboyadvance-68


※ 포켓몬스터 파이어 레드 ※


  본 강좌는 이 게임을 정품으로 구매한 사람이 직접 ROM 파일로 덤프(Dump)를 해서 자신의 PC에서 게임을 실행한다고 가정합니다.


  (사실 유료 CD 게임들은 본인이 직접 구매해서 개인적인 목적으로만 덤프를 해서 사용하면 큰 문제가 없습니다. 다만 게임을 구매하지 않은 다른 사람에게 배포를 하면 법적인 처벌을 받을 수 있지요. 하지만 국내 포털 사이트를 포함하여 인터넷에 검색하면 포켓몬스터 골드, 파이어 레드 등의 게임을 매우 손쉽게 받을 수 있는 현실입니다.)


  또한 본 강좌는 한글 패치 유무에 상관 없이 파이어 레드 게임에 동일하게 적용이 가능합니다.


※ 실행 화면 ※


  일단 기본적으로 자신의 게임을 즐기면서 메모리를 조작 해보고 싶은 부분을 찾아보는 것을 추천드립니다.



  저는 게임을 하면서 포켓몬의 레벨, 능력치 등의 요소를 조작해보고 싶다는 생각이 들었습니다.



※ 비주얼 보이 에뮬레이터 기본 사용 방법 ※


  방향키: 게임 내에서 움직일 때 사용하는 키입니다.

  Z: 게임 내에서 다양한 선택(Select)을 하도록 해주는 키입니다.

  스페이스 바: 게임 실행 속도를 증가시킵니다.


728x90
반응형

Comment +0

728x90
반응형

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

나동빈


  이번 시간은 치트 엔진 튜토리얼 9단계 문제를 풀어보는 시간을 가집니다. 튜토리얼 문제 중 마지막 문제이며 지금까지 공부한 내용들을 혼합해서 문제를 풀어야 합니다. 사실 난이도는 그다지 높지 않습니다.


  문제 요약: Player 1과 Player 2가 우리 팀이고, Player 3와 Player 4가 적 팀입니다. 게임을 시작하면 각 플레이어의 체력이 감소하는데, 치트 엔진을 이용하여 우리 팀이 이기도록 처리하면 됩니다.



  바로 먼저 Player 1: Dave의 체력 데이터 변수를 찾기 위해 다음과 같이 100을 검색합니다.



  결과적으로 다음과 같이 변수를 찾을 수 있으며 이를 주소 리스트에 추가합니다.




  기본적으로 해당 변수의 값을 감소시키는 기계어를 찾기 위해 다음과 같이 Find out what writes to this address 버튼을 누릅니다.



'


  체력을 감소시키자 다음과 같이 하나의 명령어가 검출되었습니다. 쉽게 말해 체력 정보를 감소시키는 명령어입니다.



  기계어는 mov [ebx + 04], eax입니다. 리버싱(Reversing)을 많이 해보면 이 명령어를 보자마자 배열(Array)를 떠올릴 수 있습니다. 일반적으로 플레이어와 같은 정보들은 C언어에서 구조체 형태로 저장됩니다. 결과적으로 플레이어가 여러 명이니까 플레이어 구조체가 배열 형태로 선언이 되었을 것이라고 예상할 수 있습니다. 여기에서 ebx는 일반적으로 배열의 인덱스를 위해 사용되는 변수라고 볼 수 있습니다.


  따라서 해당 구조체 변수가 선언된 메모리 공간을 확인하기 위해 Browse this memory region을 누릅니다.



  그러면 다음과 같이 하나의 구조체 안에는 체력 데이터 및 플레이어 이름 정보 등의 변수가 차례대로 담겨있는 것을 확인할 수 있습니다.



  따라서 다음과 같이 ebx 레지스터의 값을 확인해 봅시다.



  이 ebx 레지스터는 배열에서 특정한 원소 부분이 시작되는 메모리 주소를 저장한다고 예측할 수 있습니다.


  이제 우리는 각 플레이어의 점수를 서로 다르게 처리하기 위해서 플레이어를 구분하는 로직을 작성해야 합니다. 확인해 보시면 ebx 레지스터에서 조금만 더 가면 이름 데이터가 존재하는 것을 파악할 수 있습니다.




  오프셋(Offset)을 확인해보니 정확히 ebx + 15의 위치에 이름 데이터의 첫 번째 글자가 나오는 것을 확인할 수 있습니다.



  따라서 구조체 변수 내 체력 정보를 변경하는 기계어를 수정하기 위해 어셈블리어를 확인해 줍니다.



  Auto Assemble 탭을 클릭하여 코드 인젝션을 수행 할 수 있도록 합니다.




  코드를 다음과 같이 바꾸어줍니다. CMP와 JE는 함께 자주 쓰이는 어셈블리어입니다.


  CMP: 두 개의 데이터를 비교하여 그 결과를 저장합니다.

  JE: 두 데이터의 값이 일치하는 경우 특정 주소로 이동합니다.


  다시 말해 특정한 구조체 변수의 이름 데이터 값이 'D'로 시작하는 경우는 체력 데이터를 감소시키지 않고 바로 로직이 종료되도록 만드는 것입니다.




  이제 플레이어 Dave는 체력이 감소되지 않습니다. 따라서 다시 게임을 시작해보면 Dave의 팀이 승리하는 것을 알 수 있습니다. 이와 같이 간단히 치트 엔진 튜토리얼의 마지막 문제까지 풀어보았습니다.



728x90
반응형

Comment +0

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
반응형

Comment +5

  • asdf 2020.04.01 05:10

    초록색 값이 뭔지, 다중 포인터를 어떻게 푸는지 굉장히 자세하게 설명해주셨네요
    여태 뭔지 몰랐었는데 덕분에 쉽게 이해하고 갑니다

  • ㅇㅁ 2020.12.14 10:50

    많이 배워갑니다. 다만 이쪽으로 문외한인 저에게는 여기부터가 다가가기 힘든 부분이군요. 아무튼 감사합니다.

  • zbdrariI 2021.02.04 10:13

    관리자의 승인을 기다리고 있는 댓글입니다

  • zbdrariI 2021.02.04 10:13

    관리자의 승인을 기다리고 있는 댓글입니다

  • ㄹㄹ 2021.08.30 22:14

    관리자의 승인을 기다리고 있는 댓글입니다

728x90
반응형

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

나동빈


  이번 시간에는 치트 엔진 튜토리얼 7단계 문제를 풀어보도록 하겠습니다. 이번 문제는 코드 인젝션(Code Injection)입니다. 말 그대로 실행 중인 게임의 중간에 우리가 원하는 소스코드를 삽입하여 실행하는 것입니다.


  문제 요약: 누를 때마다 변수의 값이 2씩 감소하는 버튼이 있습니다. 버튼을 누를 때마다 변수의 값이 1씩 증가하도록 코드 인젝션을 하면 됩니다.



  현재 체력 변수의 값이 100입니다. 이를 99로 바꾼 뒤에 다시 스캔하는 식으로 변수를 찾아냅시다.





  이번에는 위 사진과 같이 어떠한 코드가 해당 주소의 값을 변경하는지 확인할 수 있도록 'Find out what writes to this address'를 누릅시다.




  이제 값을 변경해보면 위와 같이 어떠한 코드가 값을 변경하는지 추적이 되는 것을 확인할 수 있습니다. 더블 클릭하여 정보를 확인해보면 특정한 메모리 주소의 값에서 1을 빼는 것을 확인할 수 있습니다.



  이번에는 다음과 같이 Show disassembler를 눌러 어셈블리어 코드를 확인할 수 있습니다.



  이후에 코드 인젝션을 위해 먼저 자동화된 기능인 Auto Assemble 이용합시다.



  이후에 Code Injection 탭을 누르면 자동으로 원래 형태의 기본 코드가 주입됩니다.




  보시면 원래 코드(Original Code)로 1을 빼는 부분이 들어가 있는 것을 알 수 있습니다.



  따라서 다음과 같이 원래 코드를 지워버리고, 새롭게 할당되는 부분에 2를 더하는 기계어를 작성해주시면 됩니다. ADD값을 더하는 목적으로 사용하는 대표적인 어셈블리어입니다.



  이후에 실행(Execute)을 누르면 코드 인젝션이 완료됩니다.




  그러면 이제 버튼을 누를 때마다 2씩 값이 증가하며 성공적으로 문제가 풀린 것을 알 수 있습니다.



728x90
반응형

Comment +0