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

风雨夜归人

专业收集资料,个人爱好!

 
 
 

日志

 
 

【CE帮助选译】内存搜索技巧  

2009-05-19 16:15:39|  分类: CCB的教程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
CE的帮助中有不少有用的知识和技巧,我粗略地翻译了一下,应该不算真正的翻译,只能算是导读吧,供那些英文不好的朋友参考一下,不一定准确,我附上原文供大家对照,建议大家参照着原文来看。

Searching Tip

Originally posted by Smidge204

When searching for a value in memory using the scan, here are a few pointers to find the value quickly:

1) If the value is known, but the format is not (ie: Byte, 2 Bytes, 4 Bytes...) search for the smallest type that will hold the data.

For example, if the value you want is 60, search for bytes. If the value is 1224, search for 2 Byte values, etc. The idea being that if the actual format is larger (You searched for 2 byte values but it's actually a 4 byte values) then the other bytes would be 0 anyway and the value would still be found.

But if you search for a 4 byte value when it's really less, you might never find it because you're reading nearby bytes as well that might screw up your search!


2) If the value is unknown, use the "Unknown initial value" scan along with method 1 (ie: always use bytes unless you happen to know it's size). Then do something that changes it's value.

Once the value has changed, repeat the scan using "Changed values". This will filter out all the crap.

Now go back into the game and do a bunch of stuff that DOESN'T change the value, if possible. Now repeat the scan for "Unchanged values". This will filter out stuff like position values, timers and counters.

Keep repeating until you've widdled down the searches to a managable amount, then add all the results to your list and keep an eye on them as the game runs. Remove anything that changes when it logically shouldn't. Anything that's left, try plugging in random values and see if something happens!


3) If you've found a bunch of good values, and youre looking for information that is somewhat related (Such as Lives and money, or whatever) , try restricting your search range to within a few kilobytes of the known value either way. This is especially powerful when looking for values in tables (High score list, for example) since they tend to be right next to eachother.


4) Use "Bigger than" and "Smaller than" as often as possible, especially after scans for changed or unchanged values. This can generally wittle down the results pretty fast.


5) Use arrays to peek at multiple byte values at once. Useful for detecing patterns!



6) Sometimes string values are not stored as ASCII strings, so the "Text" search doesn't work. For example, "A" might be stored as 0x01 instead of 41. If that's the case, and you have control over the value in-game (character name?) then try these steps:

-Set the character name
-Search for "Unknown initial value"
-Change name
-Search for "Changed values"
(Repeat above two steps to eliminate as much junk as possible. See also tip #2)
-Change name to all the same characters. ie: "AAAAAAA". Try to max out the space you're given.
-Search one more time for changed values. If you've increased the number of displayed results enough to get a list, scroll down and see if you have a bunch of consecutive memory locations that have the same value. (Should be the same as the length of the string!)
-Add the first address to your list as an array equal to the length of the string you entered.
-Change name to an easily identifiable pattern. ie: "ABCDEFG"
-See if the bytes in your array changed to a similar pattern. If so, start mapping the characters to their values and you're done!

Once you have the character map, you can use it to "translate" other text you couldn't find before. Simply search for an array of bytes and enter in the expected values of each letter in order.


Hope that helps!
=SMidge=


搜索技巧

原帖由Smidge204发表

我们用扫描来搜索内存中的数值,这里有几个要点可以较快地找到数值:

1)若数值已知,但数据类型未知(例如单字节,2字节,4字节等),以能保存该数值的最小数据类型来扫描。

例如,你要找的数值是60,那么以单字节扫描。如果数值是1224,扫描2字节,等等。这个想法是因为如果实际数据格式确实比较大(你搜索2字节数值但实际上它是4字节的)那么其他的字节会是0,并且你仍然能找到正确结果。

但如果你以4字节搜索比较小的数值,那么你可能永远不会找到它,因为你同时读到了它相邻的字节,这样会干扰了你的搜索。

2)如果数值未知,按照上面第1点,使用“未知初始数值”来扫描(例如总是使用单字节除非你知道它的数据类型),然后让数值改变(CCB:让要扫描的数值改变,而其他无关的数值尽量不变)。

当数值改变时,以“改变了的数值”方式重复扫描。这样会过滤掉无关的内容。

现在回到游戏里面并且尽可能地做一连串不会使要找的数值改变的动作,现在使用“未改变的数值”方式重复扫描。这样又会过滤掉一些东西,类似坐标,计时器和计数器等。

继续重复直到结果少到一个可以管理的数量(CCB:可CE的设置中可以设定当扫描结果少于多少个时会在左边显示) ,把所有的结果都加到地址列表中并且在游戏继续运行时注意观察这些结果。去掉任何有变化的结果,当它在逻辑上来说不应该改变的时候(CCB:意思是说,当我们要找的数值在游戏中观察到没有变化,或者从理论上来说它不应该变化时,把那些数值有变化的地址从列表中去掉)。剩下来的那些,试试把它们改成随机的数值,看看有什么事情发生(CCB:例如,剩下几个结果你不知道哪一个是正确的结果,试着把它们改成不同的结果,看看游戏中看到的要找的数值变成了哪一个,那一个就是正确的结果,例如,剩下三个结果,你把第一个改成1111,把第二个改成2222,把第三个改成3344,那么如果游戏中我们要找的数值变成2222,你就知道哪一个是正确的了吧?)。

3)如果你已经找到了一大堆数值,并且你在找一些相关的信息(例如生命和钱等等),试着限制搜索的范围到已经找到的的数值的前后几KB。这个方法对于数值表特别有用(例如,最高成绩列表),因为它们基本上都是彼此相邻的。

4)尽可能经常使用“大于”和“小于”这些扫描方式,特别是在用“已改变的数值”和“未改变的数值”扫描之后。这个通常可以很快地减少扫描结果的数量。

5)使用阵列(CCB:即BYTE ARRAYS)来一次扫描多个字节数值。对于检查图案(CCB:在这里是指几个固定的数值以固定的位置组合在一起的内存区域)很有用。

6)有时字符并不以ASCII字符串储存,所以“文本”搜索这种方式不起作用。例如,“A”可能在内存中储存为0x01(CCB:表示十六进制的1)而不是41(CCB:英文大写字母A的ASCII码是十六进制41或十进制65)。如果是这种情况,并且你能在游戏中控制这些数值(例如角色名字?)那么试试下面这些步骤:

-设置角色名字
-搜索“未知初始数值”
-改名
-搜索“已改变的数值”
(重复上面两步以尽可能消除一些无关的结果,参照技巧2)
-把名字改为全部相同的字母。例如:“AAAAAA”。试着填满可以输入的那一栏
-再次搜索已改变的数值。如果你增加了可显示的结果数量(CCB:在CE的设置中可以设置少于多少个结果时显示)而得到结果列表。向下翻页看看有没有连续的内存位置上有相同的数值。(必须是和那个字串长度相同)
-添加第一个地址到地址列表做为一个阵列,长度等于你输入的字符串。
-改名为可以容易识别的图案。例如:“ABCDEFG”
-看看你的阵列是否变成类似的图案。如果是,开始对应那些字母和数值,你成功了!(CCB:即如果已经找到正确的内存位置,用所有可以做角色名字的字母改名,改名后看看名字和数值的对应关系,自己做出一个字母和数值的对照表)。

当你做出这个字母对照表之后,你可以用它“翻译”你之前用常规方式找不到的其他文本。简单地用字节阵列方式搜索并按顺序输入文本中每个字母的数值就可以了。

希望这些对你有帮助
=SMidge=

【CCB总结】
这些使用技巧对于不同程度的人都会有一定的帮助,多看看多试试,应该会让你更快和更容易地找到你要找的内存地址,并且会减少找不到结果的情况,细心体会一下吧。

  评论这张
 
阅读(613)| 评论(0)
推荐 转载

历史上的今天

评论

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

页脚

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