2006-02-17

유니코드와 같은 코드의 종류와 그 코드가 쓰이는 방법

1. 아스키 코드(ASCII)
주로 영어와 몇몇 기호를 표시하기 위해 씁니다. 코드값은 0x00 ~ 0x7F사이의 값을 가집니다.

2. ISO-8859-1 부터 ISO-8859-15
주로 유럽에서 쓰이는 언어들(독일어,프랑스어,터키어,그리스어,키릴어(러시아 등) 등등)을
표현하기 위해 쓰입니다. 0x00 ~ 0xFF까지의 값을 가지는데 0x00 ~ 0x7F는 아스키와 동일합니다.

3. 한글 완성형 코드(EUC-KR, UHC)
UHC는 M$ 확장 완성형이라고도 하고, 마이크로소프트사에서 EUC-KR을 기반으로 확장한 것입니다.
0x00 ~ 0x7F의 아스키도 포함합니다.
EUC-KR의 경우 0xA1A1 ~ 0xFEFE값을 가지며, 한글, 한자, 기호 등이 있고, 값에서 알 수 있듯이
2바이트가 하나의 문자를 표현합니다.
UHC는 여기서 첫바이트는 0x81 ~ 0xA0값도 사용하고, 두번째 바이트는 0x41 ~ 0x5A,
0x61 ~ 0x7A, 0x80 ~ 0xA0값도 사용합니다.

4. 한글 조합형 코드(JOHAB)
0x00 ~ 0x7F의 아스키를 포함합니다.
역시 두바이트가 하나의 문자를 표현하는데, 두바이트인 16비트를 가지고 첫비트는 무조건 1,
다음 2 ~ 6 비트가 초성, 7 ~ 11비트가 중성, 12 ~ 16비트가 종성을 나타냅니다.

5. 일본어 EUC-JP 코드
0x00 ~ 0x7F는 아스키
0xA1A1 ~ 0xFEFE는 일본어 글자인 히라가나, 카타카나, 한자, 그리스어, 키릴어 및 각종 기호 영역
0x8EA1 ~ 0x8EFE는 반각 카타카나 영역
0x8FA1A1 ~ 0x8FFEFE는 확장된 그리스어, 키릴어, 한자 등이 있는 영역입니다.
값에서 알 수 있듯이 한 문자를 표현하기 위해 3바이트를 쓰는 경우가 있습니다.

6. 일본어 SHIFT_JIS 코드
0x00 ~ 0x7F는 아스키
정확하게 값이 기억은 안나지만 0x8140부터 시작하는 두바이트로 된 코드들이 있는데
EUC-JP의 0xA1A1 ~ 0xFEFE에 해당하는 문자들이 있습니다.
0xA1 ~ 0xFE는 반각 카타카나 영역입니다.

7. 중국어 GB-2312(간체) 코드
0x00 ~ 0x7F는 아스키
0xA1A1 ~ 0xFEFE 사이에 수많은 한자들과 기호등등의 문자들이 있습니다.

8. 중국어 HZ(간체) 코드
GB-2312를 특정한 방식에 따라 인코딩한 것입니다.

9. 중국어 BIG-5(번체) 코드
0x00 ~ 0x7F는 아스키
두바이트가 한 문자가 되는 코드들이 있는데 이 코드는 변종이 많아서 정확한 값은 모르겠습니다.

10. 중국어 GBK(간체) 코드
마이크로소프트사에서 GB-2312를 기반으로 확장한 코드입니다.

11. 중국어 GB18030 코드
GBK를 포함합니다.
여기다가 한 문자를 표현하기 위해 4바이트까지 확장해서 씁니다.
유니코드에 포함된 모든 문자가 포함되어 있습니다.

12. 한글 ISO-2002-KR
EUC-KR을 특정한 방식에 따라 인코딩한 것입니다.

13. 일본어 ISO-2022-JP/ISO-2022-JP2
EUC-JP와 EUC-KR, GB-2312, ISO-8859-1, ISO-8859-7을 특정한 방식에 따라 인코딩한 것으로
ISO-2022-JP2는 ISO-2022-JP의 확장으로 보시면 됩니다.

14. 중국어 ISO-2022-CN/ISO_2022-CN-EXT
GB-2312, BIG-5에 포함하는 문자 및 기타 다른 여러 중국어 코드들을 특정한 방식에 따라
인코딩한 것입니다.
여기서 알 수 있겠지만 중국어 관련 코드는 위에서 소개한 것 말고도 엄청나게 많습니다.
심지어는 조선족을 위한 (한글) 코드까지 있는 것으로 알고 있습니다.

15. 유니코드
전 세계의 존재했거나, 존재하거나, 앞으로 생길지도 모르는 모든 문자를 지원하기 위해
만들어진 것으로 알고 있습니다. 각종 현대문자, 고대문자, 기호 등등을 포함하며
UTF-32, UTF-16, UTF-8, UTF-7등등의 인코딩 방식에 따라 인코딩되어 사용되고 있습니다.
유니코드에 대한 자세한 설명은 http://www.unicode.org 에서 찾아 읽으시는게 좋을 듯합니다.
물론 국내에도 꽤나 괜찮은 문서들을 검색을 통해 찾아볼 수도 있을 겁니다.

16. 기타 등등
이밖에도 베트남, 인도, 북한의 코드도 따로 있습니다.
베트남은 한자만 있는 코드와 라틴어와 유사한 표기로 되어 있는 코드가 별도로 있는 걸로 알고 있고,
인도는 각 지방마다 글자가 다르기 때문에(음은 같다고 하는 것 같구요..) 표준화된 코드가
나온지 얼마 안된 거로 알고 있습니다. 북한은 한글 완성형 EUC-KR과 거의 유사하게 되어 있고,
특이한 점은 "김일성", "김정일"에 해당하는 6글자의 코드가 특별한 값으로 따로 만들어져 있다는
것입니다.
음.. 별로 도움될 만한 내용은 아니군요...

그밖에도 도스 시절에 도스 환경에서 쓰는거냐, IBM사의 기계에서 쓰는거냐,
맥킨토시에서 쓰는거냐 등등에 따라서도 각각 다른 코드가 있습니다.

아스키 코드, 유니코드 ?

ASCII (American Standard Code for Information Interchange) ; 아스키
아스키는 컴퓨터나 인터넷상에서 텍스트 파일을 위한 가장 일반적인 포맷이다.
아스키 파일에서는 각각의 알파벳이나 숫자 그리고 특수문자들이 7 비트의 2 진수(7개의 0 또는 1의 조합으로 이루어진 스트링)로 표현되며, 총 128개의 문자가 정의되어 있다.
유닉스나 도스 기반의 운영체계(윈도우 NT는 제외)는 텍스트 파일을 표현하는데 있어 아스키를 사용한다.
윈도우 NT의 경우에는 유니코드라고 하는 새로운 코드를 사용하며, IBM의 System 390 서버들은 엡시딕이라고 부르는 자신들만의 고유한 8 비트 코드체계를 사용한다.
따라서 서로 다른 운영체계 간에 어떤 파일을 교환하기 위해서는 코드 변환 프로그램이 필요하게 된다. 아스키는 미국규격협회인 ANSI (American National Standards Institute)에 의해 개발되었다.
영문자, 숫자, 기호를 7비트로 표시하는 미국 표준 코드. ASCII 코드로 표현할 수 있는 문자의 종류는 27=128가지이고, 오류 검사용 패리티 비트 하나를 추가하여 8비트로 2진 코드화함으로써 바이트 단위의 전송이 가능하다.
10여 년 전, 그러니까 16비트 컴퓨터가 보급되기 시작한 시기에 컴퓨터를 처음 배운 사람이라면 ‘아스키’ 코드라는 그리운 단어가 기억에도 생생할 것이다. 아스키(ASCII)는 원래 미국 정보교환 표준 코드(American Standard Code for Information Interchange)로 컴퓨터를 사용하는데 필요한 문자 규약을 말한다. 컴퓨터 환경이 열악하던 그 시절, 흑백 모니터를 들여다보며 자판을 두드리다 지친 사람들은 종종 문자와 기호를 이용해 멋진 그림을 만들어내곤 했다. 따지고 보면 ; ) :-) 8-( T_T 등과 같은 현재의 인터넷 스마일리도 간단하기는 하나 예전에 애용되던 ‘아스키 코드를 이용한 그래픽 표현’과 마찬가지다

유니코드란?
다양한 나라가 서로 동일한 혹은 비슷한 의미의 문자를 저마다 다른 인코딩 방식을 사용함으로써, 자료 및 프로그램의 호환성 및 확장성에 문제를 일으키는 관계로 이를 하나의 문자 세트인 유니코드로 통합시켜 표현함으로써 해결하자는 뜻에서 `유니코드`는 전세계 주요 컴퓨터회사들이 업계표준으로 규정한 만국공통 문자코드로 우리나라에서도 지난 96년 2월16일 서울 롯데호텔에서 설명회를 열었고 우리나라에서도 다양한 서체가 개발되고 있다.
즉 Unicode는 세계 각국의 언어를 통일된 방법으로 표현할 수 있게 제안된 국제적인 코드 규약의 이름을 말한다.
미국에서 개발되어진 컴퓨터는 그 구조가 영어를 바탕으로 정의되어 있기에 26자의 영문 알파벳트와 몇 가지 특수 문자를 표현하기에는 1바이트로 충분하였기 때문에 모든 정보가 1바이트를 단위로 표현되고 있었으나 동양3국의 언어 표현인 한글, 한자 또는 일어 등과 같은 문자는 그 구조가 영어와 달라서 1 바이트로는 표현이 불가능하기에 2바이트로 조합하여 하나의 문자를 표현하는 컴퓨터의 구조적 문제점을 바탕으로 만들어 졌다.
기본적으로 유니코드에서는 16비트를 사용하여 하나의 문자를 표현하고 있다.

2006-02-11

About Game Hacking

원문: Game Hacking : An Overview by Sorin
정리: 이동우(leedw at ssrnet.snu.ac.kr), 2004.8.1

내용
Intro GameHacking이란 무엇인가 필요한 tool은 무엇인가 GameHacking의 유형 DMA란 무엇인가 Code Injection Saved game patching Value poking Memory patching Excutable/Dll patching Techniques 총알, 생명치, 마나등 증감되는 수치를 알고 있는 경우 에너지 바, 총알,
생명치, 마나등 정확한 값을 알 수 없는 경우 Instant Build Hacking Techniques map이 저장되는 방식

1 Intro어렸을 때 한창 오락실에서 죽치고 앉아 있던 시절, 아이들 사이에서는 갤러그나 제비우스에서, 혹은 마계촌같은 게임에서 적의 공격을 받아도 죽지 않는 '무적' 모드가 되는 비법이 회자되곤 했었다. 캐릭터를 특정 위치로 옮겨서 적 캐릭터가 어느 지점에 나타나는 시점에서 무슨 키를 동시에 누르면 무적 모드가 된다는 이야기들이 소곤 거리며 나돌았는데 무적 모드로 플레이를 하면 오락실 아저씨가 와서는 전원을 내려버렸다는 소문이 전설처럼 떠돌았다.
마지막 판은 고사하고 각 레벨의 끝에서 만나는 보스 캐릭터에게 번번히 죽임을 당해서 오락실 기계에 무수히 동전을 갖다 바쳐야 했던 필자같은 아이들에겐 솔깃한 이야기가 아닐 수 없었지만 실제로 무적 모드의 동작이 확인된 것은 없었다.
요즘식으로 말하자면 아마 그것이 게임 프로그램내의 '버그'를 가리키는 것이었을 텐데 그런 버그를 이용하는 것도 일종의 GameHacking의 한 기법이라 할 수 있을 것이다.
이 페이지에서는 바로 GameHacking이 무엇이고 어떻게 이루어지는지에 대한 개략적인 소개를 담게 된다.

2 GameHacking이란 무엇인가필자같이 게임의 끝판까지 클리어하지 못하는 '순발력이 떨어지는' 플레이어가 특정 레벨이나 게임을 클리어하는 방법은 다음의 두 가지중의 하나일 것이다.

게임내에 내장되어 있는 치트 코드(cheat code)를 쓴다. 물론 이것은 게임에서 지원해줘야 한다.
그리고 치트 코드를 쓰게 되면 일반적으로 게임에서 정상적인 플레이어가 아닌 cheater로 간주되기 때문에 고득점이 인정되지 않는등의 제약 사항이 있다.
게임에서 제공하는 치트 코드를 쓰지 않고 툴을 이용해서 게임의 법칙을 바꾼다.
(예를 들어 생명치, 에너지, 총알의 제한을 무제한으로 푸는 것.)
우리가 GameHacking이라고 부르는 것은 2번 방법이다.
주의: 당신이 정말 게임을 좋아한다면 치트 코드는 물론 GameHacking을 통해서 플레이 하는 것은 자제해야 한다. 정상적인 방법으로 게임을 클리어했을 때 게임의 진정한 묘미를 느낄 수 있다.
게임을 모두 클리어하고 난 이후 hacking을 연습하기 바란다.

3 필요한 tool은 무엇인가
Debugger (SoftIce, Olly등) : 메모리에서 실행되고 있는 게임 코드를 추적할 때 쓴다.
Memory Searcher (TSearch, ArtMoney, GameHack, Game Trainer등) : 게임에서 우리가 원하는 값(생명치, 총알, 에너지, 마나, money)이 저장된 주소를 찾아내려 할 때 쓴다.
Hex Editor (HexWorkshop, Hacker's View등) : 게임의 실행 파일(exe)이나 라이브러리(dll), 혹은 게임의 세이브 파일을 편집할 때 쓴다.
Disassembler (W32Dasm) : 게임의 dead-listing을 다룰 때 쓴다. dead-listing이란 메모리이 올려져 있지 않은, 파일로 저장된 게임의 asm 코드를 말한다.
Trainer Maker (Trainer Maker Kit) 혹은 프로그래밍 지식 : 선택 사항이다. trainer를 만들고자 할 때 필요하다.
위의 툴은 http://www.protools.cjb.net/ 이나 http://www.gamehacking.com/ 등 인터넷에서 쉽게 찾을 수 있다.
툴의 캡쳐 하면을 구경하려면 다음을 클릭하라.

4 GameHacking의 유형게임을 hacking하기 위한 방법을 요약하면 다음과 같다.

메모리 해킹(Memory Hacking) : 게임이 차지하고 있는 메모리 영역을 조작하는 기법이다.
1.1 Value poking : 게임에서 제한된 값으로 주어진 생명치, 에너지, mana, 총알 갯수등이 저장된 메모리 값을 변경시키거나 특정 값으로 freezing 하는 것. 1.2 Memory patching : 메모리에 로드된 게임 코드를 변경시키는 기법. 예를 들어 플레이어가 총을 쏠 때 총알을 감소시키는 코드가 다음과 같다고 하자.
어셈 코드 헥사 코드 dec ecx 49 이때 총을 쏴도 총알을 감소시키지 않게 하기 위해선 다음과 같이 instruction을 바꾸면 된다.
어셈 코드 헥사 코드 nop 90 "dec ecx"를 "nop"로 변경시킴으로 해서 총알 갯수는 줄어들지 않을 것이다. 이 방법은 DMA를 다루어야 할 때 가장 효율적인 방법이 된다.

실행파일 해킹(Executable/Dll Hacking) : Memory hacking 기법은 손쉬운 면이 있는 반면, 게임을 exit하고 다시 실행하면 기존에 메모리를 조작했던 것들이 모두 소용이 없게 된다. 실행 파일이나 라이브러리 자체를 조작해야 변경시켰던 값이나 코드가 영구적으로 지속될 수 있다.
2.1 EXE/DLL patching : Memory patching과 동일하나 조작 대상이 메모리가 아닌 파일이며 수정된 사항을 영구적으로 지속시킬 수 있다는 차이가 있다.

세이브 파일 해킹(Saved_Game Hacking)
3.1 .SAVED Patching : 해킹하고자 하는 게임이 "save game" 옵션이 있을 때 세이브 파일을 뒤져서 셋팅 값을 변경시키는 기법이다. 주로 헥사 에디터가 쓰인다.

5 DMA란 무엇인가DMA(Dynamic Memory Allocation)은 게임이 메모리를 다루는 방식의 일종이다. 이름이 의미하는 바와 같이 게임은 어떤 값을 저장하기 위해 메모리를 동적으로 할당하는 경우가 있다. 그것은 게임을 실행할 때마다 어떤 값이 저장되는 메모리 위치가 계속 바뀔 수 있다는 것이다. 예를 들어 어떤 게임에서 총알 갯수, 수류탄 갯수, 생명치를 저장하는 메모리 주소가 다음과 같다고 해보자.
bullets : 100 grenades : 120 life : 150
그런데 게임을 빠져나가서 다시 실행하면 메모리 주소가 다음과 같이 바뀐다.
bullets : 510 grenades : 530 life : 560
그 다음에 게임을 다시 실행하면 또 다음과 같이 바뀐다.
bullets : 610 grenades : 630 life : 660
여기서 무엇을 추론할 수 있는가? 데이타가 저장되는 메모리 주소는 매 실행시마다 바뀐다. 그러나 자세히 보면 3가지 경우 주소값이 100단위로 바뀌며 각 데이타가 저장되는 메모리 주소의 차이는 모두 동일함을 알 수 있다. 즉, 수류탄 갯수는 총알 갯수가 저장된 메모리 주소에서 20번지 다음에 있고 생명치는 수류탄 갯수에서 30번지 다음에 위치해 있는 것이다. DMA 문제는 이렇게 메모리 주소의 패턴pattern을 찾는 것부터 풀어나갈 수 있다. 메모리 주소 할당의 패턴을 알아낸다면 다른 데이타가 저장된 주소값을 쉽게 유추할 수 있다.

6 Code Injection위에서 DMA가 무엇인지 알아 보았다. 그럼 이렇게 매번 메모리 주소가 바뀌는 문제를 어떻게 우회할 수 있을까. 간단하다. 바로 code injection 기법을 이용하면 된다. code injection은 이름이 의미하는 것과 같이 게임에 code를 삽입시키는 것이다. 예를 들어 게임에서 다음과 같은 코드를 찾아냈다고 하자.
mov eax,[ecx] - ecx = 총알 갯수가 저장된 주소를 가리키는 포인터 dec byte ptr [eax] - eax = 총알 갯수가 저장된 주소 mov eax,[ecx+20] - ecx+20 = 수류탄 갯수가 저장된 주소를 가리키는 포인터 dec word ptr [eax] - eax = 수류탄 갯수가 저장된 주소 mov eax,[ecx+50] - ecx+50 = 마나 수치가 저장된 주소를 가리키는 포인터 dec dword ptr [eax] - eax = 마나 수치가 저장된 주소 여기서 처음 ecx에 저장된 주소로 수류탄, 마나 수치까지 알아 낼 수 있으므로 parent address라고 한다. 그런데 이 주소는 DMA로 결정되기 때문에 게임 실행시마다 변경되는 값이다. 그래서 이 ecx 값을 언제든 참고할 수 있도록 특정 장소에 저장해둘 필요가 있다. 특정 장소를 어떻게 찾을까.
게임 코드가 저장된 영역에서 0나 혹은 FF만 채워져 있는 영역을 찾아낸다. 그 부분이 바로 코드에서 쓰이지 않는 영역인데 거기에 우리의 코드를 삽입할 것이다. 코드를 삽입하는 절차는 간단하다.

게임 메모리에서 0이나 FF로 채워져 있는 빈 공간을 찾는다.
게임 코드내에 그 공간으로 "jmp"하거나 "call"하는 코드를 overwrite한다.
overwrite했던 코드 부분을 재구성한다.
나머지 빈 공간에 임의의 코드를 삽입한다. (parent address를 잡아내는 코드)
다시 원래 코드로 jmp back하거나 ret하도록 한다.
위에서 예로 든 코드를 다시 예로 들면,
[ORIGINAL[ [MODIFIED] mov eax,[ecx] jmp 4455 (place full of 0's) dec byte ptr [eax] dec byte ptr [eax] <-------<---------<----<--------- mov eax,[ecx+20] > mov eax,[ecx+20] ^ dec word ptr [eax] dec word ptr [eax] mov eax,[ecx+50] mov eax,[ecx+50] dec dword ptr [eax] dec dword ptr [eax] ^ ................... offset 4455: (원래 0으로 채워져 있던 빈 공간) mov eax,[ecx] - overwrite했던 instruction을 재구성 ^ mov dword ptr[5555],ecx - parent address를 static 영역에 저장 jump back to "dec byte ptr [eax]" ----->--->--->------>------> 이렇게 해서 parent 주소를 static 주소 영역에 저장함으로써 DMA 문제를 해결할 수 있다. trainer에서는 5555번지를 읽어 내서 총알, 수류탄, 생명치등의 수치를 조작할 수 있게 되는 것이다. 예를 들어 trainer에서 총알 갯수를 가져오고자 한다면 다음과 같이 코드를 짜면 된다.
... 5555번지 값을 읽어서 temp에 저장 push temp pop ecx ---> ecx = 총알 갯수가 저장된 주소의 포인터 mov ecx,[ecx] ---> ecx = 총알 갯수가 저장된 주소 mov eax,[ecx] ---> eax = 총알 갯수 (DAM에 관한 sheep의 tut들을 읽어보라.)

7 Saved game patching먼저 .SAVE file patching에 대해서 알아보자. 이는 게임의 세이브 파일을 뒤져서 우리가 원하는 수치가 저장된 데이타를 찾아내서 새로운 수치 값으로 변경시키는 기법을 말한다.
Warcraft2를 예로 들면, single player game을 플레이하다 게임을 저장한다. 이때 보유한 gold 값을 기억해 둔다. 이제 세이브 파일을 HexWorkshop으로 로딩해서 해당 gold 값을 search한다. 이때 search type은 32 Bit Unsigned long 으로 지정한다. 이는 10진수 값으로 찾기 위한 것인데 이 값이 65535 (WORD 타임의 최대값) 보다 크기 때문이다. "value" 에디트 박스에 money 수치를 입력하고 OK를 누르면 된다. 간단하지 않은가?
여기서 원하는 값을 찾기 위해선 세이브를 여러번 시도해야 할 때가 있다. 즉, 마나나 마법 수치등의 값을 찾으려 할 때 상태가 바뀌는 시점에서 게임을 세이브하고 HexWorkshop에서 compare 기능으로 원하는 값을 추적하는 것이다.
그러나 starcraft와 같은 많은 게임들이 세이브시키는 데이타를 암호화(encrytion)하는 경우가 많다. 이 경우에는 세이브 파일을 해킹하는 것보다는 value poking과 같은 게임의 메모리를 해킹하는 것이 더 수월하다.

8 Value poking이 방법은 GameHacking의 가장 일반적인 기법이다. Memory searcher(Tsearch, ArtMoney, 기타 등등)로 특정 수치 값을 검색한다. 물론 이때 같은 값을 가진 주소들이 우후죽순처럼 검색된다. 그럼 게임으로 돌아가서 해당 수치가 바뀌는 동작을 한다. 그리고 다시 memory searcher로 돌아가서 next search로 변경된 수치를 검색한다. 이와 같은 동작을 여러 차례 반복하다 보면 검색되는 주소가 몇 개의 주소로 좁혀지게 된다. 이제 남은 일은 의심되는 주소 값들을 바꾸어 보면서 게임내에서 어떤 영향을 미치는지 알아보는 것이다.
9 Memory patchingDMA, code injection과 함께 쓰이는 경우가 많으며 어셈 지식이 필요하다. 예를 들어 총알의 갯수를 저장하는 주소가 100번지라는 것을 알아냈다고 하자. SoftIce로 100번지에 메모리 브포를 건다. 메모리 브포는 bpm 커맨드를 쓰며 브포 플래그에 읽기(r)나 쓰기(w)를 지정할 수 있다. 이때 주의할 것은 브포를 거는 영역이 게임 모듈 내라는 것을 확인하도록 한다. 소아 화면에서 커맨드 윈도우 오른쪽 하단부에 현재 모듈 네임이 디스플레이 되니 확인하도록 한다.
100번지에 메모리 브포를 걸었으면 게임으로 돌아가서 총을 쏴보자. 그럼 소아 화면이 나타나게 된다.
............. 0001: mov eax, [44] 0002: dec eax ---> 브포는 여기서 걸리게 된다. 0003: mov dword ptr [44], eax ............ 44번지에서 총알의 갯수를 가져와서 총알 갯수를 1 감소시킨다. 그리고 감소된 총알 갯수를 다시 44번지에 저장하는 모습을 볼 수 있다. 따라서 총알 갯수를 감소시키지 않게 하기 위해 "dec eax" 부분에서 단지 nop만 삽입하면 된다. 이것은 SoftIce에서 다음과 같이 입력하면 된다. asm 0002 nop 이렇게 해서 memory patching이 이루어지게 된다.
그러나 매번 게임을 실행할 때마다 SoftIce에서 이런 작업을 할 수는 없는 노릇이다. 이때에는 2가지 방법이 있는데, 첫번째는 trainer를 만들든지 두번째로 게임의 실행 파일이나 라이브러리 자체를 patch하는 것이다.

10 Excutable/Dll patching이 방법은 memory paching과 거의 흡사한 방법이다. 단지 patch된 내용이 영구적으로 지속된다는 점이 다를 뿐이다. 여기서는 위의 총알 갯수를 patch하는 예로 해커의 비장의 무기라 불리는 Hiew를 이용해 보자. Hiew에서 게임의 실행 파일을 로딩한다. F4키를 눌러서 "Decode"를 선택한다. 그리고 F5 (goto address)를 눌러 소아에서 추적했던 총알 갯수를 감소시키는 0002 번지를 입력한다. F3 (Edit)를 누르고 F2 (asm)를 눌러서 "nop" instruction을 입력한다. 그리고 Enter와 ESC를 차례로 누르고 F9 (Save)를 누르면 작업이 모두 끝난다.
주의 : 때론 어떤 게임에서는 생명치나 money등을 감소시키는 instruction이 .exe 내에 없고 .dll에 있는 경우가 있다. 이때는 소아 화면에서 해당 instruction의 offset을 보면 쉽게 알아볼 수 있다. 해당 instruction의 offset이 1XXXXXXX 형태일 때는 현재 dll 안에 있는 instruction이라고 볼 수 있다. 이것은 소아 화면에서 커맨드 윈도우의 오른쪽 하단에 나타나는 모듈 이름에서도 확인할 수 있다.

11 Techniques게임을 해킹하는 여러 테크닉들을 소개하면 다음과 같다.
11.1 총알, 생명치, 마나등 증감되는 수치를 알고 있는 경우
메모리 검색기(memory searcher)로 해당 값을 검색한다.
게임내에서 수치(총알, 생명치, 마나등)가 변경되는 행동을 한다.
메모리 검색기에서 검색한 수치내에서 변경된 값으로 재검색 한다.
검색된 결과 값이 2 - 3개로 좁혀질 때까지 반복한다.
남겨진 주소 값의 내용을 변경시켜 보고 게임에서 어떤 영향을 미치는지 확인한다.

11.2 에너지 바, 총알, 생명치, 마나등 정확한 값을 알 수 없는 경우
메모리를 dump한다.
게임 내에서 수치(총알, 생명치, 마나등)가 변경되는 행동을 한다.
dump한 메모리 중에서 수치가 변경된 주소를 검색한다.
검색된 결과 값이 좁혀질 때까지 반복한다.
남겨진 주소 값의 내용을 변경시켜 보고 게임에서 어떤 영향을 미치는지 확인한다.
참고 : 보통 full로 찬 에너지 바의 수치 값은 250 근방일 경우가 많다.

11.3 Instant Build Hacking Techniques
메모리를 dump한다.
게임 내에서 에너지 수치를 변경시키는 행동을 한다.
dump한 메모리에서 값이 감소된 주소(일반적으로 감소지만 드믈게는 증가되는 게임도 있다.)를 검색한다.
몇 개의 주소로 좁혀질 때가지 반복한다.
남겨진 주소 값의 내용을 변경시켜 보고 게임에서 어떤 영향을 미치는지 확인한다.

11.4 map이 저장되는 방식2D 전략게임인 경우 일반적으로 맵은 matrix 형태로 저장된다.
___________________________ a[1,1] a[1,2] .... a[1,n] a[2,1] a[2,2] .... a[2,n] ...............X......... -> X are your units, and that purple color means u see .....................X... the map in that place a[m,1] a[m,2] .... a[m,n] ----------------------------- 예를 들어 플레이어의 유닛이 a[5, 6]으로 이동한다면, 게임 엔진은 그 장소를 나타내는 matrix를 안개없는 지역(place_without_fog)으로 coded-byte를 집어 넣게 된다. (즉, matrix내에 0은 보이지 않는 지역, 1은 보이는 지역으로 나타낸다면 플레이어의 위치 x 주위를 1로 상태가 바뀌게 된다.) 플레이어의 유닛이 그 장소를 떠난다면 안개 지역(place_with_flog)으로 coded-byte를 삽입한다. (즉, 해당 위치를 나타내는 matrix에 0을 넣게 될 것이다.) 따라서 게임은 다음 2가지의 옵션이 있게 된다.

타이머에 따라 map을 refresh
플레이어의 유닛이 이동함에 따라 map을 refresh
물론 이것은 일반적인 경우이며 게임에 따라 map 상태를 저장하는 방식이 다를 수 있다.