服务器和客户端的运行机制及外挂编写的基础知识

日志时间:2025-3-10-9-25

外挂编写完全攻略
一、先说一下写一个外挂需要什么条件
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页以上的内容,一般的分析大家可以用通用加密和解密算法来试试,如果不行的话那就是商家自己的加密算法,这就比较难办了,根据经验自己试试吧,比如同时放大缩小数据,看看有没有匹配字符串,异或一个自己的编码库等等,查看有没有明文结果,总之这些都是非常随机的,所以你分析出来了一个,但不一定可以分析出另外一个的,呵呵!祝大家好运!!
[DISABLELBCODE]

游戏外挂分析
石器 / MU和魔力会出现顺移外挂,是因为它的移动消息机制是客户端直接向服务器报告自己新坐标和人物方向,客户端又不是每走一步汇报一次,而是达到一定时间汇报一次,可能是一秒一次吧。正常情况下,每秒最大可走三步,顺移外挂直接向服务器发送新坐标就可以了。以前石器的服务器根本不检查两次坐标的距离差,所以能大顺移。后来大概修改了代码,新坐标如果与旧坐标距离超过3就视作外挂,立即断线。但3步顺移还是禁止不了,跳个沟或者跳到BOSS后面都可以,因为3步汇报一次坐标是这个引擎的最低要求。
服务器又不能去检查两个坐标之间是否有障碍或者有无BOSS(可能设计上根本没顾及到这个要求,又或者是检查它们会导致CPU占用率太高机器受不了)。
反观UO,传奇,顺移外挂一直没出过,因为他们的移动消息机制不同,他们每次移动都是向服务器汇报自己的移动方向,每移动一次汇报一次。而坐标是服务器回传给客户端的,客户端只有决定自己移动方向的权利,没有决定坐标的权利。如果你想向墙或者其他人物方向移动,服务器会发现并可能把你弹回来(传奇好象不弹,UO是肯定弹)。
根据这个结论,三步顺移是石器类型引擎的“死穴”,解决方法为:把围墙做厚把沟做宽,超过三步。象熊男这种BOSS不要放在路中央,他身后要有厚的门,打败他让门消失一段时间也可以实现偷渡,三步顺移就无效了。
再说加速:
1、普通网络加速,这是不可防和封的。一般情况下,网络程序发送消息出去时,如果消息很短,系统会自动把它保留0.1秒,看后面是否跟一个或几个消息,如果有跟的消息,系统把它们合成一个完整包发送出去。这是网络固有延迟,有程序的方法使这种延迟不存在。去掉这种延迟是种合法的行为,系统本身给了用户这个选择权。但通常情况下这是不道德的行为,因为消息包的小而碎,包数量大大增加,加大了交换机和路由器的负荷,对骨干网会造成不利影响,和在街上乱扔垃圾属于同一性质。有些外挂通过设置通信的模式实现这种加速,它对没用外挂的玩家来说很不公平。这类加速对魔力宝贝的效果可能不大,对UO和传奇有明显的效果,PK中你快那么一点别人就打不着你。
2、利用系统BUG加速:
石器的加速属于这种类型。石器客户程序内部固化一个定时器,人物动作快慢由这个定时器决定。石器外挂(台湾版SADE源代码我看过)是用反汇编方法获取定时器代码地址,并对内存中代码进行修改来实现时间片控制的,黑客高手所为(对其反汇编水平深感佩服)。这个外挂一度盛行,直到华义买到石器源代码,才针对它进行了修改。后来服务器可能做了如下设置:为每次移动和战斗开始记录时间片,客户端每移动数步比较时间差,如果超出系统允许的速度就断线。战斗结束比较时间差,如果过快也是外挂所为。也就是说从服务器设计上进行防护而不是*设备,这类外挂不难清理。怕的只是运营方没有源代码,或者有源代码技术又不足,或者开发方技术不足,这都会导致无法及时修正BUG。
再说改封包:
改封包的BUG其实也是系统设计导致的。(我不是说有BUG就是水平不行,这么大的程序百密一疏,BUG总是难免)。但有些BUG完全是设计水平低下造成的,比如石器的遇敌与否,居然是由客户端来决定。这件事交给服务器我想并不是难事,也不增加多少开销。黑客既然能反汇编石器代码,修改通信包更不是难事,所以原地、寸步、不遇敌太容易实现了。反过来如果遇敌交给服务器决定,这个功能外挂就根本实现不了。
再说看血外挂:
服务器在通信中告诉了客户端各怪物多少血,这个功能大概是游戏调试阶段所需要的,用于检查服务器的BUG。正式版本这个开关当然是关掉了,但问题是开关放在客户端而不是服务器,黑客们轻松地找到了这个开关,把它打开,于是大家可以看对面所有怪物的血了。
作为和石器差不多的引擎,魔力宝贝在系统设计上到底对这些因有BUG进行了多大程度的修正,我就不得而知了。如果没修正,某些针对引擎设计上固有BUG的外挂是根本防不住的。
现在魔力没有多少外挂,并不意味着将来没有。外挂的技术水平和游戏风行程度成正比,当前魔力还不是十分热门,如果它获得了大成功(根据网星的收费和服务水平暂时看不到这种希望),恐怕会变成下一个石器。
现在的RO也一样,在外挂打击的现在,必定也会有游状态的外挂出现~
期待。。。

分析客户端的有关资料
自己作外挂,大多时候要分析封包,不过因为有的功能是由客户端来辨别的,所以分析客户端的程序同样也很重要,分析客户端首先要求你能看懂汇编指令(只要"看懂",要求很低的),其次是要能够熟练的运用一些工具,然后能剩下的也就是运气和游戏公司的漏洞了。(哈,不是每次都能成功的啊)下边我分步教给大家。
第一章 8086汇编指令
注:AX,BX,CX...,EAX,EBX,ECX...这些都是CPU用来存储数据的地方。
一、数据传输指令
作用:它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据.
1. 通用数据传送指令.
   MOV 传送字或字节.
   MOVSX 先符号扩展,再传送.
   MOVZX 先零扩展,再传送.
   PUSH 把字压入堆栈.
   POP 把字弹出堆栈.
   PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.
   POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.
   PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈.
   POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.
   BSWAP 交换32位寄存器里字节的顺序
   XCHG 交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数)
   CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX )
   XADD 先交换再累加.( 结果在第一个操作数里 )
   XLAT 字节查表转换.
   BX 指向一张 256 字节的表的起点, AL 为表的索引值 (0-255,即 0-FFH); 返回 AL 为查表结果. ( [BX+AL]->AL )
2. 输入输出端口传送指令.
   IN I/O端口输入. ( 语法: IN 累加器, {端口号│DX} )
   OUT I/O端口输出. ( 语法: OUT {端口号│DX},累加器 )
   输入输出端口由立即方式指定时, 其范围是 0-255; 由寄存器 DX 指定时,其范围是 0-65535.
3. 目的地址传送指令.
   LEA 装入有效地址.
     例: LEA DX,string ;把偏移地址存到DX.
   LDS 传送目标指针,把指针内容装入DS.
     例: LDS SI,string ;把段地址:偏移地址存到DS:SI.
   LES 传送目标指针,把指针内容装入ES.
     例: LES DI,string ;把段地址:偏移地址存到ESI.
   LFS 传送目标指针,把指针内容装入FS.
     例: LFS DI,string ;把段地址:偏移地址存到FSI.
   LGS 传送目标指针,把指针内容装入GS.
     例: LGS DI,string ;把段地址:偏移地址存到GSI.
   LSS 传送目标指针,把指针内容装入SS.
     例: LSS DI,string ;把段地址:偏移地址存到SSI.
4. 标志传送指令.
   LAHF 标志寄存器传送,把标志装入AH.
   SAHF 标志寄存器传送,把AH内容装入标志寄存器.
   PUSHF 标志入栈.
   POPF 标志出栈.
   PUSHD 32位标志入栈.
   POPD 32位标志出栈.
二、算术运算指令
   ADD 加法.
   ADC 带进位加法.
   INC 加 1.
   AAA 加法的ASCII码调整.
   DAA 加法的十进制调整.
   SUB 减法.
   SBB 带借位减法.
   DEC 减 1.
   NEC 求反(以 0 减之).
   CMP 比较.(两操作数作减法,仅修改标志位,不回送结果).
   AAS 减法的ASCII码调整.
   DAS 减法的十进制调整.
   MUL 无符号乘法.
   IMUL 整数乘法.
     以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算),
   AAM 乘法的ASCII码调整.
   DIV 无符号除法.
   IDIV 整数除法.
     以上两条,结果回送:
     商回送AL,余数回送AH, (字节运算);
     或 商回送AX,余数回送DX, (字运算).
   AAD 除法的ASCII码调整.
   CBW 字节转换为字. (把AL中字节的符号扩展到AH中去)
   CWD 字转换为双字. (把AX中的字的符号扩展到DX中去)
   CWDE 字转换为双字. (把AX中的字符号扩展到EAX中去)
   CDQ 双字扩展. (把EAX中的字的符号扩展到EDX中去)
三、逻辑运算指令
   AND 与运算.
   OR 或运算.
   XOR 异或运算.
   NOT 取反.
   TEST 测试.(两操作数作与运算,仅修改标志位,不回送结果).
   SHL 逻辑左移.
   SAL 算术左移.(=SHL)
   SHR 逻辑右移.
   SAR 算术右移.(=SHR)
   ROL 循环左移.
   ROR 循环右移.
   RCL 通过进位的循环左移.
   RCR 通过进位的循环右移.
     以上八种移位指令,其移位次数可达255次.
     移位一次时, 可直接用操作码. 如 SHL AX,1.
     移位>1次时, 则由寄存器CL给出移位次数.
      如 MOV CL,04
         SHL AX,CL
四、串指令
   DS:SI 源串段寄存器 :源串变址.
   ESI 目标串段寄存器:目标串变址.
   CX 重复次数计数器.
   AL/AX 扫描值.
   D标志 0表示重复操作中SI和DI应自动增量; 1表示应自动减量.
Z标志 用来控制扫描或比较操作的结束.
   MOVS 串传送.
   ( MOVSB 传送字符. MOVSW 传送字. MOVSD 传送双字. )
   CMPS 串比较.
   ( CMPSB 比较字符. CMPSW 比较字. )
   SCAS 串扫描.
     把AL或AX的内容与目标串作比较,比较结果反映在标志位.
   LODS 装入串.
     把源串中的元素(字或字节)逐一装入AL或AX中.
   ( LODSB 传送字符. LODSW 传送字. LODSD 传送双字. )
   STOS 保存串.
   是LODS的逆过程.
   REP 当CX/ECX<>0时重复.
   REPE/REPZ 当ZF=1或比较结果相等,且CX/ECX<>0时重复.
   REPNE/REPNZ 当ZF=0或比较结果不相等,且CX/ECX<>0时重复.
   REPC 当CF=1且CX/ECX<>0时重复.
   REPNC 当CF=0且CX/ECX<>0时重复.
五、程序转移指令
1>无条件转移指令 (长转移)
   JMP 无条件转移指令
   CALL 过程调用
   RET/RETF过程返回.
2>条件转移指令 (短转移,-128到+127的距离内)
   ( 当且仅当(SF XOR OF)=1时,OP1<OP2 )
   JA/JNBE 不小于或不等于时转移.
   JAE/JNB 大于或等于转移.
   JB/JNAE 小于转移.
   JBE/JNA 小于或等于转移.
   以上四条,测试无符号整数运算的结果(标志C和Z).
   JG/JNLE 大于转移.
   JGE/JNL 大于或等于转移.
   JL/JNGE 小于转移.
   JLE/JNG 小于或等于转移.
   以上四条,测试带符号整数运算的结果(标志S,O和Z).
   JE/JZ 等于转移.
   JNE/JNZ 不等于时转移.
   JC 有进位时转移.
   JNC 无进位时转移.
   JNO 不溢出时转移.
   JNP/JPO 奇偶性为奇数时转移.
   JNS 符号位为 "0" 时转移.
   JO 溢出转移.
   JP/JPE 奇偶性为偶数时转移.
   JS 符号位为 "1" 时转移.
3>循环控制指令(短转移)
   LOOP CX不为零时循环.
   LOOPE/LOOPZ CX不为零且标志Z=1时循环.
   LOOPNE/LOOPNZ CX不为零且标志Z=0时循环.
   JCXZ CX为零时转移.
   JECXZ ECX为零时转移.
4>中断指令
   INT 中断指令
   INTO 溢出中断
   IRET 中断返回
5>处理器控制指令
   HLT 处理器暂停, 直到出现中断或复位信号才继续.
   WAIT 当芯片引线TEST为高电平时使CPU进入等待状态.
   ESC 转换到外处理器.
   LOCK 封锁总线.
   NOP 空操作.
   STC 置进位标志位.
   CLC 清进位标志位.
   CMC 进位标志取反.
   STD 置方向标志位.
   CLD 清方向标志位.
   STI 置中断允许位.
   CLI 清中断允许位.
六、伪指令
   DW 定义字(2字节).
   PROC 定义过程.
   ENDP 过程结束.
   SEGMENT 定义段.
   ASSUME 建立段寄存器寻址.
   ENDS 段结束.
   END 程序结束.

    当然不是所有的指令都能用的上的,我在这里全部写出来是为了让大家认识一下,方便大家以后的学习,我归纳了一下常用的指令,这些指令大家一定要熟练掌握才可以啊。
MOV 数据传送指令
PUSH,POP 堆栈指令
CMP 比较指令
LEA 取地址指令
XOR 异或指令
JE,JZ,JMP...(所有的转移指令)

FPE修改全教程
很早的时候,当出现了视窗系统以后,图形界面就深得人们的喜爱,从古老的DOS界面的幼稚的波斯王子开始,便逐渐的出现了更高意义上的游戏,更优良的界面吸引了更多的人来进行游戏的娱乐。
于是,GAME的意义便逐渐的深远和丰富多彩起来,便逐渐出现了游戏内容的分化,形成了一些源于早期形式上AVG,SLG,RPG,等趋势,这是早期的比较笼统的分化,期间,很多RPG的游戏就有很多繁琐枯燥乏味的升级及练习的系统,当时便有了一个思想,如何摆脱这些令人反感的东西?修改游戏的源程序吗?不是,便出现了一种类似于附加的程序,可以对人物的资料进行一定的修改,物品等等,便是早期修改的雏形,至后来,经过越来越多的人的发展,思想,逐步逐步的形成了一个比较完善的体系和共同的认识,后便有了风靡人心的FPE.
   
一个人物,有很多数据与之相关或者说与之有联系,那么,如何在众多的数据中寻找到人物所需要的部分呢?很容易想到的就是,当我们在游戏进行的过程中,我们的人物一旦发生数据上的变化,那么数据就会在寄存器中发生变动,当我们在前一次的周期中将全部的数据数值都记录下来,在将这个周期的数据全部记录,然后相比较,就能够寻找到一个发生变化的部分,这个部分可能有很多很多
简单的来说,可能是一个药,吃下去了,那么数值变了,量减少了,血槽的颜色变了,人物的属性恢复了,等等很多很多很多,所以,变动的地址就有很多很多,那么我们的目标数值呢?很简单,当一个数值按照我们的要求来变化,我们买,卖.买.卖.买.卖.那么,钱就是少,多,少,多,少,多,这样一来,符合我们的这个连续的正确的变化的形式的地址就只有几个,正确的或者表观的,或者镜象的,所谓表观,就是钱的那个样子要变化吧~~~```哈哈`````能明白吗?就是说,一个人脸胖,瘦变了,但是总有个脸在那里吧?然后就是所谓的肉的多少的地址,然后````````````?然后`````看看地址是什么类型,进制的选择,然后,删除掉现在的数值,写上一个我们需要的数值,刷新,就产生了一个结果,我们称为:表现:这就是修改的核心的原理
   好了,我们拿到了一个修改器,FPE,金山游侠,东方不败,大刀,傻瓜修改器,王者修改,随便什么都可以.然后执行那个图标,就是.EXE的文件,然后进入目标游戏,然后,选定一个我们所需要的修改的一个数值,比如比如~~~~~~~~~~~~~~~~~~~```
最最基本的,钱.然后呢,我们记住现在你所有的数量,然后切换出去到修改器,按组合键,如果不行,就按快捷键*,常见的,如果还不行,看看是不是冲突,换掉快捷键位,或者组合键,退出键位试试,还不行,自己可以对游戏的目录文件做点相关修改,我不赘叙,然后在那个新建任务那里选上,然后填上你记住的那个数值,就是你记住的,
然后我们切换回游戏,然后随便买个东西,让游戏金钱发生变化,然后我们再次切换出来,在数据那里填上新的数量,就会在上次的寻找的结果里寻找你现在的数量符合的地址,OK,有几个剩下了?如果很多FF也就是256以上,不能显示,那么重复以上过程,如果能够在你的修改器那个:框原谅我用这么不专业的说法~~~~``)出现的话,
那么可以开始了,如果你的水平不行,看不,那么再尽量多找几次吧,控制在2----5个地址内.然后我们开始,如果你什么都不会,就直接选锁定,然后填上一个10机制的数量,就可以了.?什么?你不知道进制是什么???~?~?那我没有办法了.
如果你懂任何一点点,那么跟着我,选择编辑,这是你踏上真正意义上的修改的路途
   我们模拟一次
   02FE32A...
   02FE30b...
   -----等几个我们假设有5个   
   打开一个
   你可能看到这个
   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
   说明什么呢?  不正确
   第二个
   0F 0E A3 B4 F5 EE FF ED D2 A3 D2 E1 A2 B4 F9 F1
   .....................
   你看不出任何规律的
   说明什么呢? 也不大正确
   第三个
   32 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
   如果你有50元钱的话,说明什么呢?50的16进制是多少?50=32
   对的
   第四个
   32 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
   00 00 00 00 00 00 00 ................
   一样的?不是镜象变是表观,也是对的
   第五个```````` 一样?
   呵呵`````不错,我们找到了钱的地址了
   开始修改
   我要多少? 999? 9999?   
   填上E7 03 或者 0F 27  自己去写吧!如果你不是电脑文盲,如果还不会,找个换算器,自己换换就可以了,写上去刷新,回去看看吧.
   编辑就是这样简单.
   
   武器,攻击,药水.........速度.一切有数字的东西,都这样做吧.
   
   好了,基础完了,我们这部分很熟悉了,继续
   我在这里写上一个人的资料
   等级  01
   经验  100
   HP    100
   MP    100
   药水  99
   .........                             
   那么正确的地址是什么呢`?
   01 00 00 00 64 00 00 00 64 00 00 00 64 00 00 00
   63 00 00 00 00 00 00 00 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 / 100
               火箭炮  子弹  04 / 100
               药      小药  3 个
                       中药  5 个
                       大药  8 个
   我们来写这部分
   01 01 00 00 04 01 0A 64 0F 03 00 00 10 05 00 00
   11 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00
   这个难看点,是什么意思?
   01一定是最初级的武器的代码 后面的01一定是表示数量 一把 ,你改02就是两把刀,03就是3把...04是机关枪的代码,为什么不是02?游戏里有没有什么小枪?步枪?如果有就是说明机关枪是厉害一点的枪,前面肯定还有一点小枪 01 是一把,02是两把,OA 数量是10的子弹.64是子弹上限,以此类推....自己对着看看``````
   
   中级别的会了吗~?~?熟练吧```多找游戏试试````别告诉我你看不懂
   
   高级别的找什么??? 我拿精灵开刀
   随便两个武器,弹出FPE,寻找地址,就是如下的部分
   
   00 00 武器代码部分  最小攻击  最低攻击   
   射程  速度  命中  必杀率   00 0 00 0 0
   00 00 00 0 0  -------------------  --
   00 0 00 0 00 0 武器基本要求   000 00 00
   000000000000000000000000000000000000000
   00000000000000000000000000000000000000
   0000000000000000000000000000000000000000
   00000000     特效    攻击加成
                ------------------------ 有几个特效就有个附加
                                         前面你都看懂了,这里你就找的到
                                         往下翻翻页面就是
   你要改什么?
   去掉要求?      要求部分全部改00 00 00 00 00 00
   攻击?           FE 00 FF 00   ==     254 255
   速度?          OA=10  1E=30 32=50
                  我改到50都没有问题
   必杀?        64 == 100%       你要改的变态我也不拦你
   射程?        随你吧,还要我说吗~?  
  &n

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值