Chinaunix首页 | 论坛 | 博客
  • 博客访问: 249748
  • 博文数量: 65
  • 博客积分: 2758
  • 博客等级: 少校
  • 技术积分: 725
  • 用 户 组: 普通用户
  • 注册时间: 2006-02-25 00:23
文章分类

全部博文(65)

文章存档

2011年(4)

2010年(1)

2009年(60)

我的朋友

分类:

2009-11-19 15:35:27

作者:重楼
日期:2009-09-08
此文中所用技术皆为研究所用,请勿用于商业用途.否则一切后果自担.





目标:给剑侠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提升篇一


好了  现在找个怪物试试吧.




 

好了 ,现在只要血值小于300  每次血值的跳动都会喊一句话.



然后用OD保存起来




 


到这里 我们就可以不用开挂 (当然由于喊话内容的原因我们需要用CE写入喊话内容) ,就会有这个功能了.




=============================解疑=======================

为何要压入EAX和ECX的值?

这里因为 CALL之后 EAX和ECX的值会发生改变,所以需要保存 .我们来调试下 不保存的结果吧


 

当执行完CALL后 ecx的值变成了1  而这条指令则读取了 [1+5]的内存 ,当然 这里是无法读取的内存区域所以游戏会出错.
阅读(1383) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~