2014-12-10 09:55:44 k73游戏之家 作者:cmos电路
已经破解过的主机PS3对于玩破解游戏的各位而言,需要使用金手指的玩家们会有很多,而很多玩家为了可以自己制定自己需要的功能便学着自己修改,而最近比较流行的ccapi金手指软件便受到了大家的关注,以下教大家如何用ccapi实现cu金手指代码。
Control Console API(CCAPI)是最近比较流行的金手指软件,最新2.6版本支持cfw4.65和混合系统,不过这个版本的pc端软件,目前还只有其自带的客户端,没内存查看器,不好用。所以,现在还是推荐用2.0的mod版本,支持cfw4.46-4.65(混合系统需要切换为一般系统或者把COBRA关掉),pc端软件可用CCCheat 1.01或者CCAPI Debugger 2.2。
CCCheat1.01可以保存代码方便一点,CCAPI Debugger 2.2调试的时候比较好用。本文在下面的举例说明中,将采用CCCheat 1.01作为pc端软件。
常用软件说明:
CCAPI_v2.00_MOD_446-465:PS3端程序,CCAPI_2.0_MOD版本,支持cfw4.46-4.65(混合系统需要切换为一般系统或者把COBRA关掉)
CCCheat 1.01:PC端程序,支持CCAPI 2.0和2.5版本
CCAPI Debugger 2.2汉化版:PC端程序,支持CCAPI 2.0版本
cu2.3格式金手指代码库: 金手指代码库,包含了904个游戏的金手指(按照ps3游戏id来计算),20140619版本,除了新出的游戏,这个代码库应该是很全了。
先简单说一下CCAPI的使用流程:
PS3已经设置好IP,并通过路由器在局域网跟电脑pc相连。
1. 复制安装pkg程序CCAPI_v2.00_MOD_446-465.pkg文件到u盘,插到ps3上,进入install package files,安装。
2.运行刚安装的CCAPI程序,确定,确定,等待PS3重启。PS3重启之后,过10秒左右,右上角会显示CCAPI已运行标识,此后ps3每次启动都会自动加载CCAPI(若要卸载CCAPI,重新运行下CCAPI程序即可)。
3.用MM或IRIS MANAGER等加载游戏,并运行游戏,在游戏中暂停。
4.在PC端运行CCCheat 1.01或者CCAPI Debugger 2.2,输入PS3的IP地址,点击connect,进行操作修改等等。
5.返回ps3,继续游戏。
目前论坛里对CCAPI软件的使用上,基本都是搜索具体数值,或者通过别人发布的静态地址数据来修改游戏,这样实现的金手指功能很少。其实,目前论坛里发布的静态地址金手指代码,大部分都可以用来修改eboot,这样更方便,起码你不用打开pc。
作为一个内存修改器,CCAPI的优势就在于可以实时读取内存,进行即时修改,完全可以用来修改动态地址数据,实现更多的金手指功能。
现在的问题是,如何找到动态地址的规律?如果只用pc端软件CCCheat或者CCAPI Debugger的搜索功能,那么想找到一个不知道具体数值的动态地址,无异于大海捞针,就算偶尔找到了,换个场景,动态地址就变了,又要重新找,很可能搜索时间远比玩游戏的时间长,费时费力,很不划算。
这种情况下,就需要用到以前整理过的金手指代码了,从cfw3.55过来的玩家,应该都知道cu2.3金手指(可惜它不支持cfw4.xx),它的金手指代码里就有很多动态代码,借助已有的cu金手指代码,我们可以快速的定位动态地址,省去了搜索的时间,提高了效率。以前,我们只能使用一小部分的cu金手指代码,现在,利用CCAPI,所有的cu金手指代码都可以实现了。
对于一行cu金手指代码,其一般可分成3部分,每8个数字为一部分:控制代码 地址 数值。其中,地址和数值都是十六进制的。
下面,本文将通过对cu控制代码的解析,来说明如何用CCAPI实现cu金手指代码。
注:各种控制代码的名称,都是本人自己定义命名的,有可能不太切合,还望见谅。
控制代码01:直写码
CU控制代码00002000开头的,就是直写码。其代码格式如下:
00002000 ssssssss aaaaaaaa
ssssssss是地址,aaaaaaaa是数值,地址和数值都是十六进制的。
直写码的功能,就是把数值aaaaaaaa写入地址ssssssss中,数值类型由要写入的数值大小来决定。例如:
Gold9999999
00002000 00F6D460 0098967F
其中,00F6D460是地址,0098967F是要写入的数值,这就算一组数据。
用CCAPI修改,只要pc端软件添加一个code,数值类型由要写入的数值大小来决定,软件选项有1字节、2字节、4字节和浮点数,当前例子中,数值98967F是3个字节,所以选择type数值类型4字节,输入地址address和对应的数值value就可以了。
代码里数值是十六进制的,而CCCheat 1.01软件需要输入十进制的数值,所以,输入前请先转换进制。可以用计算器(windows附件里自带的)转换进制。
或者,在CCCheat 1.01界面查找部分的Value框中,输入数值,勾选Hex前面的勾选框,就可以进行十进制和十六进制之间的互相转换。
只有直写码的金手指代码,是静态地址金手指代码,可以选择save codes保存,以备下次再用。
不过CCCheat 1.01不会保存数值value,而其他选项都会保存,所以下一次使用load codes载入后,还需要重新填入一次数值。可以在描述命名description中填入需要输入的数值,下一次载入后,照着description输入数值就可以了,省着再去查看代码转换数值了。
另外,CCCheat 1.01软件还有个问题,输入地址和数值时,需要手动输入;或者复制粘贴后删掉最后一个数字,再手动输入刚删掉的数字。
有时候代码不止一组数据,例如:
MaxMoney on Buy
00002000 0076526C 3D207FFF
00002000 00765270 91230564
这时就需要为每一组的数据都添加一个code,上例中就添加两个code,数值类型4字节,分别输入对应的地址和数值。
只有直写码的金手指代码,大部分都可以用来修改eboot(其他控制代码的,都不能用来修改eboot),需要地址-10000(十六进制)。还有一小部分的直写码金手指,其地址-10000后仍然超出了eboot的地址范围,这些就不能用于修改eboot,只能用CCAPI来改。
注意:一个地址存储一个字节,十六进制数值,FF一个字节,FFFF两个字节,FFFFFFFF四个字节。数值类型一定要选对,没选对就会出错。例如:
假设所有地址初始数值都是00,要在地址10存储2字节数值A13F,地址栏填写10,选择数值类型2字节,数值栏填写A13F,存储完毕后,地址10存储了字节A1,地址11存储了字节3F。
如果选错,数值类型选了4字节,那么存储完毕后,地址10字节00,地址11字节00,地址12字节A1,地址13字节3F,数值输入错误了。
如果选错,数值类型选了1字节,那么存储完毕后,地址10字节3F,其他地址字节没变,数值的高位字节A1就被软件自动舍弃,数值输入错误了。
控制代码02:锁定赋值码
CU控制代码00001000开头的,或者是控制代码00000000开头的,就是锁定赋值码。其代码格式如下:
00001000 ssssssss aaaaaaaa
或者
00000000 ssssssss aaaaaaaa
ssssssss是地址,aaaaaaaa是数值,地址和数值都是十六进制的。
锁定赋值码的功能,就是把数值aaaaaaaa写入地址ssssssss中,并锁定数值,数值类型由要写入的数值大小来决定。例如:
InfiniteHealth (Veronica)
00001000 00BDEA9E 000000C8
就是把1字节数值C8(十进制是200),写入地址BDEA9E,并锁定。例子这个代码在游戏里的实际作用,就是锁定血条。
要用CCAPI实现这个金手指代码,只需要添加一个code,输入地址和对应的数值,并勾选上frozen锁定框。
3 小时前 上传
下载附件(8.47 KB)
锁定赋值码,还有些是控制代码00000000开头的,例如:
Unit1
00000000 1A34F8B2 0000001E
00000000 1A34F8B3 00000009
同上面一样,只要为每一组的数据都添加一个code,分别输入对应的地址和数值,选好对应的数值类型,再勾选上frozen锁定框就可以了。
只有锁定赋值码的金手指代码,也是静态地址金手指代码,可以选择save codes保存,以备下次再用。
控制代码03:加法压缩码
CU控制代码00004200开头的(或者控制代码00004100和00004000开头的)一行代码,加上00004nnn开头的一行代码,两行代码一起构成了一个加法压缩码。其代码格式如下:
00004200 ssssssss aaaaaaaa
00004nnn xxxxxxxx yyyyyyyy
或者
00004100 ssssssss aaaaaaaa
00004nnn xxxxxxxx yyyyyyyy
或者
00004000 ssssssss aaaaaaaa
00004nnn xxxxxxxx yyyyyyyy
其中,ssssssss是起始地址,aaaaaaaa是起始数值,nnn是未压缩代码行数,xxxxxxxx是地址间距,yyyyyyyy是数值间距,都是十六进制的。
加法压缩码的功能,就是将多行直写码,压缩成两行,未压缩的地址和对应数值可表示如下:
ssssssss :aaaaaaaa
ssssssss+xxxxxxxx :aaaaaaaa+yyyyyyyy
......
ssssssss+(nnn -1)xxxxxxxx :aaaaaaaa+(nnn -1)yyyyyyyy
总共nnn组数据(地址:数值),数值类型由要写入的数值大小来决定。
在cu代码里,数值间距yyyyyyyy基本上都是0,还没见过是其他数值的代码。另外,再强调下,金手指代码里nnn等数据都是十六进制的,若nnn为010,则共有16组未压缩数据,而非10组数据。
下面举个例子:
QuickFinish Quest
00004200 3345B8CF 000000FF
00004007 0000004C 00000000
起始地址3345B8CF,起始数值FF(十进制为255)是1个字节(数值类型选择1字节),未压缩代码行数为7行,地址间距4C,数值间距为0。所以,未压缩的地址和对应数值可表示如下:
3345B8CF :FF
3345B91B :FF
3345B967 :FF
3345B9B3 :FF
3345B9FF :FF
3345BA4B :FF
3345BA97 :FF
共7组数据,要用CCAPI实现这个金手指代码,就需要为每一组的数据都添加一个code,分别输入对应的地址和数值就可以了。
加法压缩码,还有些是控制代码00004100和00004000开头的,区别就在于00004200开头的只写入一次,而00004100和00004000开头的保持锁定。例如:
MaxStats Aoto
00004100 015E5C82 0000FFFF
00004004 00000004 00000000
起始地址15E5C82,起始数值FFFF(十进制为65535)是2个字节(数值类型选择2字节),未压缩代码行数为4行,地址间距4,数值间距为0。
和上面一样,算出未压缩的地址,用CCAPI为每一组的数据添加一个code,分别输入对应的地址和数值,并保持锁定就可以了。
有时候一个金手指代码里不止一个加法压缩码,例如:
AllCharacters HP 999/999
00004000 012D366C 000003E7
00004007 0000018C 00000000
00004000 012D3678 000003E7
00004007 0000018C 00000000
00004000 012D3694 000003E7
00004007 0000018C 00000000
有3个加法压缩码,每一个有7组未压缩数据,总共21组数据,CCAPI要实现这个金手指代码,就需要把这些数据全部输入。以前cfw3.55能用cu2.3的时候,这个步骤是软件自动计算输入的,现在就只能自己手动输入了,略显麻烦。不过加法压缩码一般是用在物品装备或者解锁人物之类的代码上,基本上只需要输入一次,还算可以接受吧。上面这个例子的数据稍微有点多,这里就不列举具体数值了。
另外,只有加法压缩码的金手指代码,也是静态地址金手指代码,可以选择save codes保存,以备下次再用。
控制代码04:指针寻址码
CU控制代码00003000开头的,就是指针寻址码。其代码格式如下:
00003000 ssssssss yyyyyyyy
其中,ssssssss是指针地址,yyyyyyyy是数值间距,指针寻址码数值类型都是4字节。
指针地址ssssssss储存的数值+数值间距yyyyyyyy=动态地址数值。
指针寻址码的功能,就是计算出动态地址数值,将此动态地址数值作为下一行代码的地址。
指针地址ssssssss储存的数值(数值类型是4字节),是ps3游戏程序自行生成的,而且不固定,一般读档后就变,有些动画和转换场景之后,也会改变。
指针寻址码一般和一个直写码或者锁定赋值码构成一组数据。例如:
(WitchPower) 9999999
00003000 0115AD94 00000048
00002000 00000000 0098967F
指针寻址码来确定地址,初始指针地址0115AD94所储存的数值(数值类型为4字节)+数值间距00000048=地址数值。
直写码写入数值,00000000表示上一行代码计算得出的地址数值作为此行代码的实际地址,0098967F是需要修改的数值,要填入实际地址中。
用CCAPI来实现代码,首先需要查看初始指针地址0115AD94所储存的数值(数值类型为4字节)。直接添加new code(此code可保留,用于实时查看地址变动),地址栏输入这个地址0115AD94,数值类型选4字节,显示出来储存的数值目前为361353232。
361353232转换成十六进制,数值为1589D010,这样地址数值=1589D010+00000048=1589D058。
添加金手指new code,刚算出来的地址数值1589D058作为实际地址,输入修改数值0098967F(CCCheat 1.01填入的是十进制9999999),98967F是3个字节,所以数值类型选4字节,这时金手指就起作用了。
有时候指针寻址码不止一行,这就包含了多重指针。例如:
PlayerMP Maximum 1000
00003000 01B4EF9C 00000008
00003000 00000000 00000020
00002000 00000000 000003E8
第一行指针寻址码,假设初始指针地址01B4EF9C所储存的数值为a(转换为十六进制,数值类型为4字节),则a+00000008=地址数值b。
第二行指针寻址码,地址00000000表示上一行代码计算得出的地址数值b作为此行代码的指针地址,地址b所储存的数值为c(转换为十六进制,数值类型为4字节),则c+00000020=地址数值d。
第三行直写码,00000000表示上一行代码计算得出的地址数值d作为此行代码的实际地址,000003E8(十进制为1000)是需要修改的数值,要填入实际地址d中,这里3E8是1.5个字节,所以数值类型选择2个字节。
更多行的指针寻址码以此类推。
包含指针寻址码的金手指代码,都是动态地址金手指代码,因为实际地址是变化的,具体应用的时候,还是需要查看金手指代码来计算动态地址,所以没必要用软件保存codes,最多保存下初始指针地址,用于实时查看下地址变动。
控制代码05:键位条件码
CU控制代码0000Cnnn开头的,就是键位条件码。其代码格式如下:
0000Cnnn 00000000 aaaaaaaa
其中,nnn是键位条件码控制的代码行数,00000000是当前手柄键位数值,aaaaaaaa是条件数值。
键位条件码的功能,就是只有当满足给定的条件“当前手柄键位数值等于条件数值aaaaaaaa”时(手柄按下对应按键后),那么执行一次键位条件码下面的nnn行代码。例如:
Grenade999 (Press Select)
0000C001 00000000 00010000
00002000 1090EDE8 000007FF
条件数值00010000对应手柄按键Select,就是当按下Select键时,CU金手指程序执行一次键位条件码下面的1行代码,例子的金手指代码效果就是直写码赋值,只是多了一行键位条件码控制。
键位条件码对我们来说没什么用,用CCAPI来实现的,就在需要修改的时候,忽略这一行的键位条件码,直接实现后面代码的效果。
控制代码06:数值复制码
CU控制代码00005000开头的(或者控制代码00005100开头的)一行代码,加上00005000开头的一行代码,两行代码一起构成了一个数值复制码。其代码格式如下:
00005000 rrrrrrrr wwwwwwww对应数值类型4字节
00005000 00000001 00000000
或者
00005100 rrrrrrrr wwwwwwww对应数值类型2字节
00005000 00000001 00000000
其中,rrrrrrrr是读取地址,wwwwwwww是写入地址,第二行00000001表示读取数值,00000000表示写入数值。
数值复制码的功能就是把读取地址rrrrrrrr储存的数值复制到写入地址wwwwwwww中。
00005100和00005000的区别就在于数值类型不同,00005000开头的代码复制4字节数值,00005100开头的代码复制2字节数值。例如:
NinjaMagic Max
0000C002 00000000 00000030
00005000 0171F630 0171F634
00005000 00000001 00000000
第一行是键位条件码,忽略。第二行和第三行就是数值复制码,00005000对应数值类型4字节,其作用就是把读取地址0171F630储存的4字节数值复制到写入地址0171F634中。
用CCAPI来实现,先添加一个code,地址填0171F630,数值类型选4 bytes,可以看见其储存的数值为十进制数1128792064;再添加一个code,地址填0171F634,数值类型选4 bytes,复制读取地址0171F630储存的数值1128792064,填入value中,这样,金手指就生效了。
再看一个例子:
HPMax
00005100 1028C7E4 1028C7B4
00005000 00000001 00000000
00005100 1028C7E4 1028C7E6
00005000 00000001 00000000
总共两个数值复制码,00005100对应数值类型2字节,其作用就是把读取地址1028C7E4储存的2字节数值复制到写入地址1028C7B4和1028C7E6中。
用CCAPI,就是填入读取和写入地址,选好数值类型,把value中的数值复制一下就可以了。
只有数值复制码的金手指代码,也是静态地址金手指代码,可以选择save codes保存,以备下次再用。
控制代码07:暂存码
CU控制代码00003003和00003006开头的,或者00003002和00003005开头的,或者00003001和00003004开头的,就是暂存码。其代码格式如下:
00003003 00000000 0000000 对应数值类型4字节
00003002 00000000 0000000 对应数值类型2字节
00003001 00000000 0000000 对应数值类型1字节
功能是读取当前地址(源地址),将其储存的数值写入暂存;
00003006 00000000 0000000 对应数值类型4字节
00003005 00000000 0000000 对应数值类型2字节
00003004 00000000 0000000 对应数值类型1字节
功能是读取暂存,将暂存中的数值写入当前地址(目标地址)。
暂存码总是成对出现,00003003和00003006匹配,00003002和00003005匹配,00003001和00003004匹配。
暂存码一般与键位条件码及指针寻址码配合使用,每一对就完成一次两个不同地址之间的数值复制。
暂存码和数值复制码的区别,就在于地址类型不同,数值复制码用于静态地址,暂存码用于动态地址。例如:
(PressL1) To P1 Infinite Health
0000C006 00000000 00000004
00003000 32A8F1B0 00000CF0
00003000 00000000 00000224
00003003 00000000 00000000
00003000 32A8F1B0 00000CF0
00003000 00000000 00000220
00003006 00000000 00000000
第一行键位条件码控制,就是当按下L1键时,CU金手指程序执行一次下面的6行代码。对我们来说没用,忽略。
第二行,指针寻址码,初始指针地址32A8F1B0当前储存的数值为868244224(十六进制为33C05B00),则地址数值=33C05B00+00000CF0=33C067F0。
第三行,指针寻址码,地址00000000表示上一行的计算结果地址数值33C067F0作为本行指针地址,地址33C067F0当前储存的数值为868242032(十六进制为33C05270),则地址数值=33C05270+00000224=33C05494。
第四行,暂存码00003003,对应数值类型4字节,读取当前地址(源地址),将其储存的4字节数值写入暂存,地址00000000表示上一行的计算结果地址数值33C05494作为本行当前地址,源地址33C05494当前储存的4字节数值为十进制数30000,则暂存中的4字节数值变为十进制数30000。
第五行,指针寻址码,由于当前例子的第五行和第二行是一样的,则地址数值=33C067F0。
第六行,指针寻址码,地址00000000表示上一行的计算结果地址数值33C067F0作为本行指针地址,地址33C067F0当前储存的数值为868242032(十六进制为33C05270),则地址数值=33C05270+00000220=33C05490。
第七行,暂存码00003006,对应数值类型4字节,读取暂存,将暂存中的4字节数值写入当前地址(目标地址),在第四行中暂存中的4字节数值已经变为了十进制数30000,地址00000000表示上一行的计算结果地址数值33C05490作为本行当前地址,则目标地址33C05490储存的4字节数值变为十进制数30000。
此例子实质上就是通过暂存作为中转,复制源地址33C05494储存的数值到目标地址33C05490中。此例子在游戏中产生的效果,就是把人物当前生命值变为最大生命值。
用CCAPI来实现,就是找出源地址和目标地址,然后把源地址储存的数值复制到目标地址中。注意不同代码对应的数值类型,上例中00003003和00003006对应的数值类型是4字节,源地址33C05494,目标地址33C05490。
暂存码都是用在动态地址中,因为实际地址是变化的,具体应用的时候,还是需要查看金手指代码来计算动态地址,所以没必要用软件保存codes。
控制代码08:主码
CU代码里名称叫做Master Code的就是主码。例如:
MasterCode
00000100424C4A4D 60389018
以前要用金手指,在usb金手指狗或者金手指光盘软件里,主码必须开启,同一游戏的其他代码作为附属码,才可以使用。但是现在用CCAPI直接改内存,可以直接改附属码,所以主码Master Code对我们来说完全没用,可以忽略。
控制代码09:描述信息码
CU代码里名称叫做Info的就是描述信息码。例如:
Info- [For 01.01]
0000000000000000 00000000
描述信息码Info一般是关于金手指的信息,比如游戏版本、注意事项、按键提示等等,其本身不起任何作用,所以看下就行了。
总结
本文已经全面具体的解析了cu2.3格式的金手指代码,对各个代码的基本信息总结如下表:
代码名称 |
控制代码 |
数值类型 |
地址 |
直写码 |
00002000 |
写入数值决定 |
静态 |
锁定赋值码 |
00001000 |
写入数值决定 数值锁定 |
静态 |
00000000 |
|||
加法压缩码 |
00004200和00004nnn |
写入数值决定 |
静态 |
00004100和00004nnn |
写入数值决定 数值锁定 |
||
00004000和00004nnn |
|||
指针寻址码 |
00003000 |
4字节 |
动态 |
键位条件码 |
0000Cnnn |
忽略 |
忽略 |
数值复制码 |
00005000和00005000 |
4字节 |
静态 |
00005100和00005000 |
2字节 |
||
暂存码 |
00003003和00003006 |
4字节 |
动态 |
00003002和00003005 |
2字节 |
||
00003001和00003004 |
1字节 |
||
主码MasterCode |
忽略 |
忽略 |
忽略 |
描述信息码info |
忽略 |
忽略 |
忽略 |
用CCAPI来实现CU金手指代码的基本流程,就是通过代码,能快速定位地址和得到要修改的数值,选好对应的数值类型,添加codes,金手指就生效了。
纯静态地址的金手指代码,可以用CCCheat 1.01的save codes保存,以备下次再用。而任何包含了动态代码的金手指,都是动态地址的金手指代码,由于实际地址是变动的,没必要用save codes保存。
使用金手指时,请注意游戏版本匹配,并及时存档。尤其对动态地址的金手指代码,请慎用锁定。当读档、动画或场景变动时,动态地址会改变,如果此时锁定,有可能会造成ps3死机。除非你相当清楚地址改变的触发时机,否则不推荐锁定动态地址金手指。比如,在打boss的时候,先锁定动态地址金手指,当boss就剩血皮的时候,暂停,在pc端取消锁定,回去打死boss,此时一般是剧情动画,之后游戏程序会重新分配地址,由于刚才取消了锁定,所以不会造成内存地址冲突,也就没了死机的风险。总之,锁定动态地址金手指是有死机风险的,看个人取舍了。
最后,在这里感谢CMP论坛的bungholio整理cu金手指代码,还要感谢一下国内外各大网站论坛的金手指提供者。