18授人以鱼不如授之以渔●CALL高级篇二:让游戏自带辅助(一)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
授人以鱼不如授之以渔●CALL高级篇二:让游戏自带辅助(一)
目标:给剑侠3增加一个血小于300便喊话的功能,直接打开游戏便有这个功能.
目的:我也不知道,弄着好玩吧.
========================开始分析=================================
首先整理下所需要的资料.
喊话CALL:50f09c 为我自己开辟的空白喊话内容指针地址push 50f09c
push 5
push 0
push 1
mov ecx, 00522FB8
call 004309B0
需要保存的代码指令
mov ecx, dword ptr [ecx+5]
mov dword ptr [eax+1a8],ecx
好了, 我们先来找一下空白地址,先跳到主线程(右键选择模块-jx3clien)
好了先找一个地方写CALL
为了方便起见,我们用CALL的方式来调用它所以我们要在尾部加一个RETN,不知道RETN啥用作请看我前面的教程
好了在找一个空白地方写入处理数据的代码..
首先我们要对比血值是否小于300 300的十六进制=12c
用汇编代码写就是
cmp edx,12c 上篇教程说了EDX是保存当前血值的寄存器
jle ***** 如果小于则跳转
然后我们要恢复原有的数据.
mov ecx, dword ptr [ecx+5]
mov dword ptr [eax+1a8],ecx
然后是处理CALL部分
call ****** ***的地址是我们刚刚写入的CALL地址
然后跳转到数据恢复哪里...
call ******
JMP *****
然后我们需要处理被占用的ECX值和EAX的值因为CALL了一次后EAX ECX会被占用.
push eax
push ecx
push 50f09c
push 5
push 0
push 1
mov ecx, 00522FB8
call 004309B0
pop ecx
pop eax
retn
好了,我们来正式写入吧
写好CALL之后我们来写数据处理部分
在把地址跳转到我们的程序里
好了现在把喊话内容改一下
为啥要写成这样请参考CALL提升篇一好了现在找个怪物试试吧.
然后用OD保存起来
到这里我们就可以不用开挂(当然由于喊话内容的原因我们需要用CE写入喊话内容) ,就会有这个功能了.
=============================解疑=======================
为何要压入EAX和ECX的值?
这里因为CALL之后EAX和ECX的值会发生改变,所以需要保存 .我们来调试下不保存的结果吧
当执行完CALL后ecx的值变成了1 而这条指令则读取了[1+5]的内存,当然这里是无法读取的内存区域所以游戏会出错.