| 修改众 |
07-12-14 13:39 |
前言: 看到高手做的外挂非常羡慕吧,于是自己也想学修改吧。 以下是最最简单的汇编修改,其他汇编修改的难度只会比这个更高。
汇编修改的不是具体某个地址,而是程序的走向。 通过操作程序的运行,来达到目的,这是最根本的修改。 修改是汇编技术的应用,也是电脑技术的综合体现。 如果只是想用金山游侠随便改改,那完全不用学汇编。
修改本身是比较乏味的,面对1大堆数字有意思么? 其实修改游戏的乐趣,大概就是向朋友炫耀。
================================== 修改工具 CE 5.3 游戏版本 "美版+日文化破解补丁" 进程 "PsuIlluminusOff1.exe" 目标 :职业技能快速升满
搜索内存中的数值然后修改。谁都会。 不过这里要说的是---汇编修改。也就是修改游戏的运行代码。 需要1点点的汇编基础。不过并不是传说中的那么困难。 仔细看过,会发现很简单。
启动游戏,然后CE加载 PsuIlluminusOff1.exe 首先是通过精确数值搜索,找到技能等级的地址。 (根据以前修改PSO的经验,没学的技能是FF,1级技能是00,2级技能是01 到这里,已经可以直接锁定这个数值到50了,这样就变成了50级技能。 不过请继续看下面
在这个地址上面右键,选择"Find out what write to this address" (找到是什么改写的这个地址 这会弹出1个小窗口。1开始里面什么也没有,是空的。 回到游戏,继续打怪,让技能升1级。 这时候,会发现这个窗口中出现内容了。 是的,这就是改变技能等级的汇编代码。 我们要修改的就是这个。
在这个代码上右键,选择 "Add this code to code list" (添加这个代码到代码列表 这会又弹出来1个 叫做"Advanced options"的窗口,并且这个代码也出现在其中。 现在可以关掉查找代码的那个小窗口了,因为已经用不到了。
在代码表中,右键这个技能升级的代码,选择 "Open the dissambler at this location "(打开这个代码所在位置 这会弹出来 "Memory Viewer“窗口。 注意看汇编代码的第1行 ,正是这个技能升级的代码。 下面就是技能升级的全部代码
0070b94e - cc - int 3 0070b94f - cc - int 3 0070b950 - 83 ec 44 - sub esp,44 0070b953 - a1 60 12 94 00 - mov eax,[00941260] 0070b958 - 89 44 24 40 - mov [esp+40],eax 0070b95c - 83 7c 24 48 ff - cmp dword ptr [esp+48],ff ====>判断技能是不是FF 0070b961 - 56 - push esi 0070b962 - 8b f1 - mov esi,ecx 0070b964 - 0f 84 b5 00 00 00 - je 0070ba1f 0070b96a - 8b 07 - mov eax,[edi] 0070b96c - 53 - push ebx 0070b96d - 8b 5f 2c - mov ebx,[edi+2c] 0070b970 - 55 - push ebp 0070b971 - 8b cf - mov ecx,edi 0070b973 - ff 90 90 00 00 00 - call dword ptr [eax+00000090] 0070b979 - ff 06 - inc [esi] 0070b97b - 8b 4c 24 54 - mov ecx,[esp+54] 0070b97f - 8b e8 - mov ebp,eax 0070b981 - 39 0e - cmp [esi],ecx 0070b983 - 72 62 - jb 0070b9e7 ====>这个跳转将会忽略掉技能升级的代码 0070b985 - 8a 56 07 - mov dl,[esi+07] 0070b988 - 0f b6 46 04 - movzx eax,byte ptr [esi+04] 0070b98c - fe c2 - inc dl ====〉这里是技能升级的代码, 0070b98e - 83 e8 04 - sub eax,04 0070b991 - 88 56 07 - mov [esi+07],dl 0070b994 - 74 38 - je 0070b9ce 0070b996 - 48 - dec eax 0070b997 - 74 1c - je 0070b9b5 0070b999 - 48 - dec eax 0070b99a - 75 3b - jne 0070b9d7 0070b99c - 8b 4c 24 58 - mov ecx,[esp+58] 0070b9a0 - e8 1b 24 00 00 - call 0070ddc0 0070b9a5 - 8d 44 24 0c - lea eax,[esp+0c] 0070b9a9 - e8 d2 d7 ff ff - call 00709180 0070b9ae - c6 44 24 40 01 - mov byte ptr [esp+40],01 0070b9b3 - eb 3b - jmp 0070b9f0 0070b9b5 - 8b 4c 24 58 - mov ecx,[esp+58] 0070b9b9 - e8 b2 23 00 00 - call 0070dd70 0070b9be - 8d 44 24 0c - lea eax,[esp+0c] 0070b9c2 - e8 b9 d7 ff ff - call 00709180 0070b9c7 - c6 44 24 40 01 - mov byte ptr [esp+40],01 0070b9cc - eb 22 - jmp 0070b9f0 0070b9ce - 8b 4c 24 58 - mov ecx,[esp+58] 0070b9d2 - e8 49 23 00 00 - call 0070dd20 0070b9d7 - 8d 44 24 0c - lea eax,[esp+0c] 0070b9db - e8 a0 d7 ff ff - call 00709180 0070b9e0 - c6 44 24 40 01 - mov byte ptr [esp+40],01 0070b9e5 - eb 09 - jmp 0070b9f0 0070b9e7 - 8d 44 24 0c - lea eax,[esp+0c] 0070b9eb - e8 90 d7 ff ff - call 00709180 0070b9f0 - 8b 16 - mov edx,[esi] 0070b9f2 - 8b 46 04 - mov eax,[esi+04] 0070b9f5 - 89 54 24 44 - mov [esp+44],edx 0070b9f9 - 8b 17 - mov edx,[edi] 0070b9fb - 8b cf - mov ecx,edi 0070b9fd - 89 5c 24 3c - mov [esp+3c],ebx 0070ba01 - 89 6c 24 38 - mov [esp+38],ebp 0070ba05 - 89 6c 24 1c - mov [esp+1c],ebp 0070ba09 - 89 44 24 48 - mov [esp+48],eax 0070ba0d - ff 52 1c - call dword ptr [edx+1c] 0070ba10 - 8b 10 - mov edx,[eax] 0070ba12 - 8d 4c 24 0c - lea ecx,[esp+0c] 0070ba16 - 51 - push ecx 0070ba17 - 8b c8 - mov ecx,eax 0070ba19 - 53 - push ebx 0070ba1a - ff 52 3c - call dword ptr [edx+3c] 0070ba1d - 5d - pop ebp 0070ba1e - 5b - pop ebx 0070ba1f - 8b 4c 24 44 - mov ecx,[esp+44] 0070ba23 - 5e - pop esi 0070ba24 - e8 63 47 0d 00 - call 007e018c 0070ba29 - 83 c4 44 - add esp,44 0070ba2c - c2 08 00 - ret 0008
很明显了,dl存放的就是这个技能的现在等级 inc dl 执行 dl =dl +1 这样就达到了技能升1级的作用。
怎么修改呢。先观察这个call的流程, 主要是看 cmp ,test这种判断语句,和后面的 je,jne的跳转语句。 这种语句的作用就是: 判断2个数是不是相等。然后根据结果决定是 继续执行je,jne后面的代码,还是直接跳到je,jne指向的代码。
观察发现,技能升级上面有2个判断跳转 第1个: 0070b95c - 83 7c 24 48 ff - cmp dword ptr [esp+48],ff 0070b961 - 56 - push esi 0070b962 - 8b f1 - mov esi,ecx 0070b964 - 0f 84 b5 00 00 00 - je 0070ba1f 第2个: 0070b981 - 39 0e - cmp [esi],ecx 0070b983 - 72 62 - jb 0070b9e7
分析: 我们知道FF代表技能没有学习,所以可以猜到 第1个判断的作用就是:如果技能没学过,那么就跳过技能升级的部分。 而第二个判断虽然不能确定具体的意思,但是很明显的是:如果让它跳了,那技能就不能升级了。
所以,我们需要修改的就是这第2个判断。怎么修改呢,其实很简单! 把jb 用 nop 代替。(nop代码的意思是什么也不做。 当然,CE中操作更简单些。只需要在这个跳转代码上面右键,选择 "Replace with code that does nothing"( 让这条代码什么也不做 然后我们会看到,代码列表中多出来1个红色的代码。这就是这个被无效化了的跳转。
现在,让我们回到游戏去看看效果吧。 |
|