|
首先说明下我是新手,如果哪里说的不对请各位指出
本教程参考了E大的【金手指教程3】更多调试技巧及数据挖掘
还有露露酱发的5篇breeze教程,所以内容上很相似
还参考了露易娘的找指针教程等等很多人教程,所以内容上会有很多雷同,感谢各位大佬分享!
起因是看了这个教程
ce修改器教程详解第六关
,觉得ns上应该也能用这个方法手动找指针,但是苦苦找不到这方面的教程,于是花了一点时间研究了一下发现行得通.
决定将我的经验分享一下,抛砖引玉.
教程开始:
用到的游戏是「高达合购群全网首发」邪恶国王与出色勇者港版
要寻找的是商店物品的道具id指针,但是不知道读取道具id的程序段,那么就行金钱入手
首先打开breeze寻找当前金钱
搜索类型u32,值999999999,左边看到搜索到了3个地址,按L查看
然后按Y依次将三个值修改为8888,77777,66666
回到游戏,发现金钱被修改为了88888说明第一个地址是对的
再次打开breeze
然后在第一个内存地址上,按R3(内存查看)
这里显示的是内存地址
点击更多→设置断点
设置写入断点
先按+号,背景会变成蓝色
再按R,两个地址会变一样这样断点就设置成功了
按home回到游戏,随便购买一个物品再返回,我这里买了三个驱魔熏香(单价是40,买三个是120,88888-120=88768)
发现断点触发了,底下多了一条
Accessed from0x729c4d44f4 0x2d034c Count=1
这个729C4D44F4是触发地址
0x02d034c(这个是BL指令的返回地址+4,我也不知道这样说对不对,如果存在代码共用可以用这个进行区分)
Count=1代表触发一次,你如果多买几次这个值也会变成几
这时候按Gen2Detach背景颜色会重新变成半透明,729C4D44F4这个地址也变成了
[M+0x002d04f4] 0x02d034c str w10,[x9]
重点说下这个str w10,[x9],其中w10是要写入的金钱,[x9]是被写入的内存地址
如果你有idapro的话打开后按G跳转到729C4D44F4再按C你会发现就是str w10,[x9]这条指令
当然你也可以只用breeze,我只是觉得idapro查看结构体方便一些,我平常都是idapro,breeze,edizon,JNoexsClient这四个工具配合着使用
这不重要,今天要改的不是金钱而是道具ID,
回到Breeze光标移动到[M+0x002d04f4] 0x02d034c str w10,[x9]上按X,会跳到触发的程序段,向上翻发现有一个
main:00000000002D04DC 6A A9 14 1B MSUB W10, W11, W20, W10
这个w10是剩余金钱
w11是物品单价
w20是购买数量
意思是w10=w11 x w20 -w10
配合下面的
[M+0x002d04f4] 0x02d034c str w10,[x9]
完成金钱扣减
接下来我们就追踪这个W11,发现上面有一行
main:00000000002D04D8 2B 87 40 B9 LDR W11, [X25,#0x84]
说明这个w11(物品单价)是从[X25,#0x84]来的,
[M+0x002d04f4] 0x02d034c str w10,[x9]//已知这个是扣钱的,那么扣完钱就得交货吧
然后往下翻,发现在M+0x002d04f4下面还有个
main:00000000002D04F8 21 03 40 B9 LDR W1, [X25]//这条是读取x25结构体的头部,正好是物品的ID
接下来光标移动到
我在main:00000000002D04F8 21 03 40 B9 LDR W1, [X25]这行上下断点,然后返回游戏买了个驱魔熏香,发现触发断点的值是0x5B3
试着修改一下,直接把这个改为mov w1,#0x5B3
然后随便不管买那个物品都是驱魔熏香,断定这个值就是驱魔熏香的物品ID,
你把这个加到金手指里,就是E大所说的买A得B老金
把这行按X改回原来的,按L(Watch instution 监视)再按+号下断点,把商店里所有的物品都买一遍,当前售卖的物品的ID(笨方法,继续向上追踪的话有可能找到所有物品的ID,我不会,有会的可以教教)
接下来向上追踪这个 [X25]是哪里来的,上面有一条
.text:00000000002D03D0 F9 33 89 9A CSEL X25, XZR, X9, CC
这句的意思是
条件选择:如果处理器状态中的进位标志(C)为0,则将0写入寄存器X25;否则,将寄存器X9的值写入X25。(当然是问的DeepSeek啦)
意思就是不是将x9赋值给X25就是将0赋值给X25,那么肯定不是0
可以理解为,[x25]=[x9]
所以我们向上继续追踪x9上面正好有
.text:00000000002D03C0 09 15 80 52 MOV W9, #0xA8
.text:00000000002D03C4 A9 2D 09 9B MADD X9, X13, X9, X11
意思是将#0xA8赋值给 W9(x9的低8位,就是0x000000a8)
然后X9 = (X13 * X9) + X11; // 计算,并更新X9的值
注意这个x11要解引用,我们在这行(MADD X9, X13, X9, X11)上下断点(按L监视)再在Next这行上按X改成Next:addr 729C4D43C4 X13 offset 0000
按+号设置断点
回到游戏购买驱魔熏香,
回到Breeze后发现多了一行Register X13 has value 0x32 count=1
已知x9是0xA8拿出计算器计算一下0xa8 乘0x32 =0x20D0
同样的方法我们再看下x11是什么,改成Next:addr 729C4D43C4 X11 offset 0000
发现x11是0x41B241C3CC
计算一下0xa8 乘0x32 =0x20D0
0x20D0+0x41B241C3CC=41B241E49C
正好对应上面的图第三行
可以理解为,[x25]=[x9] =(X13 * X9) + X11;
这个20d0就是最后一个偏移
我们用JNoexsClient验证一下
0x41B241C3CC+20d0
接下来就继续向上找x11的值(41B241C3CC)哪里来的,
发现有两行都给x11赋了值:
.text:00000000002D0354 0B F9 40 F9 LDR X11, [X8,#0x1F0]
.text:00000000002D0368 6B 8D 40 F9 LDR X11, [X11,#0x118]
我们先看底下这行
.text:00000000002D0368 6B 8D 40 F9 LDR X11, [X11,#0x118]
在这行下断点,购买驱魔熏香后发现下面是
[0x41f3403fd8,0x0118] 02d034c 00000041b241c3cc
接下来我们要找41f3403fd8
.text:00000000002D0354 0B F9 40 F9 LDR X11, [X8,#0x1F0]
同样的方法,区别是改成了Next:addr 729C4D43C4 X8 offset 01F0
[0x41f33e4720,0x01f0] 02d034c 00000041f3403fd8
接下来我们要找0x41f33e4720(x8)
上面有:
.text:00000000002D034C 56 11 00 90 ADRP X22, #0x4F8000
.text:00000000002D0350 C8 9A 42 F9 LDR X8, [X22,#0x530]
意思是0x41f33e4720(x8)= [X22,#0x530]
X22= main+0x4F8000
串联起来最终就是[[[main+4F8530]+1f0]+118]+20D0
我们用JNoexsClient验证下这个指针对不对
已知物品的单价就是物品id偏移0x84,所以
驱魔熏香的物品价格指针就是20d0+84=2154
[[[main+4F8530]+1f0]+118]+2154
把驱魔熏香的单价改为0xfff后进游戏发现单价是4095(fff的10进制)
说明生效了,
但是这个物品ID修改完了会死机,可能是只读的,但是我们今天的重点是找指针哈哈哈
教程完毕.
附上我的存档文件:
|
|