现在的位置: 首页 > 综合 > 正文

外挂编写完全攻略

2012年11月10日 ⁄ 综合 ⁄ 共 22327字 ⁄ 字号 评论关闭
外挂编写完全攻略
一、先说一下写一个外挂需要什么条件
1、熟练的C语言知识
目前的外挂大部分都是用BC或者是vc写的,拥有熟练的C语言知识是写外挂的基本条件
2、具有很强的汇编基础 一般游戏都不可能有原代码的,必须*反汇编或者跟踪的办
法来探索其中的机理 ,所以有强的汇编基础也是必不可少的条件
3、熟练掌握跟踪和调试的工具
有了上面2个条件后,掌握一些工具也是很有必要的
跟踪的工具,softice当然是不二之选,至于反汇编的工具,我推荐用IDA PRO
这个工具反汇编出来的代码结构清晰,非常好读
如果你不具有上面的条件,还是先把基础打好,再来写外挂吧,一分耕耘,一分收获,天下没有白掉的馅饼的
二、写外挂面临的基本技术问题
1、修改进程的执行代码 要修改进程的执行代码,要先取得进程的ID,如果是由外挂程序启动,返回值里就有进程ID,
如果不是的话,
需要用findwindow找到窗口句柄,再用GetWindowProcessID取得进程ID,取得进程ID以后,就可以用
writeprocessmemory来修改进程的执行代码了,使程序按照我们的意愿来执行,石器外挂里的不遇敌、寸步遇敌
就是用这样的方法来实现的
2、截获外挂发送和接收的封包
除了通过修改代码来实现的功能以外,很多的功能都是通过修改封包来实现的,要修改封包,首先要能截获它。
第一步是要跟踪出发和收的位置,至于怎么跟踪,我以后会提到,找到位置以后,有2个办法,一是在那个位置加一
个jmp语句,跳到你的处理函数位置,处理完后,再跳回来,这种方法要求比较高,需要处理好很多事情,另一种办法
是往那个位置写条能造成例外的指令,比如int 3,然后用DebugActiveProcess调试游戏进程,这样每当游戏执行到那个
位置的时候,就会停下来,到外挂程序里面去,等外挂程序处理完以后,用ContinueDebugEvent 继续运行程序。
今天先写这么多,下回将讨论外挂的具体功能该怎么实现

今天来谈谈地址的调查问题,地址调查是写外挂中最艰辛,最富有挑战性的事情,
很多朋友问我要外挂的原程序,其实有了外挂原程序,如果你不会调查地址,还是
没用的, 原程序和地址的关系就象武学中招式与内功的关系,没有内功的招式,
只是一个花架子。而内功精深以后,任何普通的招式,都有可能化腐朽为神奇,外
挂中的地址分为两类,一类是程序地址,一类是数据地址。象石器中的双石器,真
彩,不遇敌,寸步遇敌,发送接收封包等,都属于第一类,而人物坐标,状态等,
都属于第二类。对于第一类地址,主要依*softice来调查地址,对第二类地址,
可以用一些游戏工具,比如fpe,game expert,game master等来调查,我一直用game
expert,因为我找不到2000下能用的fpe, 各位以前用fpe改游戏的时候,没想过他
也能用来干这个吧 对于第二类数据的调查方法,大部分人都很熟习了,我就不多
说了,现在主要来谈谈第一类数据的详细调查过程,比如我们要调查发送封包的位
置,如何着手呢,客户端往服务器要发很多封包,但最简单的办法莫过从说话的封
包入手,先说一句很长的话,最好是英文,查起来方便,说完以后,用任意一种办
法进入游戏程序的进程空间(比如先用spy查出游戏程序的窗口句柄,再切换到sof
tice打入bmsg 窗口句柄 wm_lbuttondown,这样在游戏程序中一点鼠标就进入了他
的进程空间)然后用s命令查出这句话所放的内存地址,记下这个地址,在softice
中打入bpm 刚才调查到的地址,这个指令的意思是只要有访问这个内存的动作,立刻
中断,然后再切换到游戏,说一句话,你会发现softice自动中断到某一个位置了,从
这个位置跟踪下去,发送封包的位置也就不远了。 上面所说的都是针对一个全新的游
戏程序而言,如果是一个老的程序,有前辈做了大量的工作,还可以用些别的办法,
如反汇编等,来调查。以后游戏版本的更新也是如此,只要把老版本的地址位置附近的
代码记下来,去新版本的代码里面search一下,就ok了。 恩,休息一会儿,休息一会儿

我主要对外挂的技术进行分析,至于游戏里面的内部结构每个都不一样,这里就不做讲解了,我也没有那么厉害,所有的都知道,呵呵!
1 首先游戏外挂的原理
外挂现在分为好多种,比如模拟键盘的,鼠标的,修改数据包的,还有修改本地内存的,但好像没有修改服务器内存的哦,呵呵!其实修改服务器也是有办法的,只是技术太高一般人没有办法入手而已!(比如请GM去夜总会,送礼,收黑钱等等办法都可以修改服务器数据,哈哈)
修改游戏无非是修改一下本地内存的数据,或者截获api函数等等,这里我把所能想到的方法都作一个介绍,希望大家能做出很好的外挂来使游戏厂商更好的完善自己的技术.
我见到一片文章是讲魔力宝贝的理论分析,写的不错,大概是那个样子.
下来我就讲解一下技术方面的东西,以作引玉之用
2 技术分析部分
1 模拟键盘或鼠标的响应
我们一般使用UINT SendInput(
UINT nInputs, // count of input events
LPINPUT pInputs, // array of input events
int cbSize // size of structure
);api函数
第一个参数是说明第二个参数的矩阵的维数的,第二个参数包含了响应事件,这个自己填充就可以,最后是这个结构的大小,非常简单,这是最简单的方法模拟键盘鼠标了,呵呵
注意:这个函数还有个替代函数:
VOID keybd_event(
BYTE bVk, // 虚拟键码
BYTE bScan, // 扫描码
DWORD dwFlags,
ULONG_PTR dwExtraInfo // 附加键状态
);和
VOID mouse_event(
DWORD dwFlags, // motion and click options
DWORD dx, // horizontal position or change
DWORD dy, // vertical position or change
DWORD dwData, // wheel movement
ULONG_PTR dwExtraInfo // application-defined information
);
这两个函数非常简单了,我想那些按键精灵就是用的这个吧,呵呵,上面的是模拟键盘,下面的是模拟鼠标的.
这个仅仅是模拟部分,要和游戏联系起来我们还需要找到游戏的窗口才行,或者包含快捷键,就象按键精灵的那个激活键一样,我们可以用GetWindow函数来枚举窗口,也可以用Findwindow函数来查找制定的窗口(注意还有一个FindWindowEx),FindwindowEx可以找到窗口的子窗口,比如按钮,等什么东西.当游戏切换场景的时候我们可以用FindWindowEx来确定一些当前窗口的特征,从而判断是否还在这个场景,方法很多了,比如可以GetWindowInfo来确定一些东西,比如当查找不到某个按钮的时候就说明游戏场景已经切换了,等等办法.有的游戏没有控件在里面,这是对图像做坐标变换的话,这种方法就要受到限制了.这就需要我们用别的办法来辅助分析了.
至于快捷键我们要用动态连接库实现了,里面要用到hook技术了,这个也非常简单,大家可能都会了,其实就是一个全局的hook对象然后SetWindowHook就可以了,回调函数都是现成的,而且现在网上的例子多如牛毛,这个实现在外挂中已经很普遍了.如果还有谁不明白,那就去看看msdn查找SetWindowHook就可以了.
这个动态连接库的作用很大,不要低估了哦,它可以切入所有的进程空间,也就是可以加载到所有的游戏里面哦,只要用对,你会发现很有用途的!
这个需要你复习一下win32编程的基础知识了,呵呵,赶快去看书吧!
2截获消息
有些游戏的响应机制比较简单,是基于消息的,或者用什么定时器的东西,这个时候你就可以用拦截消息来实现一些有趣的功能了.
我们拦截消息使用的也是hook技术,里面包括了键盘消息,鼠标消息,系统消息,日志等,别的对我们没有什么大的用处,我们只用拦截消息的回调函数就可以了,这个不会让我写例子吧,其实这个和上面的一样,都是用SetWindowHook来写的,看看就明白了很简单的.
至于拦截了以后做什么就是你的事情了,比如在每个定时器消息里面处理一些我们的数据判断,或者在定时器里面在模拟一次定时器,那么有些数据就会处理两次,呵呵,后果嘛,不一定是好事情哦,呵呵,不过如果数据计算放在客户端的游戏就可以真的改变数据了,呵呵,试试看吧!用途还有很多,自己想也可以想出来的,呵呵!
3拦截socket包
这个技术难度要比原来的高很多哦,要有思想准备.
首先我们要替换winSock.dll或者winsock32.dll,我们写的替换函数要和原来的函数一致才行,就是说它的函数输出什么样的,我们也要输出什么样子的函数,而且参数,参数顺序都要一样才行,然后在我们的函数里面调用真正的winSock32.dll里面的函数就可以了
首先:我们可以替换动态库到系统路径
其次:我们应用程序启动的时候可以加载原有的动态库,用这个函数LoadLibary
然后定位函数入口用GetProcAddress函数获得每个真正socket函数的入口地址
当游戏进行的时候它会调用我们的动态库,然后从我们的动态库中处理完毕后才跳转到真正动态库的函数地址,这样我们就可以在里面处理自己的数据了,应该是一切数据.呵呵!
兴奋吧,拦截了数据包我们还要分析之后才能进行正确的应答,不要以为这样工作就完成了,呵呵!还早呢,等分析完毕以后我们还要仿真应答机制来和服务器通信,一个不小心就会被封号,呵呵,呜~~~~~~~~我就被封了好多啊!
分析数据才是工作量的来源呢,游戏每次升级有可能加密方式会有所改变,因此我们写外挂的人都是亡命之徒啊,被人娱乐了还不知道,呵呵!(声明我可没有赚钱,我是免费的)
好了,给大家一个不错的起点,这里有完整的替换socket源代码,呵呵!
http://www.vchelp.net/vchelp/zsrc/wsock32_sub.zip ;
4截获api
上面的技术如果可以灵活运用的话我们就不用截获api函数了,其实这种技术是一种补充技术.比如我们需要截获socket以外的函数作为我们的用途,我们就要用这个技术了,其实我们也可以用它直接拦截在socket中的函数,这样更直接.
现在拦截api的教程到处都是,我就不列举了,我用的比较习惯的方法是根据输入节进行拦截的,这个方法可以用到任何一种操作系统上,比如98/2000等,有些方法不是跨平台的,我不建议使用.这个技术大家可以参考windows核心编程里面的545页开始的内容来学习,如果是98系统可以用window系统奥秘那个最后一章来学习.
好了方法就是这么多了,看大家怎么运用了,其它的一些针对性的技巧这里我就不说了,要不然会有人杀了我的,呵呵!
记住每个游戏的修改方法都不一样,如果某个游戏数据处理全部在服务器端,那么你还是别写外挂了,呵呵,最多写个自动走路的外挂,哈哈!
数据分析的时候大家一定要注意,不要轻易尝试和服务器的连接,因为那有很危险,切忌!等你掌握了大量的数据分析结果以后,比较有把握了在试试,看看你的运气好不好,很有可能会成功的哦,呵呵!
其实像网金也疯狂的那种模拟客户端的程序也是不错的,很适合office的人用,就看大家产品定位了.
好了不说了,大家努力吧!切忌不要被游戏厂商招安哦,那样有损我们的形象,我们是为了让游戏做的更好而开发的,也不愿意打乱游戏的平衡,哎,好像现在不是这样了!不说了随其自然吧!

    98下是可以的,但到了2000时代,不同进程间不允许互相访问了,:(
偶找了篇文章,有点参考性,如下:
===================================================
利用鼠标钩子获得Win2000密码框密码
获得Windows下的密码框密码,似乎是很多人感兴趣的话题,CSDN上问这类问题的人不计其数……这样看来,老罗也不能免俗啦,今天就让我跟大家探讨一下如何实现这一功能吧。^_^
我们知道,Windows下有一条功能很强劲的函数——SendMessage(),利用它能够实现很多意想不到的功能,例如获得密码框的密码就是其中一例。我们可以这样做:
char szPsw[255];
SendMessage(hWnd, WM_GETTEXT, 255, (LPARAM)(LPCTSTR)szPsw);
通过发送消息 WM_GETTEXT 给目标窗口句柄,我们就能够获得密码框的密码了,可是它还有一点不足,就是无法在 Win2000/WinXP 里面获得密码。这是因为 Win2000 对这个方法作了防范(当然啦,老比因为这个问题已经业界被骂死了),只要你是对其他进程进行这个操作,就会失效。呵呵,这也就是为什么很多同类的软件到了 Win2000 就死翘翘的原因。 :)
那么是否就毫无办法了呢?当然不是!我们已经知道了失败的原因,就是不能在别的进程中使用这一函数……嗯?……聪明的你是不是已经想到了什么?
对了,只要我们能够在同一个进程中使用它,就可以实现了!如何做到“同一个进程”?呵呵,这又是一个问题。《Windows核心编程》的大牛 Jeffrey Richter 告诉我们,实现“同一进程”的办法有很多种,例如有通过注册表来插入DLL、使用远程线程插入DLL、使用特洛伊DLL来插入DLL、通过内存映射文件插入DLL……方法真的是有很多种,它们都能实现“同一个进程”这一目的,不过老罗觉得都不太理想,例如,使用远程线程是通过 CreateRemoteThread() 来插入DLL,但是这个 CreateRemoteThread() 在MSDN中是明确指出了不能在 Win9X 中使用的,也就是说,通用性要大打折扣。所以最后我决定使用鼠标钩子函数来实现!
聪明的读者可能还会问道:为什么用鼠标钩子就能实现了?其实答案很简单,因为密码框是一个 EDIT 控件,它肯定能够接收到鼠标消息,这样,我们的鼠标钩子函数就能够注入到远程的目标进程,这时的 SendMessage() 就是跟目标进程在同一个进程里面,是可以取出密码的。而且它有个非常好的地方:就是通用性强,理论上任何一个版本的 Windows 都能使用!!(我没有 WinXP ,所以只好说“理论上”啦,请有装 XP 的朋友帮忙试试,OK?)
明白了吧?最后还有一个细节问题——密码是在鼠标钩子函数里面获得的,那么如何返回给我们的主程序?老罗的做法是把密码作为全局共享变量,这样就可以在两个进程里面共享,我们的主程序就可以输出结果啦!
说了一大通废话,希望大家不要介意。下面我给出一个完整的例子,通过鼠标钩子函数注入远程进程获得任何一个版本 Windows 的密码框密码。(呵呵,好拗口啊!啊!别扔番茄!!)

---------- 鼠标钩子函数的DLL ----------
文件名: HookDll.asm
--------------------------------------
;******************************************************
.386
.model flat, stdcall
option casemap:none
include /masm32/include/windows.inc
include /masm32/include/user32.inc
includelib /masm32/lib/user32.lib
DllEntry proto :HINSTANCE, WORD, WORD
MouseProc proto WORD, WORD, WORD
GetPsw proto
InstallHook proto WORD
UninstallHook proto
.const
WM_MOUSEHOOK equ WM_USER + 6
;共享段:
.data?
hHook dd ?
hWnd dd ?
szPsw db 255 dup(?) ;关键语句!!!共享这个变量szPsw,以便在主程序中也能得到密码!
.data
hInstance HINSTANCE 0
.code
DllEntry proc hInst:HINSTANCE, reasonWORD, reserved1WORD
.if reason == DLL_PROCESS_ATTACH
push hInst
pop hInstance
.endif
mov eax, TRUE
ret
DllEntry endp
GetPsw proc
;关键!!返回密码!(前提是密码必须放在共享段!)
lea eax, szPsw
ret
GetPsw endp
MouseProc proc uses edx nCodeWORD, wParamWORD, lParamWORD
invoke CallNextHookEx, hHook, nCode, wParam, lParam
mov edx, lParam
assume edx: PTR MOUSEHOOKSTRUCT
;获得当前鼠标位置的窗口句柄:
invoke WindowFromPoint, [edx].pt.x, [edx].pt.y
;发送一个消息给当前窗口,获得它的标题:
invoke SendMessage, eax, WM_GETTEXT, 255, addr szPsw
;发送一个消息给主程序,以便在主程序中能处理鼠标钩子函数:
invoke PostMessage, hWnd, WM_MOUSEHOOK, 0, 0
assume edx: nothing
xor eax, eax
ret
MouseProc endp
InstallHook proc hwndWORD
;启动鼠标钩子函数:
push hwnd
pop hWnd
invoke SetWindowsHookEx, WH_MOUSE, addr MouseProc, hInstance, NULL
mov hHook, eax
ret
InstallHook endp
UninstallHook proc
;卸载鼠标钩子函数:
invoke UnhookWindowsHookEx, hHook
ret
UninstallHook endp
end DllEntry
;******************** over ********************
;by LC

编译这个DLL的时候记住要这样:(否则会失败哦!)
ml /c /coff HookDll.asm
link /section:.bss,S /DLL /subsystem:windows /def:HookDll.def HookDll.obj

---------- 主程序调用 ----------
文件名: GetPsw.asm
-------------------------------
;******************************************************
;程序名称:获取密码框的密码,适用于Win9x/WinMe/Win2000/WinXP
;作者:罗聪
;日期:2002-10-8
;出处:http://www.luocong.com(老罗的缤纷天地)
;注意事项:如欲转载,请保持本程序的完整,并注明:
;转载自“老罗的缤纷天地”(http://www.luocong.com)
;******************************************************
.386
.model flat, stdcall
option casemap:none
include /masm32/include/windows.inc
include /masm32/include/kernel32.inc
include /masm32/include/user32.inc
include HookDll.inc
includelib /masm32/lib/kernel32.lib
includelib /masm32/lib/user32.lib
includelib HookDll.lib
WndProc proto WORD, WORD, WORD, WORD
.const
IDC_EDIT_OUTPUT equ 3000
WM_MOUSEHOOK equ WM_USER + 6
.data
szDlgName db "lc_dialog", 0
szPsw db 255 dup(0)
.code
main:
invoke GetModuleHandle, NULL
invoke DialogBoxParam, eax, offset szDlgName, 0, WndProc, 0
invoke ExitProcess, eax
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
LOCAL rect: RECT
.if uMsg == WM_CLOSE
;卸载鼠标钩子:
invoke UninstallHook
invoke EndDialog, hWnd, 0
.elseif uMsg == WM_INITDIALOG
;获得主程序的rect:
invoke GetWindowRect, hWnd, addr rect
;把主程序设置成“始终在最前面”:
invoke SetWindowPos, hWnd, HWND_TOPMOST, rect.left, rect.top, rect.right, rect.bottom, SWP_SHOWWINDOW
;鼠标钩子函数启动:
invoke InstallHook, hWnd
;处理鼠标钩子函数的消息:
.elseif uMsg == WM_MOUSEHOOK
;获得密码:
invoke GetPsw
;输出:
invoke SetDlgItemText, hWnd, IDC_EDIT_OUTPUT, eax
.else
mov eax, FALSE
ret
.endif
mov eax, TRUE
ret
WndProc endp
end main
;******************** over ********************
;by LC

---------- 主程序的资源文件 ----------
文件名: GetPsw.rc
-------------------------------------
#include "resource.h"
#define IDC_EDIT_OUTPUT 3000
#define IDC_STATIC -1
LC_DIALOG DIALOGEX 0, 0, 195, 30
STYLE DS_SETFONT | WS_MINIMIZEBOX | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Get Password by LC, 2002-10-8"
FONT 9, "宋体", 0, 0, 0x0
BEGIN
LTEXT "看看有什么:", IDC_STATIC, 5, 12, 50, 12
EDITTEXT IDC_EDIT_OUTPUT, 60, 10, 130, 12, ES_AUTOHSCROLL | NOT WS_BORDER, WS_EX_STATICEDGE
END
怎么样?看明白了吗?如果你还不太懂得鼠标钩子函数的编写,请先参考 Iczelion 的教程,到处都有哦!假如还有什么疑问,那是
-------------------------------------------------------------------------------

其中网络封包的拦截源代码可以作为是我的游戏外挂分析那篇文章的例子讲解吧。封包的分析要看经验了,这里不好多讲,如果仔细分析的话可能会讲1000页以上的内容,一般的分析大家可以用通用加密和解密算法来试试,如果不行的话那就是商家自己的加密算法,这就比较难办了,根据经验自己试试吧,比如同时放大缩小数据,看看有没有匹配字符串,异或一个自己的编码库等等,查看有没有明文结果,总之这些都是非常随机的,所以你分析出来了一个,但不一定可以分析出另外一个的,呵呵!祝大家好运!!

阅读全文(304) | 回复(2) | TrackBack(0) | 编辑 | 精华
 

回复:外挂编写完全攻略
网上资源,  软件技术

卷积内核发表评论于2006-1-18 8:37:05

FPE修改教程进阶(地址编辑部分)
   
需要具备的几个初步知识
1.十六进制
   十六进制是进制中的一种,是我们在进行编辑的时候将要碰到的最多的问题,你接触修改,就不可避免的会遇到进制上的换算,简单的说来,十六进制就是满十六就进一位,同十进制的满十进一是一样的道理,我在这里要求大家记住最基本的前十六位的代码换算,和几个最常用的数值具体十六进制的代码,而不是去临时的找个什么进制换算器来进行换算,这点非常重要,有很多时候,一个地址的编辑,在某个标志码数值上不是很大,但是要求你有很高的数据敏感性,这点很重要,我在这里将要求记住的一些代码写出来
  01=01 02=02 03=03 04=04 05=05 06=06 07=07 08=08
  09=09 10=0A 11=0B 12=0C 13=0D 14=0E 15=OF 16=10
  特征数值
  0F=15  FF=255  FF FF =65535     32=50     64=100
  63=99  03 E7=999  27 0F=9999        01 86 9F=99999
2.真/假址的基本识别问题
  我在这里举一个例子
  一个正常的全空地址
  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  
  正常数据全满地址
  FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
  FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
  FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
  FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
  FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
  FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
  假设我们寻求的目标是一个金钱的数量
  假设初始数量是1000的话,我们就开始以1000作为寻找目标
  1000>990>980>970> OK,我们找到了两个地址
   
  024F6A5C7BE..
  024F7BCDD3A..
  地址一我们打开以后看到
  CA 03 00 00 CA 03 00 00 00 00 00 00 00 00 00 00
  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  地址二我们打开以后看到
  DE CA D3 B6 A7 D8 E9 FF D1 A3 A3 A3 DE FA FE D2
  D6 F7 F2 F8 FA 32 21 2F 2D 3E 4E 2D 6A 4E 5F 3A
  F6 5A 8D 8D 6E 7D 6E 7E 8A 9D 21 41 3A 3C D2 F2
如何判断呢,这是一个很明显的一个常见的真假地址并存的情况,我们的目标数值是970 ,换算过来是 CA 03 那么地址中有那个出现了这个十六进制的970呢?很明显是在第一个地址,我们就称为真址,而第二个没有任何的数字的规律的地址,我们称之为假址,但是并不因为其真正意义上的假址,其实,这个地址也是反映了一个关联的变量,只是所包涵的信息不是我们所需要的当前变量值,但这种地址在某种情况下仍然非常有用,起一个验证的作用,我稍后会详细解说。这就是基本的真/假地址的构成,很多时候,真实的地址通常不是这种“清版”(我们的术语,就是非常干净好认识,整版地址代码全表,无关的全部显示空码,只表达一个有关变量数值)而是在一大串没有用的数据中夹在一段特定的段落
  
  以下是一个样本
  
  DE CA D3 B6 00 02 00 00 D1 A3 A3 A3 DE FA FE D2
  D6 F7 F2 F8 FA 32 21 2F 2D 3E 4E 2D 6A 4E 5F 3A
  F6 5A 8D 8D 00 02 00 00 8A 9D 21 41 3A 3C D2 F2
  这是一个比较标准的夹码,在第二个段落的四位,一,三行包涵了一个角色的等级信息,其余部分是关于一个角色的等级相关的外表及外观,在这里就出现了非清版的地址全代码,需要大家仔细看,如果寻找的结果是2到3个这样的非清码的地址码表,不能够认为是误报而很简单的清除重新寻找,需要鉴别一下,这里不同于无规律的假址,望大家铭记。
  
  3,镜象修改
  我们知道,一个角色的资料有很多部分,最简单的比如体力数值,就有几个部分
  一具体的数值
  二表观的印象
  三显示出加成或者减少的效果
  我们在大范围的搜寻一个变动的地址的时候,会将这个真数值址所能产生的变化的及连带影响的部分全部搜寻在内,故同时间的搜寻,我们可以找出几个相关的变量数值址,我们在进行地址编辑的时候,要注意到这点区别,具体的语言描述就是,你可能修改了一个你认为是正确的,合法的地址,但当你切换到游戏部分的时候,却发现没有产生变动,但你在切换回编辑器,却发现数据已经自动恢复了原本没有修改的前样,这点我们称为,镜象修改,或者影子修改,被视同为不成功的修改,此时你要做的就是正确的分析你的地址,然后试着去修改另外的相同的或者数据上有对等点的地址,如果你不放心,就连镜象连同真址一起改动,但值得注意一点,我要提出,有时侯,真址和镜象不是绝对,在某种情况下,我们没有办法寻找真址,只有通过表观来间接修改,类似的有《骑士团》有时改掉镜象就可以把真址影响,很明显的例子PC版本的〈心跳回忆〉你可以追寻到7个地址 ,但是你改掉任何一个都没有用,要么连带修改7个,直接实现变动,要么你改任意一个,通过游戏的日历切换,对地址进行校验,换行为真址,达到修改。这点需要注意。
  正题:
  准备要求做好以后,我开始述说修改正题部分,我将以实例来分析,对读代码编辑做说明,会包涵目前的所有部分,希望大家认真想想,只要你能明白全部机理,就能很轻松明白修改学问的90%,我所写的代码部分只写主要,无关代码我不写,这样一来对初学者好看一点,而且也便于研究,真实的地址形式还是有一定出入,主要在于非清码的部分而不是00 00 00 00 之类的空节,就可能会增加认识上的困难,具体实践需要大家自己去亲自动手修改
  
  一 纯具体数值类型   
     对象举例:金钱
     在谈到一个具体数值的修改,我们很容易的就能想到一个非常常见的数据,金钱,我们在这里就以金钱做为目标,做第一个分析
   
     以益智力类型的游戏 《大富翁三》为例子
      
     初始   金钱10000     存款 10000
      
     寻找以后
     10 27 00 00 10 27 00 00 00 00 00 00 00 00 00 00
     00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
     00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
     00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
     你看到的应该有这么一个部分
     好的,下面开始写上我要的数值
     ** ** ** ** ** ** ** ** 00 00 00 00 00 00 00 00
     00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
     00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
     *部分很简单,也就是你所需要修改的部分,你可以填上你所需要的数值
     E7 03 00 00 E7 03 00 00 00 00 00 00 00 00 00 00
     00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
     或者
     DA 34 00 00 DA 34 00 00 00 00 00 00 00 00 00 00
     00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
     这就是金钱的修改了,这一步非常简单,我们完成了以后,不能停留在这一步,继续,我们来讨论更深层次的一个问题,在这一行真码,我到底能将金钱的数量改到多少?
      
   是FF FF FF 00 FF FF FF FF 00 00 00 00 00 00 00 00
     三邻位字节数
   还是四位
     FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00
   或者说根本就是
     FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    这个是个很简单的问题
    四位的全满
     FF FF FF FF = 4294967295 数值上换算过来就是这么多,我们再回头看看正常没有修改代码构成,很明显四邻位中E7 03 00 00 E7 03 00 00 中间有一个数位一定是间隔码,肯定是用来区别钱和存款的起始部分,具体是3位还是4位?鉴于游戏里有正常的钱数是2位不能足够显示的,我们可以确定是4位,所以我们能过理论上的正常的钱数 FF FF FF =16777215,所以通常我们能见到的正常的游戏的设定的钱的最大也就是10000000
   
    当然也有很多例外
    如果金钱单独是一个地址
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    全部占用了第一个四位的话很常见的就是 999 999 999 为最高上限数值,这里只要对比四数位全代码 FF FF FF FF 就能明白,取一个正常的惯用的9尾数,也就得出了4294967295 经过我们的取位数的话,也就是999 999 999 ,这就是大多数游戏金钱的最高数值的由来,这里道理大家仔细想一下,应该能明白的了。
    所以我们能做的修改,也就只在数位正常的情况下修改那个最大数值,这里就很明显的能够想到问题,当我们修改出一个数值超过间隔码,在理论上只能存在的时候,就会在显示上出了问题,很常见的就是数值溢出了那个数据框,被外面的文字,常见是:钱:字,或者一个黄色的图标盖住了,然后你再继续捡钱,怎么算呢?最后就是死机,循环错误,内存报错。精灵里面的这钟现象大家应该见到的很多。
   明白了这些,具体数值类型的,大家应该都能明白修改的基本道理和注意,也就是同上述没有太大的区别。常见的有钱,人物体力数值,级别,等等,此不繁琐的述说,请大家自行动手试验。
  
  二 非具体数据,非纯物品类的修改;连带修改
   
     这里大家首先要明白一个意思,非具体数据,非纯物品类的数据是指的什么?
   
     简单的说,拿游戏来举例,绝代双骄
     里面有很多种药水,从草药到解毒药,到还魂丹,到仙丹,本身具备物品的基本代码的编号,同时又具备单项上有数量的部分代码,我们假设现在全部的药水种类一共是100种,那么我们在真址,看到的全码,假设你一样都有一个,写出来就是
   
   
     01 01 00 00 02 01 00 00 03 01 00 00 04 01 00 00
     05 01 00 00 06 01 00 00 07 01 00 00 08 01 00 00
     09 01 00 00 0A 01 00 00 0B 01 00 00 0C 01 00 00
     0D 01 00 00 0E 01 00 00 0F 01 00 00 10 01 00 00
     11 01 00 00 12 01 00 00 13 01 00 00 14 01 00 00
     15 01 00 00 16 01 00 00 17 01 00 00 18 01 00 00
     19 01 00 00 1A 01 00 00 1B 01 00 00 1C 01 00 00
     如何解读这段代码?很明显的就是01 是对应的第一种草药的地址 后面的01 表示数量,02表示第2种药的名称的代码,01是第二种药的数量,依此类推,很明显的,我们可以以买卖的药水的数量来得到真址的获取,这就是非纯数据物品类型的意思,我们寻找地址类似于单纯的数据型,在看代码上,我们就要稍微注意下其区别。
      
     假设你并没有获得其中很多种类的药水,那么你看到就是这种形式
     00 00 00 00 02 01 00 00 03 01 00 00 04 01 00 00
     00 00 00 00 06 01 00 00 07 01 00 00 08 01 00 00
     09 01 00 00 0A 01 00 00 00 00 00 00 0C 01 00 00
     0D 01 00 00 00 00 00 00 00 00 00 00 10 01 00 00
     11 01 00 00 12 01 00 00 13 01 00 00 14 01 00 00
     00 00 00 00 16 01 00 00 00 00 00 00 18 01 00 00
     19 01 00 00 00 00 00 00 1B 01 00 00 1C 01 00 00
  
     残缺了一部分,我们看到这个时候,就应当吗上联想自己见过的东西。有草药,大草药,等等,再看看这段代码的形式,残缺的部分很多都很有规律,每四位一节,说明了什么呢,这里就是全部的药代码所在地,我现在需要做的就是把00 00 00 00 的地方按照顺序填上物品代码,就全部拥有了100种物品,恢复部分如下
     01 01 00 00 02 01 00 00 03 01 00 00 04 01 00 00
     05 01 00 00 06 01 00 00 07 01 00 00 08 01 00 00
     09 01 00 00 0A 01 00 00 0B 01 00 00 0C 01 00 00
     0D 01 00 00 0E 01 00 00 0F 01 00 00 10 01 00 00
     11 01 00 00 12 01 00 00 13 01 00 00 14 01 00 00
     15 01 00 00 16 01 00 00 17 01 00 00 18 01 00 00
     19 01 00 00 1A 01 00 00 1B 01 00 00 1C 01 00 00
     。。。。。。。。。。。。。。。。。
     。。。。。。。。。。。。。。。。。。。
     然后我们明白了四位结构就是名称代码,数量代码,间隔码,那么全部改上我们想要的数量数值以后,就变成如下
      
     01 OF 27 00 02 0F 27 00 03 0F 27 00 04 0F 27 00
     05 0F 27 00 06 0F 27 00 07 0F 27 00 08 0F 27 00
     09 0F 27 00 0A 0F 27 00 0B 0F 27 00 0C 0F 27 00
     0D 0F 27 00 0E 0F 27 00 0F 0F 27 00 10 0F 27 00
     11 0F 27 00 12 0F 27 00 13 0F 27 00 14 0F 27 00
     15 0F 27 00 16 0F 27 00 17 0F 27 00 18 0F 27 00
     19 0F 27 00 1A 0F 27 00 1B 0F 27 00 1C 0F 27 00
     。。。。。。。。。。。。。
     。。。。。。。。。。。 。。
     这样一来,我们就实现了全部的药的全部拥有及数量上的9999,看明白了吗,这里修改的数量的时候,要参照第一例,纯数据类型的修改的部分,而且事实上我们最初的获得地址的时候,可能残缺程度会更严重,这里就需要你有高敏感的数据感受能力和地址感受能力,并且,我们在这里就是通过一个草药的数量,实现了全程物品的代码获知和修改,这就是连带修改的最简单的一个实例,这里希望大家反复看,力求看懂。
如果你明白了这一点,接下来我们在看一个例子,比较难一点,我给大家演示的是CAPCOM的冒险类型的游戏,BIO HAZARD 2
   
     我们要通过一个开始的子弹的20发数量,实现全程道具,武器的修改。
      
     代码部分如下
   
     由于武器方面,很明显的初级给你的武器就是一把刀,所以很自然的联想到代码是01
这在真实地址中也确实如此,所以。开始就需要大家有一个比较清楚的修改的思想和猜测,然后我们在开枪模式下 20/19/18/17/10 OK
     代码出来,去掉假址
     进入真址
     你就会看到如下形式
   
     00 00 00 00 02 0A 01 00 16 01 00 00 3C 63 01 00
     00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
     00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
     00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
     00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
     这是代码部分,身上装备为手枪 一把 子弹 10发  草药一个  99发子弹合一个
   
     对照上述代码,我们就知道。02 是手枪 OA 是剩余数量 16  后面的01 一顶是表示枪存在身上,是一把,也就是物品存在码 00 间隔 16就一定是草药 01 是一个。由于草药是吃的,所以其后不会有存在码,当然你也可以试着写上,并不影响,系统会自动帮你消失掉,3C就是一定是物品属性中,表示子弹合的代码了 63 ==99没有错,正确 ,01 存在码,就这样很清楚的就分析了出来,现在我们要改掉物品道具,很简单,程序一般相近的物品在一起,那么03可能是大枪 04 可能是冲锋枪,17可能是中药 18 可能是大药 3D就是下一个道具,就这样依此类推就可以做到全程物品的代码修改,按照其标准存在格式,自己往上面写就是了,但要注意,你的身上能装几个,就改几个,类似于金钱的溢出问题,还有要注意一点,限于一个游戏的开发人员的习惯,有很多东西在初期设计上,存在,但是在正式发行以后,可能就不要了,但是程序员为了赶时间,没有彻底删除掉,做了个屏蔽,本身也有编号,夹在正常物品中间,所以你在修改的时候,装备,道具可能就不是连续出现,而是出现一个垃圾码的装备,你可以试试,生化危机3的物品在2代里面就已经见到了,此点注意一下就可以了。修改的时候不要以为是自己的错误,也有可能是游戏里没有开放的东西,理解了这点,再去理解精灵的修改过程的问题就很容易了。
      
   三 人物属性的修改
     终于到了这部分了,如果大家对于上面所讲的理解很透彻,那么这里,你只要看看,就彻底明白了,包括精灵,请自己联想。
     连带修改可以是药水,可以是相同的装备,也一定可以是人物的属性,很简单《魔奇梦幻团传奇》人物作比方
      
      等级 01
      HP 100
      MP 100
      回合数 3
      带兵 20
      武器 小刀
      国家属性 特里斯雅
      队伍属性 敌军
      攻击  3
      经验 20
      金钱 50
      
      这就非常简单了
      
      01 01 00 00 64 00 00 00 64 00 00 00 03 00 00 00
      14 00 00 00 01 00 00 00 0A 00 00 00 02 00 00 00
      03 00 00 00 14 00 00 00 32 00 00 00 00 00 00 00
      已变化的经验数值找到这里,然后修改
   
      01 01 ? 一定是人物 名称 代码 等级  02 01 就是女主角 一级
      64 00 00 00  64 00 00 00 两个100的数值
      03 回合数量 14 带兵量 01 就是小刀那
      0A 国家的名称,你换个0B看看就变成了临近的国家的名称
      02 敌军 ,很简单的联想   01 是不是友军呢?
      03     14        32       就是剩下的三项了
      呵呵,全部都改掉吧!
     很简单吗~?  就这样?我还要说点什么呢?自己去试修改精灵吧!
      
     我写上常见的几大数据类型,大家参考之。
      
     一 夹码类型
        DE CA D3 B6 00 02 00 00 D1 A3 A3 A3 DE FA FE D2
        D6 F7 F2 F8 FA 32 21 2F 2D 3E 4E 2D 6A 4E 5F 3A
        F6 5A 8D 8D 00 02 00 00 8A 9D 21 41 3A 3C D2 F2
      
     二 清版类型
        10 27 00 00 10 27 00 00 00 00 00 00 00 00 00 00
        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
      
     三 无间隔码类型(与假址很类似,但含有真址数据)
        ** ** ** ** A7 D8 E9 FF D1 A3 A3 A3 DE FA FE D2
        D6 F7 F2 F8 FA 32 21 2F 2D 3E 4E 2D 6A 4E 5F 3A
        F6 5A 8D 8D 6E 7D 6E 7E 8A 9D 21 41 3A 3C D2 F2
        
        ** ** ** ** 部分是常见的数据所在地址
     四 纵向码类型
        31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
        64 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
        45 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
        67 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
        3E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
        5D 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
     五 换行码类型
        01 01 00 00 01 01 00 00 01 01 00 00 01 01 00 00
        00 01 01 00 00 01 01 00 00 01 01 00 00 01 01 00
        00 00 01 01 00 00 01 01 00 00 01 01 00 00 01 01
        01 00 00 01 01 00 00 01 01 00 00 01 01 00 00 01
        00 01 00 00 01 01 00 00 01 01 00 00 01 01 00 00
        00 00 01 00 00 01 01 00 00 01 01 00 00 01 01 00
        (这个见于恋爱游戏,人偶情缘里的地址之一)
     六 镜象地址
        也就是全部需要你一起手动修改
         
        大概就这么些了
        
       希望大家耐着性子看完,并好好的想想这部分的意思。
    四  最后篇  模糊查找
      如果我们对一个游戏里的数据并不大清楚,换句话说,就是不是一个具体数值,而是一个感性的认识,游戏是有地址的,但是我们常规的找不到,比如,血条又降了一点,好感度又上升了一点,等等,我们就在修改器里写下?然后变化的时候。模糊的上升+ 模糊的减少-这样反复的搜寻,最后依旧可以找到在游戏中以数据形式的方式存放的地址,找到了以后,依旧可以修改,大同小异,这里,大家可以试验一下,修改一下电脑上的KOF97的1P 和 2P 的体力数值,试试看!
  
  
   实际的修改还有很多很多的东西要学习,并不是这里一句两句就说的清楚,希望大家在不断的修改试验中,理解我说的,不断创新,成为修改的高手,专家,神。
用FPE-学会用浮点修改法-学会用二进制分析修改游戏-巧用FPE的刷新-特殊存档
巧用FPE  
用FPE改游戏,一定要做到既狠又准。
比如用FPE改游戏,你知道有两个数值肯定在一起,象42,215,那么可用FPE进行一次搜索,输入“42,215”(若是16进制请在数后面加个H),这样一次找到的机率很大。
一些游戏在运行时将一些主要数值换了个方法存,用FPE直接找不到,怎么办呢。那么要转转弯,比如大家喜爱的足球经理,用任何方法都找不到金钱的地址,就这样放弃了?NO,动动脑筋,进入建设菜单,看见造看台所需的费用了吗,这里就是突破口,FPE不费力就发现了目标,下面么,将其改为负数,譬如原数为E4 07 00 00,就将最高位加个F,为E4 07 00 F0,就发现负数一大笔,按确定就发财了!
“帝国时代”大家都玩过,当你造了奇迹后,有2000年的倒记时,你的第一印象是搜索2000?那么,错!没看见它是成50递减的吗,所以,应该搜索2000/50=40,然后减1减1地搜索(要不就是2000/10=200,减5进行搜索,这东东改了没实用价值,只不过举个例子罢了)。而有些则是要加上位数,如显示200,却要搜索2000,变化多样,大家自己慢慢的体会吧!
FPE的修改内存功能很有用,多用用它,看看找出的地址周围的数,说不定有惊喜呢。反正我从不用什么内存锁定,一般都用内存编辑。然后看上下数,对于普通游戏,应该不试就看出这个存的是什么数值,而那里应该是存放魔法的地址,或这个地址肯定不是我 所要的……如果你还未达到看看就知的地步,那么快练练吧,以后可省许多时间呢。
一时想不出了,下次有再说吧。

  学会用浮点修改法

这个游戏是使用浮点数来存放的,在这里我说明一下如何以 FPE 2000修改他们。FPE 2000 可以直接分析浮点数,只要 直接输入就好了,例如 "100.0"。
或许你会问: TA 或 AoE 的资源量在画面上显示只有整数部分呢? 是的,他们隐藏了小数部分的数值,如果画面上显示的是 "1000",因为它隐藏了小数的部 分,若你直接在 FPE 2000 以 "1000" 或 "1000.0" 去分析他,可能是找不到的。那我们要怎麽办呢? 其实程式设计师还是比较喜欢整数的,例如我们刚刚进入游戏时,TA 或 AoE 的资源都有个初始值,例如 "400"。这时候这个值很可能 就是 400.0,一个农夫能够采的资源最大量是 10,也很可能是 10.0。如果你派个农夫去采资源,一直到他采完 10 搬回基地前不要做任何其他的事,一搬 回基地马上停止农夫的动作。这时你整的资源量变成 410,很可能就是 410.0。依照这个原则,一开始我们分析 "400.0",派农夫采满 10,搬回基地前不要做 任何其他的事,一搬回基地马上停止农夫的动作,分析 "410.0"。依此类推,就大概可以找到目标了。我们这个原则是猜想程式设计师会对每一个初始值及最大 值以 ***.0 的方式定义(一般人的习性嘛)。但是如果你在农夫搬回基地前做其他消耗资源的事或是在农夫没有采满 10 就搬回基地,那可能就会有小数点後的 数出现了,那就不能很准确的分析了。以前有网友说 100.0 到 100.9 的翻成四个十六进位 bytes 时,前两个 bytes 会一样。其实这不正确,根据测试,有些浮点数(如120.4和120.5)只有第一个 byte 会一样而已. 而且这个 byte 很难变动,必须整个浮点数有很大的变动才会变。所以比较好的分析方法如同刚刚说的才会比较正确。FPE 2000 也 可以把浮点数转换为十六进位数,在 "Others" 左下方那两个中间有个 "Hex"按钮的栏位,你只要在上面栏位输入浮点数,下面会出现十六进位值,你可以自行试试。
也许有的朋友看到标题时摸不到头脑,那么望下看吧。(仅适合FPE5.x)
我改金色步行鸟时,好不容易用名字找出步行鸟地址的大概位置时,却看见满屏陌生的数据而无从下手。茫茫的数据中,哪个是要害字节呢?要找步行鸟的什么速度、耐力之类的,游戏中又没有具体数据,高阶分析无从下手。用低阶分析?那可是本人最忌讳的。
山穷水尽想放弃时,眼睛一亮,OK,且听我慢慢道来。找到步行鸟名字的地址后,按E键进入内存编辑,不按任何键,切回游戏中。给步行鸟喂食,使它某一项能力增长,切到FPE,怎么还是上次的数据,那么按ESC键,恩,有几个数据在动啊(改变了),没看清?那么再照上面的方法来一边吧!发现改动的数据了吗,分析其上下的值,怎么样,有几行是很有规律的,对啦,那就是步行鸟的数据了。
没听懂?自己实践一下吧,这个方法可是很有用的喔!
学会用二进制分析修改游戏

不少游戏中都有什么诸如人物的特殊能力,比如DIABLO。那么它的魔法是如何存放的呢,每个魔法用一个字节,00代表无,01代表有?那也太浪费了吧,一般来说程序员都爱用二进制来存放各项能力,大家知道,一个字节有8位(如FFh化为二进制是11111111),游戏中的能力就是占了一位(bit),0代表无,1代表有。如果某一游戏的能力排放为00000011,那么在内存(硬盘)中存放就是03h,显然用二进制能有效地减少存储空间。
由上面看来,直接搜索能力的地址是不明智的,一般我们修改都找出这个人物(或其他什么东东)的数据所在地,然后找到能力的具体地址,将其改为FFh,一般就可拥有全部的能力。
下面我以早期的战略游戏经典“信长之野望——天翔记”为例来分析(当年还没有FPE4和5,用其他的内存修改工具会死机,只得用PCTOOLS)。记得当年我修改的时候,差点想破脑袋。天翔记中个各人物都有“智力/智才、政治/政才、战斗/战才”三项能力,你直接找智力或找智才,都是找不到的。而我拐了个弯,寻找他的勋功,然后上下分析,才得出结果。原来他的智力是按智才的百分比存放,而智才是将游戏中的数据除以2存放,怪不得找不到哩(光荣这个混蛋)!水到渠成,修改其它诸如兵力,训练……就是简单的事了。
找到了人物的特技和带兵能力后,按习惯都改为FF,特技到是PASS了,但带兵能力却不对,怎么都变一个个的O O O O了(应是S、A、B、C、D),思考良久,由于能力有6级,故一位是放不下的。两位?两位只有00、01、10、11四级啊,放不下6个级别,那么只有3位了,可从来没有一个游戏用了3位存放的,要么4位,要么2位,再说共有“陆、骑、枪、水”四个,4x3共12位,不足2个字节16位,而且3位能放8级的能力,难道见鬼了?又思考晾久并试出确是只有两个字节,干脆,赌一把。000代表E级,001代表D级,010代表C级,011代表B级,100代表A级,101代表S级,一个字节存2个能力,OK,把2个字节改为2Dh,2Dh(00101101),进入游戏,不对,怎么“X”都出来了。反回来再改,改为6D FB(01101101 11111011),哦(欢呼),对啦,全是S级喽,还有铁骑呢!
怎么样,够艰难吧,别看现在说说简单,在不知道的情况下要想出来是很难的。而这,也是修改游戏乐趣的所在之一。希望看了上面的分析,能给你有所收获(尽管以后可能用不到)。
巧用FPE的刷新

也许有的朋友看到标题时摸不到头脑,那么望下看吧。(仅适合FPE5.x)
我改金色步行鸟时,好不容易用名字找出步行鸟地址的大概位置时,却看见满屏陌生的数据而无从下手。茫茫的数据中,哪个是要害字节呢?要找步行鸟的什么速度、耐力之类的,游戏中又没有具体数据,高阶分析无从下手。用低阶分析?那可是本人最忌讳的。
山穷水尽想放弃时,眼睛一亮,OK,且听我慢慢道来。找到步行鸟名字的地址后,按E键进入内存编辑,不按任何键,切回游戏中。给步行鸟喂食,使它某一项能力增长,切到FPE,怎么还是上次的数据,那么按ESC键,恩,有几个数据在动啊(改变了),没看清?那么再照上面的方法来一边吧!发现改动的数据了吗,分析其上下的值,怎么样,有几行是很有规律的,对啦,那就是步行鸟的数据了。
没听懂?自己实践一下吧,这个方法可是很有用的喔!
 
特殊存档

   FPE2000一个很好的功能是能把你已经修改好的东西存下来,下次你再打开游戏时可重新调入,这个存盘文件的后缀名就是FPE。方法很简单,只要按CTRL-2到表格处,按LOAD(读档),选择想要的FPE文件名即可。FPE2000会自动把那些地址锁定。不过要注意,存盘的文件名不能为中文名。另外,欢迎大家把自己修改了的游戏做成FPE存档,拿出来和大家分享。

抱歉!评论已关闭.