Найти в Дзене
Апостол Енот

RPCS3 + Cheat Engine: Как взламывать игры в эмуляторе PlayStation 3?

RPCS3 - быстро развивающийся эмулятор консоли седьмого поколения PlayStation 3, который способен эмулировать уже достаточно много игр. Как и с другими эмуляторами, с ним также свободно работает взломщик внутриигровых данных Chet Engine. Однако многие пользователи, пытаясь взломать ту или иную игру, могут столкнуться с трудностью: чаще всего программа не выдаёт вообще никаких результатов. Для корректной работы программы с эмулятором нужно сделать следующее 1. Откройте Cheat Engine. Перейдите во вкладку Edit -> Setting; 2. В появившемся окне перейдите в категорию Scan Setting, и поставьте галочку в пункте MEM_MAPPED и жмём "ОК"; 3. Предварительно запустив RPCS3, в Cheat Engine выбираем его в качестве процесса; 4. Щёлкаем правой кнопкой мыши по пункту Value Type, и в появившемся списке выбираем Define new custom type (Auto Assembler); 5. Появится окно для добавления кастомного значения 5.1 Удаляем все строчки 5.2 Вставляем следующее: alloc(TypeName,256)
alloc(ByteSize,4)
alloc(ConvertR

RPCS3 - быстро развивающийся эмулятор консоли седьмого поколения PlayStation 3, который способен эмулировать уже достаточно много игр.

Как и с другими эмуляторами, с ним также свободно работает взломщик внутриигровых данных Chet Engine. Однако многие пользователи, пытаясь взломать ту или иную игру, могут столкнуться с трудностью: чаще всего программа не выдаёт вообще никаких результатов.

Для корректной работы программы с эмулятором нужно сделать следующее

1. Откройте Cheat Engine. Перейдите во вкладку Edit -> Setting;

-2

2. В появившемся окне перейдите в категорию Scan Setting, и поставьте галочку в пункте MEM_MAPPED и жмём "ОК";

-3

3. Предварительно запустив RPCS3, в Cheat Engine выбираем его в качестве процесса;

-4

4. Щёлкаем правой кнопкой мыши по пункту Value Type, и в появившемся списке выбираем Define new custom type (Auto Assembler);

-5

5. Появится окно для добавления кастомного значения

-6

5.1 Удаляем все строчки

-7

5.2 Вставляем следующее:

alloc(TypeName,256)
alloc(ByteSize,4)
alloc(ConvertRoutine,1024)
alloc(ConvertBackRoutine,1024)
TypeName:
db '4 Byte Big Endian',0

ByteSize:
dd 4

//The convert routine should hold a routine that converts the data to an integer (in eax)
//function declared as: stdcall int ConvertRoutine(unsigned char *input);
//Note: Keep in mind that this routine can be called by multiple threads at the same time.
ConvertRoutine:
//jmp dllname.functionname
[64-bit]
//or manual:
//parameters: (64-bit)
//rcx=address of input
xor eax,eax
mov eax,[rcx]
//eax now contains the bytes 'input' pointed to
bswap eax //convert to big endian

ret
[/64-bit]

[32-bit]
//jmp dllname.functionname
//or manual:
//parameters: (32-bit)
push ebp
mov ebp,esp
//[ebp+8]=input
//example:
mov eax,[ebp+8] //place the address that contains the bytes into eax
mov eax,[eax] //place the bytes into eax so it's handled as a normal 4 byte value

bswap eax

pop ebp
ret 4
[/32-bit]

//The convert back routine should hold a routine that converts the given integer back to a row of bytes (e.g when the user wats to write a new value)
//function declared as: stdcall void ConvertBackRoutine(int i, unsigned char *output);
ConvertBackRoutine:
//jmp dllname.functionname
//or manual:
[64-bit]
//parameters: (64-bit)
//ecx=input
//rdx=address of output
//example:
bswap ecx //convert the little endian input into a big endian input
mov [rdx],ecx //place the integer the 4 bytes pointed to by rdx

ret
[/64-bit]

[32-bit]
//parameters: (32-bit)
push ebp
mov ebp,esp
//[ebp+8]=input
//[ebp+c]=address of output
//example:
push eax
push ebx
mov eax,[ebp+8]
//load the value into eax
mov ebx,[ebp+c] //load the address into ebx

//convert the value to big endian
bswap eax

mov [ebx],eax
//write the value into the address
pop ebx
pop eax

pop ebp
ret 8
[/32-bit]

Должно получиться так
Должно получиться так

5.3 Жмём "ОК". Теперь, в меню Value type, появится дополнительный тип значений. Он подходит для обнаружения нужных данных внутри эмулятора

-9

Иногда может потребоваться тип значения Float
Просто повторяем пятый пункт, и вставляем следующий код:

alloc(TypeName,256)
alloc(ByteSize,4)
alloc(ConvertRoutine,1024)
alloc(ConvertBackRoutine,1024)
alloc(UsesFloat,4)

TypeName:
db 'Float Big Endian',0

ByteSize:
dd 4

UsesFloat:
db 01

ConvertRoutine:
[32-bit]
push ebp
mov ebp,esp
mov eax,[ebp+8]
//place the address that contains the bytes into eax
mov eax,[eax] //place the bytes into eax
bswap eax
pop ebp
ret 4
[/32-bit]

[64-bit]
//rcx=address of input
mov eax,[rcx] //eax now contains the bytes 'input' pointed to
bswap eax
ret
[/64-bit]

ConvertBackRoutine:
[32-bit]
push ebp
mov ebp,esp
//[ebp+8]=input
//[ebp+c]=address of outputpush
eax push
ebx mov eax,[ebp+8]
//load the value into eax
mov ebx,[ebp+c] //load the address into ebx
bswap eax
mov [ebx],eax
//write the value into the address
pop ebx
pop eax
pop ebp
ret 8
[/32-bit]

[64-bit]
//ecx=input
//rdx=address of output
bswap ecx
mov [rdx],ecx
//place the integer the 4 bytes pointed to by rdx
ret

[/64-bit]

Теперь запускаем нужную нам игру в эмуляторе, и пытаемся найти нужное значение через Cheat Engine

-10

-11

-12

-13

Как видим, значение работает