메모리 종류 :

1. 메인(Main) 메모리 : 램(RAM) (D램)

2. 레지스터(Register) : CPU 안에 내장되어 있어서 연산을 위한 저장소 제공

3. 캐쉬(Cache) : S램.  CPU와 램사이에서 중간 저장소 역할

4. 하드디스크(Hard Disk)와 이외 장치 : 하드 디스크, I/O 장치 등등



메모리 계층 구조(Memory Hierarchy) :


메모리들은 프로그램이 실행하는 동안 데이터의 입력 및 출력을 담당한다.

메모리들의 차이는 CPU 와의 거리에서 온다.

CPU와의 거리가 가까울수록 빠르고 용량이 작으며 멀수록 느리고 용량이 크다.(기술과 돈의 문제)

하드디스크에 있는 내용은 프로그램의 실행을 위해 메인 메모리로 이동한다.

메인 메모리에 있는 일부 데이터도 실행을 위해 L2 캐시로 이동한다.

L2 캐시에 있는 데이터 일부는 L1 캐시로 이동한다.

L1 캐시에 있는 데이터중 연산에 필요한 데이터는 레지스터로 이동한다.


반대로 연산에 필요한 데이터가 레지스터에 없으면 L1 캐시를 살펴본다. 없으면 L2캐시 없으면 메인 메모리,

그래도 없으면 하드디스크를 참조한다. 하드디스크에서 데이터를 찾은 후 다시 메인 메모리 L2 캐쉬 L1 캐시를 거쳐

레지스터로 데이터가 들어오게 되는데 이경우 극심한 속도저하가 발생한다.

(참고 :

캐시를 없애 중간단계를 줄이는 것이 속도가 빠르지 않냐 생각할수 있는데
L1 캐시와 L2 캐시에, 연산에 필요한 데이터가 존재할 확률이 90% 이상이다.따라서 캐시는 속도향상에 도움을 준다)



L1 캐시와 L2 캐시 :

시스템의 성능을 좌우하는 클럭속도는 느린쪽에 맞춰진다.

CPU는 고속화되었지만 메인 메모리의 처리속도는 이를 따라가지 못한다.

CPU가 연산을 하기 위해선 데이터를 가지고 와서 연산을 한 후 연산결과를 메모리에 저장한 후에

다음작업을 수행할 수 있다.

따라서 아무리 CPU가 빠르게 연산을 수행한다 하더라도 데이터를 가지오고 저장하는 작업이 느리다면

전체적인 처리속도는 결코 빠를수 없다.

L1캐시는 이러한 레지스터와 메인 메모리간의 속도차이에 의한 성능저하를 막기 위해

메인 메모리의 저장된 데이터 중 자주 접근하는 데이터를 저장한다.

L1 캐시는 CPU 내부에 존재하므로 L1 캐시에서 데이터를 참조할 경우 속도저하는 발생하지 않는다.

하지만 여전히 L1 캐시는 메인 메모리의 모든 데이터를 저장할 수 없기에 L1 캐시에 없는 데이터를

CPU가 요구할 경우 속도의 저하로 이어진다.

따라서 캐시를 하나 더둔다.(L1 캐시에 용량을 증가시키는데ㄷ에도 한계가 있다(돈과 기술))

L2 캐시까지 존재함으로써 메인 메모리에 대한 접근은 더욱 줄어든다.

따라서 병목현상은 L1캐시와 메인 메모리에서 L2 캐시와 메인 메모리로 발생지역이 옮겨지게 된다.



캐쉬(Cache)와 캐쉬 알고리즘 :

템퍼럴 로컬리티(Temporal Locality) : 한번 접근이 이뤄진 주소의 메모리 영역은 자주 접근한다.

스페이셜 로컬리티(Spatial Locality) : 접근하는 메모리 영역은 이미 접근이 이루어진 영역의 근처일 확률이 높다.

캐시 프렌드리 코드(Cache Friendly Code) : 템퍼럴 로컬리티와 스페이셜 로컬리티를 최대한 활용하여
                                                             캐시의 도움을 받을수 있도록 구현한 코드



캐시 알고리즘 :


캐시 힛(Cache Hit) : 연산에 필요한 데이터가 L1 캐시에 존재할 경우


캐시 미스(Cache Miss) : 연산에 필요한 데이터가 L1 캐시에 존재 하지 않을 경우
(참고 : 이경우 L2 캐시를 검사하며 L2 캐시 미스가 발생하면 메인 메모리에서 데이터를 가져온다)


데이터의 이동은 블록 단위로 진행하여 스페이셜 로컬리티의 특성을 성능향상에 활용한다.
(예 : 0x10000 번지의 데이터를 요청하면 0x10000을 포함한 블록 전체가 전송된다)

(참고 : 현재 L2 캐시는 CPU 내부에 존재한다)

메모리 계층 아래로 갈수록 전송되는 블록 크기가 커진다.

아래에 존재하는 메모리에 대한 접근 횟수를 줄여준다.


캐시 교체 정책(Cache's Replacement Policy) :

프로그램이 실행된느 동안 모든 메모리는 항상 채워져 있다.

메모리가 꽉 채워져 있어요 요구하는 데이터를 가지고 있을 확률이 높아지기 때문이다.

이때문에 가지고 있지 않은 데이터를 요구할 경우 메모리가 꽉 찾기 때문에 메모리 블록을 교체해야 한다.

블록 교체 알고리즘은 캐시 교체 정책에 의해 달라진다.
(참고 :

대표적 블록 교체 알고리즘 :
LRU(Least-Recently Used) : 가장 오래 전에 참조된 블록을 밀어내는 알고리즘)

'Windows > _System Programming' 카테고리의 다른 글

StackBasedOverflows-Windows-Part1 (기본 개념)  (2) 2011.06.07
메모리 컨트롤  (0) 2010.03.24
메모리 계층(Memory Hierarchy)  (0) 2010.03.24
MMF(Memory Mapped File)  (0) 2010.03.12
라이브러리(Library)  (0) 2010.03.11
비동기 I/O 와 APC  (0) 2010.03.08
Posted by Dakuo

개념 : File 을 Memory 에 Mapping(연결)


가상 메모리 중 파일에 연결되어 있는 영역에 데이터를 저장한다.

이렇게 메모리에 저장된 데이터는 실제 파일에도 영향을 미친다.

즉, 데이터가 메모리뿐만 아니라 메모리에 연결된 파일에도 저장되는 것이다.


장점 :

1. 프로그래밍 편리 : 메모리상에 저장된 데이터를 조작하는 방식으로 파일 내 데이터를 조작할 수 있다.

2. 성능 향상 : 메모리는 중간에서 파일과 데이터의 캐쉬 역할을 하여 성능을 향상시킨다.





MMF 구현 :

1. 파일 개방 : CreateFile()

2. 파일 연결 오브젝트 생성 : CreateFileMapping()

HANDLE CreateFileMapping(
          HANDLE hFile,                                        // 메모리에 연결할 파일의 핸들
          LPSECURITY_ATTRIBUTES lpAttributes,    // 보안속성
          DWORD flProtect,             // 파일과 연결된 메모리의 접근권한
                                               // PAGE_READONLY : 읽기만 가능
                                               // PAGE_READWRITE : 읽기 쓰기 가능
                                               // PAGE_WRITECOPY : 데이터를 쓸때 복사한다
                                               // SEC_COMMIT , SEC_RESERVE. 비트 단위 OR 연산으로 함께 설정가능        DWORD dwMaximumSizeHigh,                 // 연결할 메모리 최대 크기의 상위 4바이트
                                                                       // 4GB 이상이 아니라면 0
          DWORD dwMaximumSizeLow,                 // 연결할 메모리 최대 크기의 하위 4바이트
                                                                      // 0 전달 : 첫번째 인자로 전달된 핸들의 파일 크기
          LPCTSTR lpName                                   // 파일 연결 커널 오브젝트의 이름
);


3. 가상 메모리에 파일 연결 : MapViewOfFile()

LPVOID MapViewOfFile(
          HANDLE hFileMappingObject,       // 파일 연결 커널 오브젝트의 핸들
          DWORD dwDesiredAccess,          // 연결된 메모리의 접근 권한
          DWORD dwFileOffsetHigh,             // 메모리에 연결할 파일의 오프셋(시작 위치)의 상위 4 바이트 지정
          DWORD dwFileOffsetLow,             // 메모리에 연결할 파일이 오프셋의 하위 4 바이트 지정
          SIZE_T dwNumberOfBytesToMap // 메모리에 연결할 실제 크기를 바이트 단위로 지정
);                                                         // 오프셋을 기준으로 지정된 바이트만큼 메모리에 연결.
                                                            // 0 전달시 오프셋부터 파일의 끝까지 메모리에 연결

4. 해제 : UnmapViewOfFile()

BOOL UnmapViewOfFile(
          LPCVOID lpBaseAddress  // 연결 해제할 메모리의 시작 주소 (MapViewOfFile 함수 호출시 반환된 주소값)
);


(추가 : 메모리에 캐시된 데이터를 즉각 파일에 저장하는 함수 :

BOOL FlushViewOfFile(
          LPCVOID lpBaseAddress,                         // 파일에 저장할 메모리의 시작 주소
          SIZE_T dwNumberOfBytesToFlush            // 파일에 저장할 데이터 크기를 바이트 단위로 지정
);                                                                     // 0 전달 : 연결된 메모리 영역의 끝까지 파일로 저장)

예제보기




Copy-On-Write(COW) :

개념 : 데이터를 쓸때 복사한다

기본 데이터를 참조하다가 변경이 필요할 때 데이터를 복사해서 저장하며 그 이후부터는 복사본을 참조한다.

(참고 : 원본 데이터는 보존된다)


구현 :

CreateFile 함수를 호출할때 읽기/쓰기모드로 개방한다.

CreateFileMapping 함수의 세번째 인자를 PAGE_WRITECOPY 로 설정한다.

MapViewOfFIle 함수의 두번째 인자를 FILE_MAP_COPY 로 설정한다.

'Windows > _System Programming' 카테고리의 다른 글

메모리 컨트롤  (0) 2010.03.24
메모리 계층(Memory Hierarchy)  (0) 2010.03.24
MMF(Memory Mapped File)  (0) 2010.03.12
라이브러리(Library)  (0) 2010.03.11
비동기 I/O 와 APC  (0) 2010.03.08
디렉터리 컨트롤  (0) 2010.03.08
Posted by Dakuo

시스템 프로그램(System Program)

: 컴퓨터 시스템을 동작시키거나 하드웨어를 사용할 수 있도록 도와주는 프로그램



1. 컴퓨터 시스템의 주요 구성요소(Main Components)

컴퓨터 구조(Computer Architecture) : CPU <-> 캐쉬(Cache)
                                     
                                           ↕

운영체제(Operating System) : 메인 메모리(Main Memory) <-> 하드디스크(Hard Disk)



2. 컴퓨터 구조 :


1) CPU : 중앙처리장치(Central Processing Unit)

ALU(Arithmetic Logic Unit) : CPU 내부에 실제 연산을 담당하는 부분. 산술연산(+, -)과 논리연산(AND, OR)을 수행

컨트롤 유닛(Control Unit) : CPU 내부로 들어온 명령어를 해석해서 ALU 에게 전달한다.

레지스터(Register Set) : CPU 내부에 임시적으로 데이터(2진 데이터 : Binary Data, CPU에 따라 16, 32, 64 비트
저장가능)를 저장하기 위한 메모리 공간

버스 인터페이스(Bus Interface) : CPU 내에 I/O 버스의 통신 프로토콜(Protocol)을 이해하고 있는 장치

클럭 신호(Clock Pulse) : 클럭발생기에 의해 발생되며 이 신호에 맞춰 CPU를 구성하는 요소들이 일을 한다. 

(추가  : 클럭신호의 필요성(동기화)


위와 같은 그림에서 만약 클럭 신호가 없다고 가정하고 각각의 작동의 속도가 다르다고 가정하자.

예상 작동 : input 1에서 1, input 2에서 2의 숫자가 입력됬다. +연산장치가 연산을 해서 버퍼에 넘기고 출력장치가 버퍼에 있는 값을 읽어 3이라는 값을 출력했다

실제 작동 : input 1에서 1, input 2에서 2의 숫자가 입력됬다. 하지만 +연산을 하기도 전에 출력장치가 버퍼(Buffer)에 있는 쓰레기 값을 읽어 출력해버렸다.

여기서 + 연산의 속도와 출력장치가 버퍼를 읽는 속도의 차이 때문에 정상적으로 작동을 하지 못했다.
즉 장치마다의 속도차이가 존재하기에 동기화가 필요한것이다.
따라서 속도가 느린 장치에 맞춰 일을 시키면 정상적으로 작동을 할것이다.

동기화 작동 : input 1에서 1, input 2에서 숫자가 입력됬다. 클럭신호를 + 연산장치에 맞춰놓아서 +연산이 될때 출력장치가 버퍼의 3을 읽어와 출력을 한다)


2) 메인 메모리(Main Memory)

컴파일이 완료된 프로그램 코드가 올라가서 실행되는 영역


3) 입 · 출력 버스(Input / Output Bus)

컴퓨터를 구성하는 요소 사이에서 데이터를 주고 받기 위해 사용되는 경로이다.

버스 시스템(Bus System)은 데이터 종류에 따라

1. 데이터 버스(Data Bus) : 데이터를 이동하기 위한 버스(명령어, 피연산자 등)

2. 어드레스 버스(Address Bus) : 주소값을 이동하기 위한 버스

3. 컨트롤 버스(Control Bus) : 명령을 주고 받는 버스

예)

CPU : "데이터 보내"                              // 컨트롤 버스
Memory : "몇번지에 있는 데이터?"          // 컨트롤 버스
CPU : "0x000012"번지                            // 어드레스 버스
Memory : "20"                                      // 데이터 버스



3. 프로그램 실행 과정

1단계 : 전처리기 -> 컴파일러 -> 어셈블러 -> 링커 -> 실행파일

2단계 : 실행파일 -> 로드 -> 메모리

3단계 : 메모리 -> Fetch -> Decode -> Execution


1단계(실행파일 작성) :

1. 전처리기 : '#'으로 시작하는 지시자의 지시에 따라서 소스코드를 변경한다.
                   (참고 : #pragma지시자 는 - #이 붙어있어서 전처리 명령처럼 보이지만 컴파일러 지시자이다)

2. 컴파일러 : C 언어 등으로 구성된 전처리기를 거친 소스코드를 어셈블리 코드로 번역한다

3. 어셈블러 : 어셈블리 코드를 CPU가 이해할수 있는 바이너리 코드로 바꾸어 준다.

(참고 : 바이너리 코드(Binary)와 어셈블리 코드(Assembly)

CPU를 디자인하는 개발자가 만약 덧셈 명령어를 1111 이라고 정했다고 치자. 만약 1+2를 시킨다면
0001 1111 0010  이런 코드(바이너리 코드)를 구성해야 하는데 이것은 매우 알아보기 힘들다.

따라서 이걸 사람이 좀더 보기 쉽게

1111 를 ADD 로 하기로 하고 표를 만들어 둔다. 이제 소스를 작성할때 1+2를 시킨다면
0001 ADD 0010 이런식으로 작성하면 된다.(한결 보기 쉬울것이다) 이것이 어셈코드이다.

어셈블러는 이런 표를 참조해 ADD -> 0011 로 바꾸는 작업을 하는 프로그램이다)


4. 링커 : 프로그램 내에서 참조하는 함수나 라이브러리들을 하나로 묶고 연결시켜주는 작업을 한다.
(1단계를 마치면 실행파일이 생성된다. (바이너리 코드로 구성되있다))


2단계(실행파일 실행) :

실행파일을 실행시키면 메모리에서 로드(Load)를 해서 이 실행파일의 코드(바이너리 코드)들이 메모리에 저장된다.


3단계(실제 작동) :

1. Fetch : 메모리상에 존재하는 명령어를 CPU로 가져 오는 작업이다.(레지스터에 일단 저장한다)

2. Decode : 가져다 놓은 명령어를 CPU가 해석하는 단계이다.(컨트롤 유닛에서 수행한다)

3. Execution : 해석된 명령어대로 CPU가 실행한다.(ALU에서 수행한다)

Posted by Dakuo
메모리 패치(Memory Patch) : 윈도우 운영체제가 사용중인 메모리 값들을 검색해서 원하는 값으로 변경을 하는 것

유명한 툴로는 티서치(Tsearch)와 치트엔진(Cheat Engine)이 있다.


티서치(Tsearch) :

1. 메모리 값 수정
2. 어셈코드를 추가해 넣는 코드인젝트(Code Inject)
3. 바이너리 수정(Hexedit)
4. 동적 메모리 할당(DMA) 방식의 메모리 값 수정

티서치를 이용하여 간단한 메모리 값 수정을 해보겠다.

그 외의 기능은 Help메뉴를 실행하면 제작자가 메뉴얼을 스샷과 예제 파일까지 포함시켜 쉽게 익힐 수 있다.



1. Open Process
2. 메모리의 특정 값 검색
3. 메모리 주소를 검색한 결과창
4. 메모리 주소의 값을 수정하는 곳

원하는 메모리 값으로 변경하는 방법은 OpenProcess(1)로 현재 실행되어 있는 프로그램을 선택하고, 돋보기(2)를 눌러서 메모리상의 특정 값을 검색하고, 메모리 주소 검색 결과 창에서 실제 메모리 주소를 선택하고, 해당 메모리 주소지의 Value를 변경한다.

예제로 윈도우 기본 프로그램인 카드놀이의 점수를 수정해 보겠다.

 

현재 점수는 45점이다. Tsearch를 실행하고 Open Process로 카드게임 프로세스인 Sol.exe를 선택한다.

돋보기 모양의 Init New Search를 클릭하면



검색 옵션은 Tpye에 1, 2, 4, 8, float, double이 있다.
1 byte : 255/2byte : 65535/4byte : 4294967295

Search에 Exact Value(정확한 값), Range(범위 값), Unknown Value(무조건 생성되는 값) 세가지이다.

45로 검색하면


10개의 메모리 주소가 검색이 되었다. 이 중에 어떤 것인지 찾기 위해 검색 내 검색을 해준다.

돋보기 ..(Next Search)을 선택하고, 카드 게임의 점수를 변경하고 그 값을 검색한다.

재검색창은 일반검색과 옵션이 다르다.

Exact Value : 정확한 값을 알고 있을 때 사용

Has Changed : Search된 value 중에 값이 변경된 것들만 재검색

Has not Changed : Search된 value 중에 값이 변경되지 않은 것들만 재검색

Has Increased : Search된 value 중에 값이 증가된 것들만 재검색

Has Decreased : Search된 value 중에 값이 감소된 것들만 재검색

Range : Search된 value의 범위를 지정하여, 지정된 value를 추출한다.

Increased by : Search된 value 중에서 특정 value 만큼 증가된 value를 찾아준다.

Decreased by : Search된 value 중에서 특정 value 만큼 감소된 value를 찾아준다.

Increased by more than% : Search된 value 중에서 %보다 많이 증가한 value를 찾아준다.

Decreased by more than% : Search된 value 중에서 %보다 많이 감소한 value를 찾아준다.

Increased by less than% : Search된 value중에서 %보다 적게 증가한 value를 찾아준다.

Decreased by less than% : Search된 value중에서 %보다 적게 감소한 value를 찾아준다.


점수가 32일 때 재검색하니 검색 결과가 하나가 되었고, 게임점수가 변함에 따라 refresh되면서 값도 자동으로 게임 점수와 같아진다.


더블클릭하면 우측에 목록이 뜨는데 value를 수정할 수 있다. 체크박스를 체크하면 설정한 값으로 해당 주소의 값을 고정시키는 기능을 한다.
(참고 : value에 -1을 입력하면 각 byte마다 가지는 최대값이다) 

우측창에 메모리 주소를 목록으로 만들어서 저장해놓고, 불러와서 사용할 수도 있다.

value를 천만으로 수정하고 확인해보면


점수가 천만 점이 된것을 볼수 있다.



치트엔진(Cheat Engine) :

델파이로 제작된 툴로써 줄여서 CE라고 부른다.


컴퓨터 모양의 아이콘을 클릭하면 Process List가 나타나고


프로세스를 숨겨놓은 경우에는 Windows List를 선택하여 윈도우 창을 기준으로 확인할 수 있다.
프로세스를 선택하면 해당 프로세스의 메모리들을 검색하여 원하는 값을 수정할 수 있다.


예제로 윈도우 기본 프로그램인 핀볼의 점수를 수정해 보겠다.
게임실행 후 Process List에서 PINBALL.exe를선택한다.

점수를 치트 엔진의 Value에 입력하고 New Scan을 클릭한다.


2개의 메모리 주소가 검색되었다.
티서치와는 다르게 재검색 옵션에 Same as First Scan 옵션이 있어서 처음 값과 비슷한 값을
검색해준다.


주소값을 더블클릭하면 하단의 리스트 창에 추가되며, 주소지 설명과 Value값 수정을 할 수 있다. 두 값의 Value를 바꿔가며 실험해보니 007F4872가 핀볼점수 값이다.

Frozen(고정 값)이 있는데 체크를 해주면 해당 값으로 고정된다.
Value에 1억점을 입력해보니까 1억점으로 점수가 변경되었다.


이제 어떤 부분이 점수를 더하는 부분인지를 찾아서 흐름을 직접 수정하겠다.

하단의 Value 목록 창의 우클릭 메뉴에서 Find out What writes to this address 를 선택한다.
(참고 : Find out What accresses this address를 선택하면 해당 주소지에 접근하는 좀 더 포괄적인 범위를 탐지한다)

그러면 점수가 변화되는 시점에서 어느 부분이 변경되는지 주소를 찾아준다.
비어있는 상태로 목록이 뜨고 점수에 변화를 주게 되면 다음과 같이 주소가 잡힌다.


점수가 변경되는 시점에서 add 명령이 있었으므로 점수를 더해가는 것임을 알 수 있다.
주소를 선택하고 Show disassembler 버튼을 눌러 분석하겠다.


치트엔진이 메모리 값의 변화를 감지해서 해당 주소지 부분부터 디버깅 할 수 있도록 준 것이다. 우측에 레지스터 값들을 확인할 수 있고, 상단 메뉴의 디버깅 메뉴를 이용해서 Breakpoint를 걸어서 단계별로 값들을 확인할 수 있다.

단축키는 올리디버거와 비슷하게 설정되어 있다.

이제 코드를 수정해서 점수를 고쳐보겠다. 수정할 주소를 선택하고 Tools->Assemble 선택한다.


Auto assemble 창에서 Template->Code Injection을 선택하면 선택했던 주소지를 기준으로 해서 코드를 생성해주고, 원하는 어셈코드를 넣을 수 있는 부분을 표시해준다.
코드를 주입할 주소를 적는 부분은 선택했던 주소지가 자동으로 들어가 있다. OK를 누르면 코드가 생성된다.

alloc(newmem,2048) //2kb should be enough    // 2kb만큼 코드를 삽입할 공간 확보
label(returnhere)
label(originalcode)
label(exit)

0101757C:         // 코드를 변경할 위치
jmp newmem   // newmem 레이블로 점프 5바이트
nop
nop
nop
nop
nop                 // originalcode와 사이즈를 맞추기 위해서 nop 5개, 5바이트로 한다.
returnhere:           그러면 원래 점수를 추가하는 주소에서는 newmem으로 점프를 해서
                          입력한 어셈코드가 실행된다.

newmem: //this is allocated memory, you have read,write,execute access             
//place your code here
코드 입력할 부분

originalcode:
add [eax],esi                     // eax의 값에 esi를 더한다.
mov edx,[eax]                   // edx에 eax의 값을 넣는다.
cmp edx,3b9aca00              // edx와 3b9aca00 비교

exit:
jmp returnhere

점수를 추가로 더하는 코드를 작성하겠다.

newmem :
add [eax], esi                  // eax의 값에 esi를 더한다. 
add [eax], 100000             // eax의 값에 100000을 더한다. 
mov edx, [eax]                // edx에 eax의 값을 넣는다.
cpm edx, 3b9aca00           // edx와 3b9aca00 비교

오리지널 코드의 순서를 그대로 유지한 채 add [eax], 100000 한 줄만 추가됐다.
Execute 버튼을 누르면 어느 메모리 영역에 자신이 Code injection 한 것이 들어가게 되는지 알려준다.

00A20000, 이 부분에 newmem에 추가한 코드들이 추가되어서 핀볼 점수가 추가되는 부분에서 입력한 코드들이 실행된다.
메모리 뷰어를 보면 기존 코드들이 다음과 같이 변경된 것을 볼 수 있다.


01017593 주소지로 가보면(Ctrl+G) 추가했던 코드들을 볼 수 있다.


입력했던 값들이 00A20000부터 정의가 되어있고, 00A20010부터는 원본 코드가 있다.
가장 중요한 부분은 jmp 01017586인데 처음에 점수가 추가되는 부분의 위치가 0101757C였고, 10바이트 다음인 01017586으로 다 시 되돌리는 것이다.

입력한 코드가 실행되고, 그 후에 원본 코드가 실행되고, 원래 있었던 위치로 다시 jmp하는 순서다.



이외에도 치트엔진에는 메모리치트, 디버거, DLL 인젝션, 코드인젝션 등이 있다.
또 치트엔진은 오픈 소스 이기 때문에 변형된 버전이 많이 존재한다.

'Tool' 카테고리의 다른 글

네트워크 모니터링 툴(Network-Monitoring Tool)  (2) 2009.11.26
바이너리 분석  (1) 2009.11.07
메모리 패치(Memory Patch)  (1) 2009.11.07
디컴파일러(Decompliers)  (0) 2009.11.07
아이다(IDA)에 MS 심볼 서버 연동하기  (9) 2009.11.06
아이다(IDA)에 Hex-Ray 연동  (9) 2009.11.06
Posted by Dakuo


티스토리 툴바