注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

lbw2007

黑夜赐给我一双黑色的眼睛,我却给它滴眼药水!

 
 
 

日志

 
 

搜到的老帖,关于指针码的  

2009-12-27 16:16:11|  分类: PSP |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

(CTP)其实也是很简单 指针教程发布
原作 zhangyan1100
grayeva 重新编写

CGPSP修改技术研究团出品,转载注明作者和原著,以及原帖地址http://www.cngba.com/thread-17644944-1-1.html

看不懂的地方欢迎PM或者回帖提问哦

1,指针概念

大家都知道PSP把很多数据放在内存里,许多数据放在内存的固定位置中,而某一些则在不断变化着它存储的地点。
打个比方就是你去超市寄包,把包放在服务台就像放在固定地址里,包总是在那里的,购好物直接去拿就可以了。而有些时候,你把包放在有锁的柜子里,你要拿的时候一定要对照着钥匙上的编号去取,每次存放都可以不一样,取的时候也就按照不同的标示取,这个标志物品(代码)位置的标示就在修改代码中称为“指针”了
所谓指针码,其实就是自动追踪动态地址的金手指代码  


2.指针构成  

指针直写码的基础构成分为四部分:指针地址、基地址、偏移量、锁定值  

指针地址:表示这个标示的所在地  
基地址:指针标示的书写内容,表示了动态地址区域的某个字节所在地(在指针码里面不写出来,因为它就是指针地址上面的数据)  
偏移量:基地址距离我们需要的这个修改地址的距离  
锁定值:我们需要地址的锁定后数值  

所以我们可以看到和普通直写码有所不同的是,指针码用2个数据(指针地址+偏移量)才能找到正确地址,而普通直写码只需要一个数据——确切地址  

3.由指针码找到确切地址  

先给个指针码格式:  
0x6 aaaaaaa 0x000000 bb   
0x000 X nnnn 0x cccccccc  
aaaaaaa=指针地址   
cccccccc=偏移量  
bb=锁定值  
X和nnnn=锁定字节和偏移方向(可以有负偏移,下文有各种解释的)  

举例:梦幻改名字,第一、二个字地址  
_C0 人名第1、2字  
_L 0x604C91E4 0xXXXXXXXX  
_L 0x00020001 0x000007C8  

实际地址=0x004C91E4上面的数值-8800000+7C8  

-08800000的原因:psp用户区地质从08800000开始的,不过一般修改器已经帮你减掉了这个数值,现在你自己跳转,那就自己减去  

4.区域理念  
指针的动态地址往往不是一个地址乱飘,而是一大块地址乱飘,所以就会出现指针共享性问题,不必惊讶说那么多代码都用一个指针?这个很正常的

5.指针搜索  
指针搜索需要用到指针搜索工具,一般单级指针推荐cw工具,多级就要自己找找了  

搜索方法:  
1)找到动态地址的当前位置——找不到就没办法了——并记录下来  
2)完成1的同时,使用“内存管理”——“dump内存”下一个内存  
3)重复1.2,直到有足够样本,记得地址要让他动一下,这会带动指针,和我们其它搜索一个原理  
4)使用cw工具,放入dump和对应地址,让它自动搜索出来  
5)根据找到地址编写代码  
具体例子3L

6.多级指针概念  

多级指针其实就是个指针链,一个指针指向的不是实际地址,而是另外一个指针地址,这样可以无限追踪下去....

[ 本帖最后由 grayeva 于 2008-11-8 21:11 编辑 ]

4
评分次数

dieerwolf  人气 + 1 ℃
来晚了。。。


xioudisi  人气 + 1 ℃
恭喜恭喜~~


GAOGAIGAR12  人气 + 1 ℃
不客气~应该的~


hsz000  人气 + 1 ℃
您的文章已经被选为优秀文章

本主题由 vosman 于 2009-6-3 13:53 解除置顶收藏 分享 评分 

 
 回复 引用 订阅 报告 道具 TOP
 
 

grayeva 发短消息
加为好友
grayeva (G-ray)当前离线

你以为我是谁

积分12386 威望0 点 阅读权限90 性别男 来自nerv 在线时间600 小时 最后登录2009-12-8  
CG_CTP团

 

UID1185939 帖子3174 精华2 积分12386 C金11950 枚 诚信度0 点 人气312 ℃ G币5 枚 注册时间2007-7-10  2#
 发表于 2008-11-8 20:10 | 只看该作者 指针码   

 

单字节/8 bits   
0x6 aaaaaaa 0x000000 bb   
0x qqq 0 nnnn 0x cccccccc   
0x9 sssssss 0x000000 dd   
※从 aaaaaaa 地址开始读取四字节的数值后减去08800000再 加上 cccccccc ,把此数值当作实际地址,把此实际地址上的数值修改成 bb 。 aaaaaaa 的尾数必须是0、4、8或C。   
如果想用指针压缩码的话需要9开头的那行附加行,共压缩 nnnn 组有规律的普通的指针码,每次 aaaaaaa 递增 qqq ×4, cccccccc 递增 sssssss , bb 递增 dd 。   

0x6 aaaaaaa 0x000000 bb   
0x qqq 3 nnnn 0x cccccccc   
0x9 sssssss 0x000000 dd   
※从 aaaaaaa 地址开始读取四字节的数值后减去08800000再 减去 cccccccc ,把此数值当作实际地址,把此实际地址上的数值修改成 bb 。 aaaaaaa 的尾数必须是0、4、8或C。   
如果想用 指针压缩码的话需要9开头的那行附加行,共压缩 nnnn 组有规律的普通的指针码,每次 aaaaaaa 递增 qqq ×4, cccccccc 递减 sssssss , bb 递增 dd 。   

双字节/16 bits   
0x6 aaaaaaa 0x0000 bbbb   
0x qqq 1 nnnn 0x cccccccc   
0x9 sssssss 0x0000 dddd   
※从 aaaaaaa 地址开始读取四字节的数值后减去08800000再 加上 cccccccc ,把此数值当作实际地址,把此实际地址上的数值修改成 bbbb 。 aaaaaaa 的尾数必须是0、4、8或C。   
如果想用指针压缩码的话需要9开头的那行附加行,共压缩 nnnn 组有规律的普通的指针码,每次 aaaaaaa 递增 qqq ×4, cccccccc 递增 sssssss*2 , bbbb 递增 dddd 。   

0x6 aaaaaaa 0x0000 bbbb   
0x qqq 4 nnnn 0x cccccccc   
0x9 sssssss 0x0000 dddd   
※从 aaaaaaa 地址开始读取四字节的数值后减去08800000再 减去 cccccccc ,把此数值当作实际地址,把此实际地址上的数值修改成 bbbb 。 aaaaaaa 的尾数必须是0、4、8或C。   
如果想用指针压缩码的话需要9开头的那行附加行,共压缩 nnnn 组有规律的普通的指针码,每次 aaaaaaa 递增 qqq ×4, cccccccc 递减 sssssss *2, bbbb 递增 dddd 。   

四字节/32 bits   
0x6 aaaaaaa 0x bbbbbbbb   
0x qqq 2 nnnn 0x cccccccc   
0x9 sssssss 0x dddddddd   
※从 aaaaaaa 地址开始读取四字节的数值后减去08800000再 加上 cccccccc ,把此数值当作实际地址,把此实际地址上的数值修改成 bbbbbbbb 。 aaaaaaa 的尾数必须是0、4、8或C。   
如果想用 指针压缩码的话需要9开头的那行附加行,共压缩 nnnn 组有规律的普通的指针码,每次 aaaaaaa 递增 qqq ×4, cccccccc 递增 sssssss *4, bbbbbbbb 递增 dddddddd 。   

0x6 aaaaaaa 0x bbbbbbbb   
0x qqq 5 nnnn 0x cccccccc   
0x9 sssssss 0x dddddddd   
※从 aaaaaaa 地址开始读取四字节的数值后减去08800000再 减去 cccccccc ,把此数值当作实际地址,把此实际地址上的数值修改成 bbbbbbbb 。 aaaaaaa 的尾数必须是0、4、8或C。   
如果想用指针压缩码的话需要9开头的那行附加行,共压缩 nnnn 组有规律的普通的指针码,每次 aaaaaaa 递增 qqq ×4, cccccccc 递减 sssssss*4 , bbbbbbbb 递增 dddddddd 。   

多级指针码   

 

单字节/8 bits   
0x6 aaaaaaa 0x000000 bb   
0x000 0 nnnn 0x cccccccc   
0x2 sssssss 0x3 ttttttt   
……   

0x6 aaaaaaa 0x000000 bb   
0x000 3 nnnn 0x cccccccc   
0x2 sssssss 0x3 ttttttt   
……   

双字节/16 bits   
0x6 aaaaaaa 0x0000 bbbb   
0x000 1 nnnn 0x cccccccc   
0x2 sssssss 0x3 ttttttt   
……   

0x6 aaaaaaa 0x0000 bbbb   
0x000 4 nnnn 0x cccccccc   
0x2 sssssss 0x3 ttttttt   
……   

四字节/32 bits   
0x6 aaaaaaa 0x bbbbbbbb   
0x000 2 nnnn 0x cccccccc   
0x2 sssssss 0x3 ttttttt   
……   

0x6 aaaaaaa 0x bbbbbbbb   
0x000 5 nnnn 0x cccccccc   
0x2 sssssss 0x3 ttttttt   
……   
※多级指针码的格式类似普通的指针码,区别在于附加行的开头数字是2或3,而且附加行可以有多行,这个要视 nnnn 部分而定。 nnnn 表示有多少级指针,比如3级指针就是0003; sssssss 和 ttttttt 分别是第1和第2级偏移值,第3、第4级偏移值就依次在后面的省略号部分追加;附加行开头的2表示正向偏移值,开头的3表示逆向偏移值; cccccccc 则是末级偏移值,也就是最后要写入数据 bb 部分时用 的偏移值,正向还是逆向由前面的 粗体字 部分确定。   


指针复制码   

 

0x6 aaaaaaa 0x bbbbbbbb   
0x qqq 0 0002 0x cccccccc   
0x1 sssssss 0x00000000   
※ nnnn 必须等于0002,作用是从地址A复制 bbbbbbbb 个字节到地址B。   
地址A= aaaaaaa 上的值减08800000加 cccccccc   
地址B=( aaaaaaa + qqq ×4)上的值减08800000加 sssssss
 

  评论这张
 
阅读(603)| 评论(2)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017