用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都可以馬上帶入你之前抓到的值直接用
本帖最后由 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
楼主真乃大神也!!!!!!!!!!!!!!!真好在玩魔界战记D2 ~~~~~~ 谢谢楼主不过机战 天狱篇无限显示 Access violation 不错 收藏了。 好贴。。 技术贴,果然有效果。 牛币级大神 2次变化以后~就没有地址了~搜索不到 本帖最后由 shuzhaoxuan 于 2018-9-25 19:57 编辑
大佬,我想请教一个问题。
龙之皇冠99级以前的经验值是搜4byte_bswap嘛?我这里搜不到啊。输入EXP 后面的数字,搜不到数据。
但奇怪的是金钱我就可以直接搜到。技能点我用2byte_bswap也可以搜到,唯独经验值搜不到。
这个经验值应该怎么搜?
另外您在别的帖子里提供的龙之皇冠经验值的内存地址,我用了以后不好使。
在内存编辑器里搜不到那个地址。直接添加地址,数据显示??,也没法修改。
我修改金钱的内存地址,跟您的地址核对了一下也不一样。是不是不同人电脑内存地址不一样的?
感谢,写的很详细 请问修改后数值变问号是什么情况? 牛逼啊 6666 先谢谢大老了,一会试试
好贴好贴啊 楼主厉害~~谢谢 LZ ,7909版本用ce找不到地址了,我现在修改机战,用ce什么也查不到了 修改圣斗士星矢战记,完全没用 龙之皇冠 搜索到金钱数字,修改后 游戏内没变化~~ 修改战国basaraHD合集 ,一改模拟器就卡死 非常感谢这是个好东西 改机战系列的芯片应该怎么搜索 搜到地址,可是数值仍然无变化 牛!!!!!!!!! 此乃神贴,造福一方 这个牛逼了 除了击坠数,其他都能改数字。不知道怎么改芯片 谢谢楼主的分享! 成了感谢楼主:D:D:D Access violation 能解决吗?能解决就是真正的大神。既然分享出来了,那么就要负责任!
页:
[1]
2