LP플레이어 같은 앱 플레이어는 치트엔진으로 포인터 스캔이 안 됩니다.
포인터가 없어 매번 찾아 줘야 하는 귀찮은 일이 생기니
대책으로 바이트 스캔하는 방법이 있습니다.
앱 플레이어에 국한되는 것이 아닌 모든 게임에 적용가능합니다.
앱 플레이어는 전용 Handle을 잡아야 합니다.
바이트 스캔이란
Array of byte로 메모리 스캔을 하는 겁니다.
해석해 보면 연속된 바이트(바이트 배열) 찾기로 알면 됩니다.
메모리 뷰로 확인하면
Byte열을 보면 6C 42 6F 78 20 들이 바이트 배열
4D 5A 80 00 01 00 00 들이 바이트 배열인걸 알 수 있습니다.
이런 바이트 배열을 스캔해서 값을 찾는 것을
Signature Scan, Pattern Scan이라고도 합니다.
패턴 찾기
만약 골드 값을 바이트 스캔하고 싶으면 골드 값을 찾고
메모리뷰로 주변 메모리를 확인해 줍니다.
아래쪽 메모리뷰에서 우클릭 -> Display Type -> 원하는 타입선택으로
타입별로 가독성 있게 값을 볼 수 있습니다.
인 게임의 여러 가지 상황에서
값변화를 주면서 메모리 분석을 하고
비슷한 메모리 패턴을 찾으면
(게임 초반 골드, 골드를 사용했을 때 변화, 고정돼 있는 값은 무엇인가)
박스 친 곳이 스캔 대상이 될 수 있습니다.
바이트 수정
이제 Display Type을 Byte hex로 바꾸고
바이트들을 복사해 메모장에 붙여 넣기 해줍니다.
FF FF FF FF 00 00 00 00 00 16 43 00 00 16 43 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2A 78 7B 43 00 00 8C 42
FF FF FF FF 01 00 00 00 00 C8 42 00 00 C8 42 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 00 00 00 02 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2C 23 7C 44 00 00 F0 42
그리고 바이트들을 비교하며
변경될 수 있는 값에 치트엔진이 사용하는
와일드카드 기호 "?"를 넣어 줘야 합니다.
변경될 수 있는 값은 메모리뷰를 보면서 분석하셨겠죠.
여기서 와일드카드는
정해진 바이트가 아니어도
값을 포함한다는 말입니다.
- 예시로 보여주면
FF FF FF FF 00 00 00 00
FF FF FF FF 01 00 00 00
비교했을 때 변경될 수 있는 값이 있으니 ?를 넣어줍니다.
FF FF FF FF ? 00 00 00
그럼 00이나 01이나 02, 03, 0C, ...
상관없이 전부 검색한다는 뜻입니다.
- 다음 바이트
00 00 16 43 00 00 16 43 00 00 00 00
00 00 C8 42 00 00 C8 42 00 00 00 00
와일드카드를 넣을 수도 있겠지만
분석결과 난이도에 따른 초반 보유골드라
스캔에 더 유리하겠죠
난이도에 따라 그대로 사용해 줍니다.
- 다음 바이트
00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00
처음에는 0 고정이라 그대로 사용
- 다음 바이트
01 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
02 00 00 00 02 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
4바이트마다 변경되는 곳이 있고
다른 곳도 변경 가능성 있음
4바이트마다 ? 넣기
? 00 00 00 ? 00 00 00 ? 00 00 00 ? 00 00 00 ? 00 00 00 ? 00 00 00 ? 00 00 00 ? 00 00 00 ? 00 00 00 ? 00 00 00 ? 00 00 00 ? 00 00 00 ? 00 00 00 ? 00 00 00 ? 00 00 00
- 다음 바이트
2A 78 7B 43 00 00 8C 42
2C 23 7C 44 00 00 F0 42
처음 4바이트는 바뀌고
다음 4바이트는 초반에 00 00 F0 42으로 고정
그대로 사용
완성된 바이트 배열
00 00 C8 42 00 00 C8 42 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ? 00 00 00 ? 00 00 00 ? 00 00 00 ? 00 00 00 ? 00 00 00 ? 00 00 00 ? 00 00 00 ? 00 00 00 ? 00 00 00 ? 00 00 00 ? 00 00 00 ? 00 00 00 ? 00 00 00 ? 00 00 00 ? 00 00 00 ? ? ? ? 00 00 F0 42
각자 완성한 바이트 배열로 스캔을 해보면
여러 값이 검색될 수 있는데 바이트를 추가로 찾아
검색 값을 줄이거나 전부 바꿔주는 방법으로 사용해도 됩니다.
스크립트 만들기
간단하게 체크해서 자동으로 찾고
바꿔주는 스크립트를 만들 수 있습니다.
Memory View를 열어주고
ctrl + a를 눌러 Auto Assemble을 열어주거나
Tools -> Auto Assemble을 선택해 줍니다.
Template에서 스크립트 기본틀을 선택할 수 있습니다.
저는 직접 입력했습니다.
스크립트를 해석해 보면
- AoBScan 함수로 스캔 -> AoB 변수에 저장(결과가 여러 개 저장됨)
- AoB.Count로 scanTotal 변수에 스캔한 값 개수를 받아옵니다.
- for문으로 스캔한 개수만큼 반복
- registerSymbol로 Gold이름으로 주소를 사용할 수 있게 해 줍니다.
- writeFloat로 골드 주소 999로 변경
- 체크해제 할 때 정리
-- [ENABLE] : Active 버튼을 눌렀을 때 [ENABLE] 섹션의 코드가 실행됨
-- {$lua} : 스크립트 엔진에 의해 실행되도록 하는 태그
-- AOBScan : 바이트 배열 검색
-- .Count : 총 개수를 가져오는 객체의 속성
-- registerSymbol : 특정 메모리 주소나 값을 심볼로 등록하는 기능,
-- 해당 심볼 이름을 사용하여 메모리 주소나 값을 참조할 수 있음
-- unregisterSymbol : 심볼 삭제
-- for : 반복문, 마지막은 증가값으로 i가 증가하는 값을 설정
-- do : 반복문이나 조건문과 함께 사용, 특정 코드 블록의 시작을 나타냄
-- end : 코드 블록의 끝을 표시
-- tostring : 문자열로 변환
-- .. : 문자열을 연결
-- writeFloat : 메모리 주소에 float값을 쓰기
-- .destroy() : 객체를 제거
{$lua}
[ENABLE]
-- 골드 바이트배열 스캔
AoB = AOBScan('00 00 C8 42 00 00 C8 42 00 00 00 00 00 00 00 00 00 00 00 00 ?? 00 00 00 ?? 00 00 00 ?? 00 00 00 ?? 00 00 00 ?? 00 00 00 ?? 00 00 00 ?? 00 00 00 ?? 00 00 00 ?? 00 00 00 ?? 00 00 00 ?? 00 00 00 ?? 00 00 00 ?? 00 00 00 ?? 00 00 00 ?? 00 00 00 ?? 00 00 00 ?? 00 00 00 ?? 00 00 00 00 00 ?? ?? 00 00 F0 42')
-- 스캔한 개수 받아오기
scanTotal = AoB.Count
-- 'scanTotal' 문자를 심볼로 등록
registerSymbol('scanTotal', scanTotal)
-- scanTotal개수 만큼 반복, i는 1씩 증가
for i=1, scanTotal, 1 do
-- i-1 1을 빼는 이유는 AoB인덱스는 0부터 시작이기 때문
registerSymbol('Gold' .. tostring(i), AoB[i-1])
-- 골드주소에 모리쓰기
writeFloat('Gold' .. tostring(i), 999)
end -- for문 끝
-- AoB 삭제
AoB.destroy()
[DISABLE]
for i=1, scanTotal, 1 do
unregisterSymbol('Gold' .. tostring(i))
end
unregisterSymbol('scanTotal')
이제 치트 테이블에 올려줍니다.
File -> Assign to current cheat table
Add Address Manually로 주소를 추가해
수정해서 가져온 골드를 확인해 볼 겁니다.
심볼등록할 거니 Gold1로 주소 사용가능합니다.
Float 타입으로 주소추가
Auto Assemble script에 드래그해서 등록해 줍니다.
저는 Gold2, Gold3, Gold4까지 추가했습니다.
Active를 눌러주면 스캔된 주소들이 확인되며 변경된 골드도 잘 확인됩니다.
등록된 심볼확인을 위해 Memory View에서
View -> Userdefined symbols 클릭
그럼 등록된 심볼들을 확인할 수 있습니다.
이렇게 바이트배열 스캔 자동 스크립트를 만들었습니다.
실행파일로 만들 거면
Pattern Scan 검색해 보시면
바이트 스캔해 주는 함수 있습니다.
활용해서 만들어보시면 될 것 같네요.
'치트엔진 > 사용 가이드' 카테고리의 다른 글
GTA5 온라인에서 치트키 활성화해보기 (2) | 2024.07.07 |
---|---|
[치트엔진] 벽 뚫기 만드는법 Ultimap 활용 (1) | 2023.01.11 |
캐릭터 좌표 구하는 방법 [게임해킹] (2) | 2022.12.14 |
텔레포트 핵 만드는 법 (치트엔진) (2) | 2022.08.17 |
스킬 쿨타임 해킹하는 법 (치트 엔진) (8) | 2022.08.09 |