|
网上的不遇敌修改器已经有了(风灵月影大佬那是永远滴神!),这篇文章主要是讲解一下不遇敌是如何实现的,以及如何追码。对于想要学习这方面知识的同学们应该算是一个思路分享。
实在我去研究P5S的不遇敌,是想了解大概机制,因为我终极的目的,是想要在rpcs3模仿的P5上面实现不遇敌。后来发现本身太天真了,模仿器上面的追码只能用四个字来形容,丧尽天良!
以是先把P5S的不遇敌思路整理出来,肯定是比新手入门要难一点,但绝对比模仿器简朴多了。
先简朴讲一下思路
看下图(请叫我灵魂画手)
我选择第二个,显示反汇编,跟踪该地址。则根据警戒值,我们得到了切入点:
game.exe+6E53B6 - 44 89 81 500F0000 - mov [rcx+00000F50],r8d
这里我们可以直接跳出这个call,或者直接点击return address里的第一个地址,返回到上一个call。
断点2:
取消上一个断点(即,取消game.exe+6E53B6处的断点)。再返回上一个call后,返回地址的上面有一个call,记录一下该call的地址。
game.exe+6E4772 - E8 819199FF - call game.exe+7D8F8
然后运行程序,快速切回游戏,操作人物退却别进战斗
这个call如果你对它下断,它会不停的触发,你可能会很高兴,因为这是不是阐明了找过头了,关键判断就在这个断点以下。
但是这个call有个题目,就是这是个共用代码段,而且rax的值不停在变动,导致没法追。
如果我是一个小白的话,很可能就止步于此的,但是现在我们可以不求甚解一下,直接跳出这个call,如果下一个断点很幸运的只在遇怪的时间才触发,那么我们根本就不消纠结这个call。
跳出这个call,发现下一个断点是
game.exe+82EBC8 - E8 E2A484FF - call game.exe+790AF
对断点4下断后,发现不停触发。根据我们的判断,遇敌判定应该在断点4和断点3之间
那我们进入这个call去看看
发现直接给我们跳到了game.exe+6BA170,要知道我们断点3的地址是game.exe+82EBC8。
这里遇到贫苦,game.exe+6BA170和game.exe+82EBC8离得太远了,唯一的解释是此call里面有jump指令到82EBC8上面,然后往下走直接ret。这种情况下jump点比较难找,因为有可能往返跳,比如A跳B,B跳C,C跳到82EBC8附近
以是只能从game.exe+6BA170这里跟踪下去,一点点耐烦的往下走,遇到call指令或者jump指令就下断尝试,需要找到遇敌会触发,寻常不会触发的路段
断点5:
从game.exe+6BA170往下走,到
game.exe+6BA21C - E8 3E7899FF - call game.exe+51A5F
此断点又是只有遇怪触发,继续往上追
断点7:
从game.exe+6BA213往上走,到
game.exe+6BA1D6 - E8 5F0B9AFF - call game.exe+5AD3A
寻常的时间会直接跳到game.exe+6BA245,遇敌的时间则不跳
进一步追踪上面的test al,al,发现只有遇敌的时间rax为1,其余的时间为地址
=====
补充下顺序的指令
game.exe+6BA170 - 40 53 - push rbx(函数头)
game.exe+6BA1D6 - E8 5F0B9AFF - call game.exe+5AD3A(不停触发)
game.exe+6BA1DB - 84 C0 - test al,al(关键判断,遇敌时rax=1,其余时间为地址)
game.exe+6BA1DD - 74 66 - je game.exe+6BA245(不停触发,寻常直接跳到函数尾部,遇敌时不跳)
game.exe+6BA213 - E8 E7F698FF - call game.exe+498FF(只有遇敌才弹)
game.exe+6BA21C - E8 3E7899FF - call game.exe+51A5F(只有遇敌才弹)
game.exe+6BA245 - 48 83 C4 20 - add rsp,20(函数尾部)
=====
这个关键点就很符合我们要的那个岔路口的特性:不停触发,其中一条道只有遇敌的时间触发。但是这个关键点后面的“1”告诉我们事情没有那么简朴。
我们先尝试下,可以通过代码注入把je改成jmp,或者把test al,al改成xor al,al
然后我们去勾引小怪。发现还是会遇敌,唯一的区别是原本应该显示的警戒界面,现在不显示了
也就是说,这个test al,al不是遇敌的岔路口,是显示警戒界面的岔路口!
我们追了大半天追了个寂寞!!
缓一口气,重整旗鼓。
没有关系,警戒和遇敌本来就一脉相承。
那么在现在这种情况下,我们就要去追这个rax是怎么酿成1的,因为通常的逻辑是:
遇敌→rax酿成1→显示警戒界面
在game.exe+6BA1DB - 84 C0 - test al,al上面,有一个
game.exe+6BA1D6 - E8 5F0B9AFF - call game.exe+5AD3A
我们需要进入这个call里去,找有没有给rax赋值的指令,然后根据逻辑下断,看是否符合遇敌才触发的判断
关键点2:
进入call game.exe+5AD3A后,有个jmp指令,直接把我们带到了
game.exe+6E48F0 - 4C 8B 05 F93BDC01 - mov r8,[game.exe+24A84F0]
发现寻常的时间,[r9+00000F84]的值为0,遇敌的时间为1。而当它为1的时间,恰好可以跳到mov al,01的指令,给rax赋值,完美!
那么下一步,我们就要去追踪[r9+00000F84]是哪里来的
比较幸运的是,r9在这里是不会变动的,以是我们可以直接添加地址
000002A109851298+00000F84,此地址为关键地址
有两段代码
第一段代码是把关键地址酿成1,第二段是把关键地址酿成0
以是我们能追踪的实在只有第一条
断点8:
对第一条代码显示反汇编,然后下断
game.exe+82ED1A - FF 82 840F0000 - inc [rdx+00000F84]
寻常不触发,遇怪时触发,往上追
断点10:
跳出call后,发现下一个是
game.exe+2F23B2 - 41 FF D7 - call r15
对这个call下断,然后我们发现它是不停触发的
断点11:
现在我们就遇到一个题目,断点10不停触发,call r15也不停触发,断点9只有遇怪的时间触发
那么现在我们有两种选择
1.从断点10往下追
2.从断点9往上追
因为r15明显是共用代码段,最重要的是断点9往上有一大串的代码,以是我决定用第二种方法
先返回断点9:game.exe+305D08
往上走,下断
game.exe+305C8A - 74 35 - je game.exe+305CC1
通过不停的下断→勾引小怪,可以得出结论
寻常的时间,必定会跳到game.exe+305D0D,只有在遇怪的时间,会继续往下走,从而来到断点11(game.exe+305C8A)
再进一步,寻常的时间rax为0,遇敌的时间rax为1
=====
补充下顺序的指令
game.exe+305C3C - 84 C0 - test al,al(关键点:寻常的时间rax为0,遇敌的时间rax为1)
game.exe+305C3E - 0F84 C9000000 - je game.exe+305D0D(跳到函数尾部)
game.exe+305C8A - 74 35 - je game.exe+305CC1(只有遇敌触发)
game.exe+305D08 - E8 C4DBD0FF - call game.exe+138D1(只有遇敌触发)
game.exe+305D0D - 48 8B 5C 24 78 - mov rbx,[rsp+78](函数尾部)
game.exe+305D17 - C3 - ret
=====
同样的原理,这里的关键点也很符合遇敌判断岔路的特性:不停触发,其中一条道只有遇敌的时间触发
在这里关键点这里:
game.exe+305C3C - 84 C0 - test al,al
game.exe+305C3E - 0F84 C9000000 - je game.exe+305D0D
我们通过代码注入,把 je game.exe+305CC1改成 jmp game.exe+305CC1,或者把上面的test al,al改成xor al,al
然后去勾引下小怪,发现已经不会遇敌了,完美!
至此为止,P5S的不遇敌实战已经结束了,实在中心省略了很多,就比如切入点1的选择,实在有很多,其时追了好几条,有些追一半就追不下去,只能放弃选择下一条。文章中列出的断点只是我以为比较重要的,固然还有很多琐碎的尝试我压根就没写进去了。
这篇文章花费我很长的时间、很大的精力,盼望能给想要学习不遇敌却无从下手的人一点思路。因为我当初就是完全不知道从何入手,绕了很多弯子。
总体来说P5S的不遇敌还是有点难度的,如果是纯新手可能有点晕。
末了说一下,不遇敌,或者其他的游戏修改,乃至逆向,都是需要很大的热情以及耐烦。找到一个切入点,然后一层层的抽丝剥茧下去,终极达到本身的目的,实在是一件很有成就感的事情。
来源:http://www.12558.net
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|