aobscan() 명령에서 메모리 relocation이 일어나는 코드를 제외하고 '48 89 47 60 83 EC 0C 57 E8'를 검색하도록 한다. 원래는 89부터 시작이었으나 1바이트 전의 48부터 시작했으므로 스크립트에는 INJECT+1을 사용했다.
이렇게 하는게 싫다면 와일드카드 캐릭터를 적용해서 검색한다. (x, ?, *)
처음에 찾은 옵코드가 HP에 변화가 생기는 순간 실행되는 명령이기 때문에 항상 HP를 감시하지는 않는다. 하지만 게임을 종료하고 다시 실행해 메모리 주소에 변화가 생겨도 언제나 올바른 HP 값을 표시하고 변경할 수 있다. 위 그림에서도 확인할 수 있듯이 처음에 찾은 HP 메모리 주소(149CDB50)는 게임이 다시 시작되어 무효한 값이 되었지만 [HP] 심볼로 추가한 메모리 주소는 스크립트 덕분에 언제나 올바른 HP 메모리(149CDC18)를 가리킨다.
치트 엔진으로 게임에서 수정하고 싶은 값의 주소를 찾아도 게임을 다시 실행시키면 그 주소가 변경되어 처음부터 다시 진행해야만 하는 경우가 있다.(포인터 등으로 해결 불가) 예를 들어 도스박스로 고전 게임을 실행시키는 경우 값의 주소가 변경될 뿐만 아니라 그 값을 기록하는 명령이 다른 여러 주소에 접근하기 때문에 쉽게 에디터를 만들 수가 없다.
Tutorial-i386.exe+25B1E: 8D 85 D4 FE FF FF - lea eax,[ebp-0000012C]
}
{}와 //의 내용은 주석이므로 설명하지 않는다.
1
2
3
4
5
//// -------- Main Section --------
[ENABLE]
//// -------- Enable Section --------
[DISABLE]
//// -------- Disable Section --------
전체 내용은 위와 같이 [ENABLE]과 [DISABLE]을 기준으로 Main, Enable, Disable 섹션으로 나눌 수 있다. Main 섹션은 항상 실행된다. Enable 섹션은 스크립트를 실행하면(Cheat Table Address List에서 Active 체크 박스를 클릭해서 선택하면) 실행된다. Disable 섹션은 스크립트를 정지하면(Active 체크 박스 선택 해제하면) 실행된다.
aobScanModule(SymbolName, ModuleName, AOBString) - Scans the memory used by the module ModuleName for a specific byte pattern defined by AOBString and sets the resulting address to the symbol SymbolName.
지정된 모듈(Tutorial-i386.exe)에서 특정 바이트 패턴(29 83 B0 04 00 00)이 있는 메모리 영역을 찾는다. 만약 찾으면 그 주소를 심볼(INJECT)로 세팅한다. 3개의 캐릭터를 와일드카드로 사용할 수 있다. 'x', '?', '*'
alloc(SymbolName, Size, AllocateNearThisAddress OPTIONAL) - Allocates a memory block of Size bytes and defines the SymbolName in the script, pointing to the beginning of the allocated memory block.
지정한 사이즈(1000)의 메모리 블럭을 할당하고 시작 주소를 심볼(newmem)로 정의한다. ($1000은 16진수 1000을 의미한다)
dealloc(newmem)
dealloc(SymbolName) - Deallocates a block of memory allocated with alloc.
alloc()으로 할당된 메모리 블럭(newmem)을 해제한다.
registersymbol(INJECT)
registerSymbol(SymbolName) - Adds a symbol to the user-defined symbol list so cheat tables and the memory browser can use that name instead of an address.
심볼(INJECT)을 사용자 정의 심볼 리스트에 추가한다. 추가된 심볼은 치트 테이블과 메모리 브라우저에서 주소 대신 사용할 수 있다.
unregistersymbol(INJECT)
unregisterSymbol(SymbolName) - Removes a symbol from the user-defined symbol list.
사용자 정의 심볼 리스트에서 심볼(INJECT)을 제거한다.
label(code)
label(LabelName) - Enables the word 'LabelName' to be used as a symbol.
지정된 단어(code)가 심볼로 사용될 수 있게한다.
※ 참고 1
aobScan(SymbolName, AOBString) - Scans all the memory for a specific byte pattern defined by AOBString and sets the resulting address to the symbol SymbolName.
메모리에서 특정 바이트 패턴(AOBString)을 찾고 그 주소를 심볼(SymbolName)로 지정한다. 3개의 캐릭터를 와일드카드로 사용할 수 있다. 'x', '?', '*'
assert(Address, ArrayOfBytes) - Will check the memory address for the given bytes. If the address's memory is not what is defined by the array of bytes given, the auto assemble script will not execute.
지정된 Address에 ArrayOfBytes가 있는지 확인한다. 만약 없다면 auto assemle script는 작동하지 않는다.
ex) assert(Game.exe+123ABC, 01 02 03 0A 0B 0C)
globalAlloc(Symbol, Size, AllocateNearThisAddress OPTIONAL) - Allocates a certain amount of memory and registers the specified name. Using GlobalAlloc in other scripts will then not allocate the memory again, but reuse the already existing memory. (Or allocate it anyhow if found it wasn't allocated yet) If 'AllocateNearThisAddress' is specified CE will try to allocate the memory near that address. This is useful for 64-bit targets where the jump distance could be bigger than 2GB otherwise. 지정한 사이즈의 메모리를 할당하고 할당된 메모리 주소를 이름(Symbol)으로 등록한다. 등록된 메모리 이름은 다른 스크립트나 메모리 뷰어에서 사용할 수 있다.
define(Name, Value) - Creates a token with the specified name that will be replaced with the text of its value. Note: Uses basic replacement before script is ran, whitespace is not stripped.
스크립트가 실행되기 전 교체될 텍스트 토큰을 생성한다.
ex 1)
아래 코드가.. define(address, 00 12 3A BC) ... address: db 90 90 90
이렇게 바뀐다. 00 12 3A BC: db 90 90 90
ex 2)
아래 코드가.. define(fullValue,(float)100.0) ... mov eax,fullValue