티스토리 뷰

게임

치트엔진 사용법 다운로드 cheatengine

폴로의나침판 2023. 3. 4. 14:17
반응형

 

다운로드

https://www.cheatengine.org/

 

Cheat Engine

Cheat Engine Trouble installing/running Cheat Engine? Try Cheat Engine Lite. A stripped down version with less/different warnings. Or check out the known github issue here on how to solve it, or join the cheat engine patreon Read before download: You must

www.cheatengine.org

와룡 게임과 치트엔진을 실행하자

위에 붉은색을 눌러 아래 해당 치트하는 게임을 선택하세요

다음 불러오기를 눌러 다운로드한 테이블을 로드하세요

실행 해주세요 예스

수정하고 싶은 능력치를 선택하세요

 

1단계: 환영 

튜토리얼이 시작되면 다음과 같은 내용이 표시됩니다. 도움말 텍스트를 읽은 후 다음 버튼을 클릭 하면 됩니다 .

(주입으로 인한) 충돌이 발생하거나 나중에 다시 시작할 수 있도록 이후 단계에서 암호를 저장하십시오.

 

2단계: 정확한 값 스캔 

따라서 2단계에서는 이와 같은 것을 볼 수 있습니다.

우리가 찾아야 하는 것은 건강이고 여기서는 정수입니다.

따라서 정수를 찾도록 메모리 스캐너를 설정하고 정확한 값 스캔을 위해 값을 현재 상태 값으로 설정합니다 . 대부분의 정수는 4바이트 변수에 저장되므로 여기서 시작하겠습니다.

참고: 정수는 1바이트 변수(byte), 2바이트 변수(int16/short), 4바이트 변수(int32/int) 또는 8바이트 변수(int64/long)에 저장할 수 있습니다.

준비가 되면 첫 번째 스캔 버튼을 클릭합니다 .

다음과 같이 찾은 주소 목록에 주소 목록이 표시되어야 합니다.

이제 hit me 버튼을 클릭한 다음 현재 값을 다시 입력하고 다음 스캔 버튼을 클릭합니다 .

목록의 빨간색 값에 유의하십시오. 이는 값이 변경되었음을 나타냅니다.

다음 스캔을 클릭한 후 계속 클릭 하고 다시 스캔하여 찾은 주소 목록이 작업하기에 충분히 작다고 알려야 할 수 있습니다 .

찾은 목록에서 주소를 두 번 클릭하여 치트 테이블에 추가하십시오 . 그런 다음 값을 변경하고 주소를 고정합니다 . 주소 목록에서 값을 두 번 클릭하여 편집하고 활성화/고정 상자를 클릭하여 고정합니다.

이제 다음 버튼  활성화되어야 합니다. 클릭하여 다음 단계로 이동합니다 . 다음 버튼이 아직 활성화되지 않은 경우 hit me 버튼을 다시 클릭합니다 .

 

3단계: 알 수 없는 초기값

3단계를 시작하면 다음과 같은 양식이 표시됩니다.

도움말 텍스트에서 말했듯 이 새 스캔을 시작하기 전에 새 스캔 버튼을 클릭 해야 합니다 .

이렇게 하면 찾은 결과가 지워지고 새 값에 대한 스캔이 시작됩니다.

여기에서 스캔할 값 유형을 결정하는 데 도움이 되도록 값이 어떻게 감소하는지 확인하기 위해 hit me 버튼 을 클릭하는 것이 좋습니다.

값은 소수 가 아닌 정수만큼 감소했습니다.

그래서 스캐너를 4바이트 로 설정 하고 초기 값을 알 수 없습니다 . 그런 다음 첫 번째 스캔 버튼을 클릭합니다 .

이제 hit me 버튼을 클릭하십시오 .

그런 다음 스캔 유형을 감소된 값 으로 설정 하고 중첩 스캔 버튼을 클릭합니다 .

발견된 주소의 수에 유의하십시오. 이것은 요즘 대부분의 게임에서 다소 작습니다. 발견된 결과는 대부분의 게임에서 쉽게 수백만에 달할 수 있습니다.

이제 hit me 버튼 으로 계속해서 값을 줄이고 찾은 결과가 작업하기에 충분히 작아질 때까지 감소된 값을 스캔합니다 .

이제 주소를 선택하고 값을 변경하여 원하는 효과가 있는지 확인합니다 . 이것이 바로 작동 방식입니다.

알 수 없는 주소를 변경하고 저장 파일을 손상시키는 것을 방지하기 위해 올바른 값이 아닌 경우 값을 다시 설정하기 위해 값을 변경하기 전에 항상 값(또는 그냥 Ctrl+C )을 기록해 두는 것이 좋습니다. 게임에서.

값을 5000으로 설정하면 바로 다음 버튼이 활성화 됩니다 . 값을 변경하고 hit me 버튼을 클릭하면 진행률 표시줄이 채워져야 하지만 이는 필요하지 않습니다.

이제 다음 버튼  활성화되어야 합니다. 클릭하여 다음 단계로 이동합니다 . 다음 버튼이 아직 활성화되지 않은 경우 hit me 버튼을 다시 클릭합니다 .

 

4단계: 부동 소수점 

4단계를 시작하면 다음과 같은 양식이 표시됩니다.

새 스캔 버튼 을 클릭 하십시오 . 그런 다음 플로트 , 정확한 값에 대한 스캐너를 설정하고 현재 상태 값을 입력합니다 .

설정시 첫 번째 스캔 버튼을 클릭하십시오 .

따라서 이전과 같이 스캔하여 건강 주소를 찾은 다음 주소 목록에 추가하십시오 .


이제 새 스캔 버튼을 다시 클릭하십시오 . 그런 다음 스캐너를 두 배  정확한 값 으로 설정하고 현재 탄약 값을 입력합니다 .

설정시 첫 번째 스캔 버튼을 클릭하십시오 .

따라서 이전과 같이 스캔하여 탄약 주소를 찾은 다음 주소 목록에 추가하십시오 .

이제 값을 5000 으로 변경하면 다음 버튼이 활성화됩니다. 그런 다음 다음 버튼을 클릭하여 다음 단계로 진행합니다 .

 

5단계: 코드 찾기 

5단계를 시작하면 다음과 같은 양식이 표시됩니다.

따라서 먼저 값을 찾은 다음 주소 목록에 추가하십시오 .

디버거가 제대로 설정되지 않은 경우를 대비하여 이 시점에서 테이블과 암호를 저장하십시오 .

디버거 설정에 도움이 필요한 경우 다음을 참조하십시오. 디버거 옵션

주소 목록에 주소가 있으면 마우스 오른쪽 버튼을 클릭한 다음 이 주소에 액세스하는 항목 찾기를 선택합니다 .

Cheat Engine은 디버거 연결에 대한 메시지를 표시합니다.  버튼을 클릭하십시오 .

그런 다음 디버거 양식이 열리고 이제 값 변경 버튼을 클릭하면 디버거 양식에 표시되는 코드가 표시됩니다.

우리가 원하는 것은 쓰기 명령입니다. 따라서 우리는 다음 중 하나와 같은 것을 찾을 것입니다.

이동 [**],** 추가 [**],** 하위 [**],** *** [**],**

쓰기 명령어의 코드 라인을 선택하고 디스어셈블러 표시 버튼을 클릭하여 메모리의 코드를 확인한 다음 교체 버튼을 클릭합니다 .

중지 버튼을 클릭하는 것을 잊지 마십시오 .

바꾸기 버튼은 해당 코드 줄을 NOP 로 바꿉니다 .

Cheat Engine은 고급 옵션 목록에 추가할 항목의 이름을 묻는 메시지를 표시합니다.

이름을 입력하고 확인 버튼을 클릭합니다 .

이제 자습서에서 값 변경 버튼을 다시 클릭하십시오 .

다음 버튼이 활성화되고 다음 버튼을 클릭하여 다음 단계로 진행합니다.


고급 옵션 목록의 항목이 바뀌면 빨간색 텍스트로 표시됩니다.

고급 옵션 목록은 Cheat Engine 기본 양식의 왼쪽 하단에 있는 상태 표시줄의 고급 옵션 버튼을 클릭하여 볼 수 있습니다.

목록에 있는 항목의 원래 코드를 복원하려면 항목을 마우스 오른쪽 버튼으로 클릭하고 원래 코드로 복원을 선택하십시오 .

텍스트는 복원 후 검은색입니다.

 

6단계: 포인터

6단계를 시작하면 다음과 같은 양식이 표시됩니다.

따라서 먼저 값을 찾은 다음 주소 목록에 추가하십시오 .

주소 목록에 주소가 있으면 마우스 오른쪽 버튼을 클릭한 다음 이 주소에 액세스하는 항목 찾기를 선택합니다 .

그런 다음 값 변경 버튼 을 클릭하여 프로세스가 주소에 액세스하도록 합니다.

포인터의 기본 주소를 찾기 위해 코드를 선택할 때 기본 주소와 동일한 레지스터에 쓰지 않는 명령을 선택하십시오.

여기에서 우리는 대괄호('[' 및 ']') 사이의 값에 관심이 있으므로 여기서는 RDX의 값을 원합니다.

명령어에 다음과 같은 것이 있으면 오프셋은 0입니다.

움직임 [rdx+ 12C ],eax

그러면 오프셋은 '12C'(0x12C)가 됩니다. 이것은 16진수입니다.

이제 스캐너를 8바이트 , 정확한 값으로 설정하고 16진수 확인란을 선택한 다음 찾은 값을 스캔할 값으로 지정 합니다 .

준비가 되면 첫 번째 스캔 버튼을 클릭합니다 .

찾은 주소 목록에서 녹색 텍스트가 있는 주소를 찾습니다 . 이들은 정적 주소입니다.

치트 테이블에 하나를 추가하고 주소 목록에 추가된 메모리 레코드의 주소를 두 번 클릭하고 주소를 복사한 다음 포인터 확인란을 선택하고 포인터 기본 주소에 주소를 붙여 넣습니다.

이 작업을 수행하는 방법을 잘 모르는 경우 여기를 참조하십시오. 주소 목록에 주소를 추가하는 방법

내 포인터는 이렇게 보일 것입니다.

["Tutorial-x86_64.exe"+XXXXXX]+0

이와 같이 설정해야 합니다. 오프셋을 찾은 오프셋으로 설정해야 합니다.

포인터가 설정되면 확인 버튼을 클릭합니다 .

이제 값을 5000으로 고정하고 포인터 변경 버튼 을 클릭하면 다음 버튼이 활성화됩니다.

다음 버튼이 활성화되지 않으면 찾은 목록에서 다른 주소를 선택하고 값이 변경된 녹색 주소를 찾아 마지막 주소와 같이 설정하고 올바른 값을 가리키는지 확인합니다. 값이 고정되고 포인터 변경 버튼을 클릭합니다.

다음 버튼을 클릭하시면 다음 단계로 넘어갑니다.

7단계: 코드 삽입 

7단계를 시작하면 다음과 같은 양식이 표시됩니다.

여기에서는 5단계와 동일한 절차를 따르지만 교체를 클릭하는 대신 디스어셈블러 표시 버튼을 클릭합니다 .

이렇게 하면 명령의 주소에서 디스어셈블러 보기 양식이 열립니다.

명령을 선택한 상태에서 Ctrl+A를 눌러 자동 어셈블러 양식을 엽니다.

자동 어셈블러 양식 메뉴에서 템플릿을 선택한 다음 전체 주입을 선택합니다 .

이렇게 하면 시작할 수 있는 스크립트가 생성됩니다.

이제 값을 2만큼 증가시키는 코드를 추가한 다음 값을 감소시키는 원래 코드를 제거 해야 합니다 .

값을 늘리려면 INC 또는 ADD 를 사용할 수 있습니다 .

그래서 이런 식으로 시도해 봅시다.

... newmem: dword ptr 추가 [ rsi + 780 ], 2 코드: //sub dword ptr [rsi+00000780],01 jmp 반환 주소: jmp newmem nop nop 반환: ...

이제 치트 테이블에 스크립트를 추가합니다 .

방법을 잘 모르는 경우 여기를 참조하십시오. How to add script to table

그런 다음 스크립트를 활성화하고 hit me 버튼을 클릭합니다 .

이렇게 하면 다음 버튼이 활성화되므로 다음 버튼을 클릭하여 다음 단계로 이동합니다.

 

8단계: 다단계 포인터

8단계를 시작하면 다음과 같은 양식이 표시됩니다.

수동 반복 

따라서 여기에서는 6단계와 동일한 단계를 따르지만 우리가 찾은 기본 주소에 액세스하는 항목을 확인 하고 정적 기본 주소를 찾을 때까지 이 작업을 계속 반복합니다 .

여기 내 첫 번째 디버거 출력이 있습니다.

10002D8D1 - B9 A00F0000 - 이동 ecx,00000FA0
10002D8D6 - E8 3522FEFF - Tutorial-x86_64.exe+XXXXXX 호출
10002D8DB - 89 46 18 - mov [rsi+18],eax <<<<<<
10002D8DE - 89 C2 - 이동 edx,eax
10002D8E0 - 48 8D 4D F8 - lea rcx,[rbp-08]

RAX=00000000000007F7
RBX=000000000125CD60
RCX=0000000000000FA0
RDX=00000000828087F3
RSI=0000000001287960 <<<<<<
RDI=0000000100258308
RSP=000000000102F070
RBP=000000000102F0B0
RIP=000000010002D8DE
R8=0000000100161BA0
R9=00000000008E06A0
R10=0000000000000002
R11=0000000000000206
R12=00000000012607C0
R13=0000000100161BA0
R14=0000000100258300
R15=0000000100257A18

베이스 주소의 첫 번째 스캔에서 정적 베이스를 찾았지만 이것이 거짓 베이스인 것을 기억합니다. 그래서 여기서 우리가 원하는 것은 'process.exe+offset' 형식의 기본 주소입니다. 'module.dll+offset'처럼 보이는 다른 주소 중 하나를 시도할 수 있지만 여기에서 그들이 증명할 것이라고 말하고 싶습니다. 거짓 포인터. 그리고 네, 대부분의 최신 게임에는 잘못된 값과 포인터가 많이 있습니다.

그리고 주소 보유의 디버거 출력: 0000000001287960

10002D88B - E8 90961200 - Tutorial-x86_64.exe+XXXXXX 호출
10002D890 - E9 65000000 - jmp Tutorial-x86_64.exe+XXXXXX
10002D895 - 48 83 3E 00 - cmp qword ptr [rsi],00 <<<<<<
10002D899 - 74 5F - je Tutorial-x86_64.exe+XXXXXX
10002D89B - 48 8B 36 - mov rsi,[rsi]

RAX=0000000000013117
RBX=000000000125CD60
RCX=000000000125CD60
RDX=0000000000003CE3
RSI=0000000002D6D540 <<<<<<
RDI=0000000100258308
RSP=000000000102F070
RBP=000000000102F0B0
RIP=000000010002D899
R8=0000000100161BA0
R9=00000000008E06A0
R10=0000000000000002
R11=0000000000000206
R12=00000000012607C0
R13=0000000100161BA0
R14=0000000100258300
R15=0000000100257A18

그리고 주소 보유의 디버거 출력: 0000000002D6D540

10002D845 - E8 D6961200 - Tutorial-x86_64.exe+XXXXXX 호출
10002D84A - E9 AB000000 - jmp Tutorial-x86_64.exe+XXXXXX
10002D84F - 48 83 7E 18 00 - cmp qword ptr [rsi+18],00 <<<<<<
10002D854 - 0F84 A0000000 - je Tutorial-x86_64.exe+XXXXXX
10002D85A - 48 8B 76 18 - mov rsi,[rsi+18]

RAX=00000000000166D2
RBX=000000000125CD60
RCX=000000000125CD60
RDX=000000000000302E
RSI=0000000002D6CE40 <<<<<<
RDI=0000000100258308
RSP=000000000102F070
RBP=000000000102F0B0
RIP=000000010002D854
R8=0000000100161BA0
R9=00000000008E06A0
R10=0000000000000002
R11=0000000000000206
R12=00000000012607C0
R13=0000000100161BA0
R14=0000000100258300
R15=0000000100257A18

그리고 주소 보유의 디버거 출력: 0000000002D6CE40

10002D800 - E8 1B971200 - Tutorial-x86_64.exe+XXXXXX 호출
10002D805 - E9 F0000000 - jmp Tutorial-x86_64.exe+XXXXXX
10002D80A - 48 83 7E 10 00 - cmp qword ptr [rsi+10],00 <<<<<<
10002D80F - 0F84 E5000000 - je Tutorial-x86_64.exe+XXXXXX
10002D815 - 48 8B 76 10 - mov rsi,[rsi+10]

RAX=000000000000B567
RBX=000000000125CD60
RCX=000000000125CD60
RDX=00000000000050A1
RSI=000000000123F1C0 <<<<<<
RDI=0000000100258308
RSP=000000000102F070
RBP=000000000102F0B0
RIP=000000010002D80F
R8=0000000100161BA0
R9=00000000008E06A0
R10=0000000000000002
R11=0000000000000206
R12=00000000012607C0
R13=0000000100161BA0
R14=0000000100258300
R15=0000000100257A18


이제 해당 베이스 '000000000123F1C0'을 검색하면 정적 주소를 찾아야 하지만 실제 게임에서는 정적 베이스를 찾을 때까지 계속 이동합니다.

그 정적 주소를 기반으로 내 포인터는 다음과 같이 보일 것입니다.

[[[["Tutorial-x86_64.exe"+XXXXXX]+10]+18]+0]+18

포인터 스캔

포인터 스캔은 원하는 값의 주소를 먼저 찾고, 생성된 포인터 맵을 저장하고, 게임을 다시 시작하고, 다시 주소를 검색하고, 다른 포인터 맵을 저장한 다음 둘을 비교함으로써 이를 빠르게 해결하는 데 사용할 수 있습니다. 자세한 정보는 Help_File:Pointer_scan 에서 찾을 수 있습니다 .

마지막으로 

포인터를 찾은 후 5000에서 고정한 다음 포인터 변경 버튼 을 클릭합니다 . 올바른 베이스를 찾으면 약 2초 후에 다음 버튼이 활성화됩니다. 따라서 다음 버튼을 클릭하여 다음 단계로 이동하십시오.

9단계: 공유 코드 

9단계를 시작하면 다음과 같은 양식이 표시되어야 합니다.

따라서 여기에 도움말 텍스트와 같이 하나 이상의 솔루션이 있다고 말합니다.

먼저 주소 중 하나를 찾아 테이블에 추가 해야 합니다 .

주소를 찾는 데 문제가 있는 경우 다른 값 유형을 시도하고 새 스캔 을 시작하는 것을 잊지 마십시오 .

그런 다음 7단계에서와 같이 액터의 건강에 기록하는 기능을 찾기 위해 address 에 액세스하는 것을 확인 하려고 합니다 .

계속해서 다른 방법을 시도하고 싶다면 비밀번호를 저장하세요 . 이것이 튜토리얼의 마지막 단계입니다.

따라서 동맹과 전투원을 구별하기 위해 실제로 찾고 있는 것이 무엇인지 이해하는 것이 좋습니다.

게임이나 엔진이 작성될 때 액터와 플레이어는 이렇게 작성될 수 있습니다.

//// 액터, 모든 액터의 기반 class Actor (object) { string Name = 'Actor' ; Coord Coords = new Coord( 0 , 0 , 0 ); 부동 건강 = 100.0 ; ... } //// Player 클래스 Player (Actor) { //// Player는 Actor string Name = 'Player' 형식을 상속받습니다 . 정수 팀 = 1 ; ... }

팀 자체는 구조가 될 수 있습니다. 예를 들어 'Coords' 변수와 같은 개체 클래스로 선언된 경우 액터의 팀 구조에 대한 포인터를 찾고자 합니다.

따라서 이를 수행할 수 있는 한 가지 방법은 플레이어 구조에서 팀 ID 또는 팀 구조를 찾는 것입니다.

플레이어 구조에서 팀 ID 찾기 

건강을 감소시키는 기능을 찾은 후.

디스어셈블러 보기 양식에서 명령어를 마우스 오른쪽 버튼으로 클릭하고 find out address what address this instruction accesss 를 선택합니다 .

그런 다음 4개의 값 모두에 대해 공격 버튼을 클릭합니다 .

디버거 목록에 4개의 주소가 모두 있어야 합니다.

계속해서 주소 목록에 추가하십시오 .

그런 다음 dissect 데이터 구조 양식을 열어 보겠습니다.

몇 가지 팝업이 표시됩니다. 팝업을 생각한 후 이와 같은 양식이 표시되어야 합니다. 열을 이동할 수 있도록 양식의 너비를 확장해야 했습니다.

이제 내 오프셋 0x10은 64비트 프로세스에서 8바이트 너비의 포인터로 추측되었습니다. 나는 0x10의 포인터가 실제로는 포인터처럼 보이지 않는 값을 가지고 있음을 보았다.

그래서 4바이트로 전환하고 4바이트 값 유형으로 오프셋이 0x14인 새 요소 세트를 추가해야 했습니다. 이것이 종종 작동하는 방식입니다.

따라서 여기에서 팀 변수가 구조의 오프셋 0x14에 있음을 알 수 있습니다.

이제 스크립트에 인젝션 코드를 추가한 다음 구조의 팀 변수를 확인하는 코드를 추가하여 어떤 액터가 아군이고 어떤 액터가 전투원인지 결정해야 합니다.

그래서 우리는 이와 같은 것을 원합니다.


따라서 이 스크립트를 활성화한 상태에서 게임이 액터 상태에 쓸 때 후크 코드로 점프한 후 다음과 같은 일이 발생합니다.

  1. 완전히 필요하지는 않지만 비교할 때 여전히 좋은 습관인 RFLAGS 레지스터를 저장( PUSH )하십시오.
  2. 액터가 1팀에 있는지 확인합니다.
    1. 액터가 팀 1에 있으면 새 값을 부동 소수점 형식으로 5000으로 설정합니다.
  3. 배우가 2팀에 있는지 확인합니다.
    1. 액터가 팀 2에 있으면 새 값을 16진수 형식으로 0으로 설정합니다. (플로트 0 == 정수 0 == 16진수 0)
  4. RFLAGS 레지스터를 복원( POP )합니다. 레지스터가 PUSH된 경우 이는 완전히 필요합니다 .


이 스크립트를 활성화한 상태에서 게임 다시 시작 및 자동 실행 버튼 을 클릭하면 다음과 같이 양식이 변경되는 것을 볼 수 있습니다.

튜토리얼을 완료하려면 다음 버튼을 클릭 하세요 .

그러면 자습서를 완료했음을 알리는 양식이 표시됩니다.

 

레지스터에서 차이점 찾기 [ 편집 ]

건강을 감소시키는 기능을 찾은 후.

디스어셈블러 보기 양식에서 명령어를 마우스 오른쪽 버튼으로 클릭하고 find out address what address this instruction accesss 를 선택합니다 .

그런 다음 4개의 값 모두에 대해 공격 버튼을 클릭합니다 .

디버거 목록에 4개의 주소가 모두 있어야 합니다.

이제 동맹국과 전투원에서 차이를 찾을 수 있는지 레지스터를 살펴보겠습니다.

각 주소를 개별적으로 선택하고 Ctrl+R을 누릅니다 .

쉽게 비교할 수 있도록 양식을 정렬하십시오.

여기에서 전투원의 RSI가 1임을 알 수 있습니다.

따라서 이와 같은 스크립트가 작동해야 합니다.


따라서 이 스크립트를 활성화한 상태에서 게임이 액터 상태에 쓸 때 후크 코드로 점프한 후 다음과 같은 일이 발생합니다.

  1. 완전히 필요하지는 않지만 비교할 때 여전히 좋은 습관인 RFLAGS 레지스터를 저장( PUSH )하십시오.
  2. RSI 레지스터가 1인지 확인하십시오.
    1. RSI 레지스터가 1이면 새 값을 16진수 형식으로 0으로 설정합니다. (플로트 0 == 정수 0 == 16진수 0)
    2. RSI 레지스터가 1이 아니면 액터가 아군이라고 가정하므로 새 값을 부동 소수점 형식으로 5000으로 설정합니다.
  3. RFLAGS 레지스터를 복원( POP )합니다. 레지스터가 PUSH된 경우 이는 완전히 필요합니다 .

이 스크립트를 활성화한 상태에서 게임 다시 시작 및 자동 실행 버튼 을 클릭하면 다음과 같이 양식이 변경되는 것을 볼 수 있습니다.

튜토리얼을 완료하려면 다음 버튼을 클릭 하세요 .

그러면 자습서를 완료했음을 알리는 양식이 표시됩니다.

반응형
댓글