cailei110 发表于 2018-3-28 21:13

用CE更改任何RPCS3遊戲

本帖最后由 cailei110 于 2018-11-23 11:11 编辑

1.先下載CE,自己百度下,我是用CheatEngine 6.7 版本
2.編輯-設定裡面把圈起來地方打勾


3.點選該遊戲的程序


4.數值類型選4 Bytes,然後右鍵定義新的自定義類型(自動彙編)


5.裡面內容都清空,貼上下面這些
alloc(ConvertRoutine,1024)
alloc(ConvertBackRoutine,1024)
alloc(TypeName,256)
alloc(ByteSize,4)
alloc(UsesFloat,1)
alloc(CallMethod,1)


TypeName:
db '4byte_bswap',0


ByteSize:
dd 4


UsesFloat:
db 0


CallMethod:
db 0


ConvertRoutine:

mov eax,
bswap eax
ret




push ebp
mov ebp,esp
mov eax,
mov eax,
bswap eax
pop ebp
ret



ConvertBackRoutine:

bswap ecx
mov ,ecx
ret




push ebp
mov ebp,esp
push eax
push ebx
mov eax,
mov ebx,
bswap eax
mov ,eax
pop ebx
pop eax
pop ebp
ret

7.你會看到變成4byte_bswap


8.遊戲玩到你可以變換數據的地方(例如金錢就是到可以買賣的地方),在數值輸入你現在金錢後搜尋


9.搜到一堆後,更改數據(買東西賣東西之類),然後輸入新的數據後搜尋


10.這時候左邊結果應該剩下很少,隨便選一個後,修改數值


11.回遊戲看,已經變成99999999了


12.如果你發現你修改的那個數據後,原遊戲還是沒變化,不彷之前搜尋剩下的幾個都改一改,一定有一個對


13.可以將此次搜尋出來的結果儲存起來,之後每次開CE都可以馬上帶入你之前抓到的值直接用






TGFANS163 发表于 2018-3-29 22:40

本帖最后由 cailei110 于 2018-11-23 11:06 编辑

[模拟器找到的数据地址与ps3金手指的地址]

用ce找到的数据地址与ps3金手指的地址相差正好100000000(8个0)
比如ps3金手指文件里金钱地址是0x4000,那么ce直接定位到10004000就是模拟器里金钱的地址。

这是因为rpcs3模拟器是用固定的地址作为ps3内存存放游戏数据。也许模拟器作者觉得固定地址方便。咱修改也方便了不少。



ps3游戏的十六进制数值与一般游戏相反,为正向排列。比如数值10000,一般游戏内存中是10 27 00 00,而ps3里面是00 00 27 10。用ce写修改脚本的时候要注意数值的顺序转换。
所以修改数值要注意这点。比如有100元钱,ce找的地址是0x40000003,那么实际上金钱地址是0x40000000,因为游戏数据是正向的。
脚本也不能直接mov ,#100,而要写成mov ,64000000。
或者用bswap命令转换顺序,例如mov eax,#100 ; bswap eax ; mov ,eax 这样。


[用ce调试rpcs3模拟的游戏]
经过跟踪发现,rpcs3会先把游戏的代码全部翻译为64位汇编,实际是在64位汇编中运行的。汇编代码每次启动游戏会重新翻译生成,所以地址是动态的。

用ce打开rpcs3,找到要修改的数据,find access能找到对应的汇编代码。
跟踪过程和普通游戏差不多,需要注意的是,因为代码是逐条翻译过来的,所以跟踪起来感觉是一小段一小段的。
当看到 cmp dword ptr ,00 ;jne xxx ,说明这段翻译的代码执行完了。正常会跳走做一些事情,然后回到这里下面的代码继续执行。所以直接在jne下面的代码上 run untill继续跟就行了。
就像一个人翻译了一篇文章,念一句要喘口气,然后继续念下一句。只要看到段落标记直接执行到下一句就行了。

跟踪过程中能发现有一块频繁读写的地址其实是当作ps3寄存器来用的。可以理解为一块地址作为ps3游戏内存,一块地址作为ps3寄存器。通过翻译ps3游戏代码模拟ps3的cpu操作数据。
这就是模拟器。。。

[翻译出来的实际代码可读性极低]
轻松修改是不可能的,花很多时间修改确实很不值得。但不修改很可能要花更多时间去玩游戏,这就值得吗。。。修改和不修改,在省时间和游戏乐趣中权衡,这是个答案因人而异的问题。

跟踪的时候如果把一小段一小段的代码都记录下来,就能得到一大段模拟器翻译出来的代码了。但还是很难直接看出来代码的作用。本来mips汇编就比较难读,模拟器翻译过来的更是难以看懂。
相比起来一般基于pc平台开发的游戏,汇编代码里经常找到很多文本提示。加上pc平台游戏的调试器ollydbg什么的很丰富强大,所以pc游戏容易修改。
为了方便理解,放几个机战Z时狱篇的修改脚本。
就是用上面的修改方法找到地址的。



狙击10

10E732E6:
add qword ptr ,0a

10E732E6:
add qword ptr ,02


加速10

10EBC026:
add qword ptr ,0a

10EBC026:
add qword ptr ,03


全机4个强化插槽a

10D09A79:
mov eax,4

10D09A79:
movzx eax,byte ptr


队伍击破点数无限a

10EB5041:
mov eax,2

10EB5041:
movzx eax,byte ptr


弄明白套路就好改多了。再来一个。0改造也能选择满改奖励a 10D06C91:db eb






找数值时,可以加个数值格式方便自动转换顺序。
新增方式,在4bytes上右键→选define new custom type (lua)分别把下面的2byte、4byte 格式贴上。
之后就选新增的格式来找数值就不用自己换算。

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

TypeName:
db '2 Byte Big Endian',0

ByteSize:
dd 2

//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

//or manual:
//parameters: (64-bit)
//rcx=address of input
xor eax,eax
mov ax, //eax now contains the bytes 'input' pointed to
xchg ah,al //convert to big endian

ret



//jmp dllname.functionname
//or manual:
//parameters: (32-bit)
push ebp
mov ebp,esp
//=input
//example:
mov eax, //place the address that contains the bytes into eax
mov ax, //place the bytes into eax so it's handled as a normal 4 byte value
and eax,ffff //cleanup
xchg ah,al //convert to big endian

pop ebp
ret 4


//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:

//parameters: (64-bit)
//ecx=input
//rdx=address of output
//example:
xchg ch,cl //convert the little endian input into a big endian input
mov ,cx //place the integer the 4 bytes pointed to by rdx

ret



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

//convert the value to big endian
xchg ah,al

mov ,ax //write the value into the address
pop ebx
pop eax

pop ebp
ret 8

-----------------------------------------------------------------------------------------------
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

//or manual:
//parameters: (64-bit)
//rcx=address of input
xor eax,eax
mov eax, //eax now contains the bytes 'input' pointed to
bswap eax //convert to big endian

ret



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

bswap eax

pop ebp
ret 4


//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:

//parameters: (64-bit)
//ecx=input
//rdx=address of output
//example:
bswap ecx //convert the little endian input into a big endian input
mov ,ecx //place the integer the 4 bytes pointed to by rdx

ret



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

//convert the value to big endian
bswap eax

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

pop ebp
ret 8

冲仔 发表于 2018-5-5 22:11

楼主真乃大神也!!!!!!!!!!!!!!!真好在玩魔界战记D2 ~~~~~~

【辉】 发表于 2018-5-6 11:42

谢谢楼主不过机战 天狱篇无限显示 Access violation

暗星座 发表于 2018-5-7 21:49

不错 收藏了。

MEャ恋嫒ěr 发表于 2018-5-17 15:40

好贴。。

cyc1980 发表于 2018-5-29 01:35

技术贴,果然有效果。

siwuqula 发表于 2018-7-12 05:25

牛币级大神

jianchun 发表于 2018-7-31 22:33

2次变化以后~就没有地址了~搜索不到

shuzhaoxuan 发表于 2018-9-22 17:48

本帖最后由 shuzhaoxuan 于 2018-9-25 19:57 编辑

大佬,我想请教一个问题。
龙之皇冠99级以前的经验值是搜4byte_bswap嘛?我这里搜不到啊。输入EXP 后面的数字,搜不到数据。
但奇怪的是金钱我就可以直接搜到。技能点我用2byte_bswap也可以搜到,唯独经验值搜不到。
这个经验值应该怎么搜?

另外您在别的帖子里提供的龙之皇冠经验值的内存地址,我用了以后不好使。
在内存编辑器里搜不到那个地址。直接添加地址,数据显示??,也没法修改。
我修改金钱的内存地址,跟您的地址核对了一下也不一样。是不是不同人电脑内存地址不一样的?



xl2930648 发表于 2018-10-7 19:50

感谢,写的很详细

Azel2014 发表于 2018-11-18 19:42

请问修改后数值变问号是什么情况?

露马脚 发表于 2018-12-11 22:47

牛逼啊 6666

九天雷鸣斩 发表于 2018-12-26 10:15

先谢谢大老了,一会试试

九天雷鸣斩 发表于 2018-12-26 10:39

好贴好贴啊

samvon 发表于 2019-3-26 17:47

楼主厉害~~谢谢

耳朵竖起来 发表于 2019-4-5 11:44

LZ ,7909版本用ce找不到地址了,我现在修改机战,用ce什么也查不到了

zhaotiankui 发表于 2019-5-6 15:56

修改圣斗士星矢战记,完全没用

iessur 发表于 2019-5-8 15:01

龙之皇冠 搜索到金钱数字,修改后 游戏内没变化~~

viper殇 发表于 2019-5-29 00:59

修改战国basaraHD合集 ,一改模拟器就卡死

kinkqtl 发表于 2019-6-7 20:49

非常感谢这是个好东西

o7836992o 发表于 2019-6-22 21:17

改机战系列的芯片应该怎么搜索

Mr.Pain 发表于 2019-9-24 16:56

搜到地址,可是数值仍然无变化

luciferfiend 发表于 2019-10-24 13:11

牛!!!!!!!!!

bohrbi 发表于 2019-10-28 21:12

此乃神贴,造福一方

qinyimax 发表于 2019-11-6 06:58

这个牛逼了

etgz 发表于 2019-11-20 21:25

除了击坠数,其他都能改数字。不知道怎么改芯片

chenluhang 发表于 2019-12-8 02:02

谢谢楼主的分享!

芜芯 发表于 2019-12-21 23:53

成了感谢楼主:D:D:D

gth8888 发表于 2020-2-10 16:07

Access violation 能解决吗?能解决就是真正的大神。既然分享出来了,那么就要负责任!
页: [1] 2
查看完整版本: 用CE更改任何RPCS3遊戲