课程分四个大章节
初级篇,中级篇,进阶篇,高级篇
初级篇内容:编写一个完整的,简单的外挂
C++的数据类型:Byte,Word,DWORD,int,float
API函数的调
mouse_event,GetWindowRect,SetCursorPos,FindWindow,SendMessage)
CE5.4工具的使用方法
中级篇内容:调试工具的使用技巧,功能CALL的概念
调试工具OD1.1的使用技巧(如硬件断点,条件断点,内存断点。
常用汇编指令与对应高级语言的转换。
游戏功能CALL概念
找第一个功能CALL
外挂框架的构建(通用)
进阶篇内容:分析游戏内部数据,分析常用功能CALL
游戏数据实践找各种功能CALL(如打怪,选怪,物品使用,技能栏
之类)及相应的代码编写
高级篇内容:编写完整外挂
完成一个相对完整的外挂,实现 自动挂机,打怪,存放物品之类
的功能
1 入门篇.
1.1、一个最简单的外挂
1.1.1、游戏窗口数据分析(SPY++) --------------------10
a、取得窗口相对坐标
b、读出游戏窗口信息GetWindowRect
c、移动鼠标指针SetCursorPos
1.1.2 用VC++写个最简单的外挂(实现游戏开局)--- 12
a、鼠拟鼠标单击mouse_event
b、鼠标指针移动还原
c、集成到startgame函数里
1.2、用CE查找棋盘数据
------------------------14
1.2.1、CE中的数据类型
a、数据类型:Bit,Byte,Word,Dword,float,double
b、用CE查找出坐位号;
c、保存分析数据
1.2.2、编程读出坐位号; --------------------------- 15
a、远程读取进程数据
b、打开远程进程
c、读取远程进程数据
1.2.3、用CE查出棋盘基址;---------------------------16
a、找棋盘数据基址
b、分析棋盘数据结构
1
1.2.4、读出当前棋盘数据 --------------------------17
a、编程读出棋盘数据
b、棋盘数据显示出来
1.3、用模拟技术编制外挂 -------------------------------18
1.3.1 分析棋子与棋盘坐标关系
a、鼠标软件模拟,函数SendMessage
b、分析窗口内棋子相对坐标X,Y
c、软件模拟点击棋盘坐标x,y处的棋子
1.3.2 消掉一对棋子的算法框架 -------------------- 20
a、遍历棋盘同类型棋子配对
b、构建算法框架
1.3.3 (Check2p)大致框架(算法核心)---------------21
a、在这一对棋子间找相通路径的原理
b、(Check2p函数)框架代码
c、(CheckLine函数)检测2点是否有连通.
1.3.4 CheckLine实现 23
a、CheckLine函数实现
b、Check2p核心代码架构
1.3.5 Check2p完整代码实现 ----------------------25
a、完整的Ceheck2p代码解析
b、完善CheckLine函数
1.3.6 Click2p函数实现,单消棋子功能实现 --------33
a、完成Click2p函数
b、单消一对棋子的实现
c、修改ClearPair函数
1.3.7 挂机/秒杀/----------------------------------35
a、自动开局
b、挂机下棋
1.3.8 游戏外挂界面美化---------------------------38
a、添加进度条
b、界面调整
c、Slider控件属性设置
1.3.9 倒计时与棋子数(基址查找)--------------------40
a、查找棋子数
b、查找倒计时
c、开局标志
1.4 编写完整外挂 --------------------------------40
1.4.1 优化自动开局函数StartGame
a、让游戏窗口高高在上
b、优化开局函数
1.4.2 去掉游戏倒计时限制 ---------------------- 42
a、找到计时代码
b、动态修改游戏代码(OD使用初探)
c、去掉计时限制
2
1.4.3 编写完整外挂 --------------------------------44
a、功能测试
b、修改完善外挂
c、读出当前棋子数
d、秒杀实现
1.4.4 初级篇小结 ----------------------------------46
a、游戏分析小结
b、编程小结
2 中级篇 以XX3D游戏为例
2.1、分析前的准备..CALL简介:---------------------------49
2.1.1、CALL的概念(远程调用CALL)
a、写个调用示例(假想游戏客户端)
b、用OD找CALL,初探(用OD找出我们自己写的CALL)
c、代码注入器,远程CALL调用
2.1.2、远程CALL调用代码实现-------------------------51
a、CreateRemoteThread API函数
b、无参数的远程CALL调用(代码实现)
2.1.3、调试工具OD简介(人物角色)血值,魔力值,坐标偏移;53
a、CE找出当前血值偏移
b、OD 分析出魔力值,坐标偏移
c、导出游戏关键代码
2.1.4、游戏基址概念;---------------------------------54
a、基址+偏移 概念
b、读写内存函数 参数简介
c、编程实现读出(血值,魔力值)
2.1.5、常用汇编指令详解-------------------------56
a、Mov指令的几种形式
b、汇编指与高级语言的转换
c、push指令
2.1.6、内联汇编编程实例-------------------------58
a、加法add
b、减法sub
c、纯汇编调用函数CALL(参数的传递)
d、堆栈平衡
2.2、技能栏使用-游戏分析利器OD(OllyDbg)
2.2.1、吃金创药CALL---------------------------59
a、CE工具使用技巧
b、OD断点F2
c、分析CALL的参数
d、代码注入器测试CALL
2.2.2、编写自己的CALL测试代码61
3
a、远程分配内存空间VirtualAllocEx
b、向游戏进程注入自己代码
c、远程调用《吃金创药》
2.3、DLL外挂框架构建
2.3.1、DLL动态链接库构建,与调用 ----------------62
a、建立MFC动态链接库dll
b、EXE程序中调用DLL函数
2.3.2、API与回调函数64
a、键盘勾子回调函数keyProc
b、安装函数SetupFun
c、注入DLL至游戏进程空间
2.3.3、DLL中构建窗口 ------------------------------66
a、DLL中插入窗口资源
b、在游戏内创建DLL窗口
c、DLL内CALL代码书写(以吃红药为例)
2.4、选怪功能实现
2.4.1、找怪物列表基址---------------------------------68
a、选定怪ID
b、怪物数组基址
c、怪物数组大小
2.4.2、分析怪对象属性---------------------------------70
a、怪对象ID
b、怪与玩家距离
c、怪物死亡状态
2.4.3、遍历怪物列表
a、选怪关键代码
b、定位一个怪对象
c、选怪功能实现
-----------------------------71
2.4.4、选怪功能优化----------------------------------73
a、OD分析选怪功能对应代码
b、写测试代码让选定怪物血条正确显示
c、集成选怪函数到SelMon()
2.5、用OD分析游戏功能CALL.《XXXXXX》为例:主要是找CALL
2.5.1、普通攻击CALL关键代码分析75
a、更新游戏选怪基址
b、分析攻击CALL关键代码
c、汇编指令与应高级语言对照翻译
d、编程测试
2.5.2、挂机打怪功能------------------------------------75
1、更新选怪CALL地址
2、优化代码结构
3、自动选怪代码编写
4、自动打怪代码编写
5、代码测试
4
2.5.3、物品背包数组基址+偏移分析(CE+OD)--------------79
a、确定突破口
b、回溯基址
c、用OD验证
d、推导出基址+偏移公式
2.5.4 、使用指定物品 UseGoods(int index=0);-------------80
a、算法原理
b、返回物品在背包中的下标 int GetGoodsIndex(char* name);
c、useGoods(GetGoodsIndex("金创药(小)");
2.5.5、TabCtrl控件的使用(VC++基础好的可跳过)-----------------84
a、m_tab.InsertItem
b、m_tab.GetCurSel()
c、Create(IDD_PAG1,GetDlgItem(IDC_TAB))
2.5.6、TabCtrl控件BUG修证(VC++基础好的可跳过)---------------85
a、修证乱码
b、修证对齐
c、局部美化(位置大小调整)
2.5.7、捡物功能分析实现---------------------------------86
a、捡物功能CALL分析
b、捡物CALL参数分析
c、找出所有动作CALL(打坐/普攻/捡物/交易/组队/走跑切换....)
d、测试及封装到pickgoods()函数
2.5.8: F1-F10技能数组分析-------------------------------88
a、F1-F10技能栏数组(基址+偏移)
b、F1-F10功能调用核心代码分析
2.5.9、F1-F10功能CALL---------------------------------90
a、找出真的功能CALL
b、F1-F10功能CALL参数分析
c、F1-F10功能CALL测试(集成功能至GameProc.h)
3、进阶篇
主要讲功能CALL的参数分析
汇编浮点指令/浮点运行/浮点数整数转换/汇编里的指针
3.1.1、喊话功能CALL地址
-------------------------------93
a、找喊话内容地址
b、分析出关键CALL
c、测试关键CALL
3.1.2、喊话功能VC++实现------------------------------------94
a、分析喊话CALL参数基址+偏移
b、汇编指令lea
c、字串操作REPNZ/REPNE与SCAS
d、V++代码实现
3.2.1、走路相关数据分析(为分析走路/寻路CALL做准备)----------97
5
a、查找当前角色坐标(xhy)
b、查找目的地坐标(xhy)偏移+基址
c、找出相关CALL
3.2.2、走路功能CALL及相关分析-------------------------------98
a、隐藏的push指令
b、测试走路CALL
c、确定功能CALL及参数
3.2.3、对找到的几个疑是CALL进行测试---------------------------100
a、分析出疑是CALL相关参数
b、对找到的CALL进行逐一测试
c、确定真正的走路CALL
3.2.4、人物走跑站状态开关分析---------------------------------102
a、走路CALL 状态开关分析
b、分析状态开关 基址+偏移
c、分析走路目的地址相关基址+偏移
3.2.5、利用分析数据 实现走路/寻路---------------------------104
a、走路功能代码实现
b、测试
c、封装到walk(x,y)
d、瞬移(穿墙)
3.3、 怪物过滤
3.3.1、怪物列表关键代码分析 ------------------------- 105
a、怪物列表(分析原理)
b、回溯怪物列表基址+偏移
c、取得怪物对象的公式
3.3.2、怪物属性分析 -----------------------------------107
a、怪物名
b、怪物血量
c、怪物ID
d、怪物与玩家距离
e、提取特征码
3.3.3、怪物过滤的编写代码
------------------------108
a、读出怪物列表
b、过滤掉指定怪物
c、选定特定怪物
d、过滤打怪测试
e、选中最近怪物
3.4、 物品过滤
3.4.1、物品属性分析 ---------------------------------111
a、物品ID
b、物品对象
c、物品属性分析
3.4.2、物品过滤(编程读出物品列表数据)------------------112
a、读出物品列表
6
b、条件判断是否捡物(距离,物品名)
c、显示出提示信息
3.4.3、捡物过滤 --------------------------------------113
a、分析捡物深层CALL
b、PickID(物品ID);
c、捡物过滤
d、捡物范围控制
3.4.4、游戏多开实现------------------------------------116
a、游戏防止多开的原理
b、找出本游戏多开的方法
c、测试验证
3.5、 组队相关
3.5.1、 选定指定角色------------------------------118
a、多开BUG修证
b、分析玩家属性
c、遍历玩家列表
d、选定指定玩家角色原理
e、int SelPlayEr(pchar 玩家名);
3.5.2、计算玩家间的距离(已知坐标)----------------120
a、坐标系内的点1与点2
b、2点间的距离计算公式
c、准备知识
d、planRange(int p1,int p2)函数构建
3.5.3、 组队功能123
a、更新组队动作CALL
b、选定指定玩家
c、邀请指定玩家加入队伍int Invite(char* playName);
3.5.4、 离队功能 ------------------------------124
a、分析离队动作
b、逆向分析离队代码
c、初识封包
d、Rep stos [edi]
e、内存中的数据与 byte,int的对应关系
f、封装离队函数void exitTeam();
3.6、售物/购物(封包的世界)
3.6.1、售物功能封包分析---------------------------126
1、封包回溯,找未加密的封包
2、确家关键CALL
3、分析封包(物品数量,类型,位置)
4、功能测试SellGoods函数构建
3.6.2 售物封包参数来源分析----------------------128
1、数量分析
2、出售物品类型分析
7
3、出售物品在背包里的格数
4、各种数据的来源
3.6.3、编程实现出售背包指定物品-----------------132
1、遍历背包指定物品
2、出售背包第一格物品
3、出售背包第N格物品
3.6.4、完善售物功能----------------------------134
1、构建函数int FindIndex(char* name);
FindIndex//用来查询指定物品名name在背包中的位置
2、垃圾物品清单
3、遍历出售所有垃圾物品SellGoods
4、移植函数到Gameproc.h
3.6.5、打开NPC购物/售物对话框-------------------137
1、打开NPC对话
2、打开NPC(买进/卖出)窗口
3、封装到int OpenNpc_buysell();测试
3.6.6、购物功能封包分析------------------------140
1、封包回溯,找未加密的封包
2、确家关键CALL
3、分析封包
4、数量分析
5、出售物品类型分析
6、功能测试
3.7、 摆摊.开店
3.7.1 开店封包分析------------------------------142
a、店名分析
b、封包参数分析
c、为TAB选项卡2 添加内容
d、不同CPP之间共享函数及变量的方法
d、写申请开店代码测试
3.7.2 开店封包(挂店物品分析)------------------145
a、分析封包
b、封包出售物品的格式分析
c、写代码测试
4、高级篇
4.0、编写相对完整的外挂 ------------------------149
4.0.1、窗口界面整理
a、常规选项卡
b、保护选项卡
c、捡物选项卡
d、喊话选项卡
4.0.2、常规选项卡-自动打怪函数构建-------------154
a、关联变量
8