你可曾思索过,那些于游戏里令你大感头疼的“自动脚本”以及“飞天遁地”,其背后到底是何种技术呢,今天我们不去谈论对错,仅仅从纯粹技术的层面,剖析一下运用易语言这类工具,是怎样一步步搭建起一个游戏外挂的底层逻辑的。
易语言并不简单只是中文编程
不少人对于易语言的印象是停止在名为“把英文关键字翻译成中文”这一情况上,然而事实上它所具备的能力远远超过了这个,易语言自身带有一套极为完备的功能库,该功能库覆盖了从界面的设计一直到网络通信的各个不同方面。
对于开发者而言,这表明无需如同在C++之中那般从无到有地构建框架,而是能够直接借助现成的命令,迅速达成窗口、按钮乃至内存数据的读写操作。这般高效的开发模式,乃是它被一部分人挑选为开发工具的关键缘由。
游戏外挂的工作原理究竟是什么
简略来讲,外挂是一种第三方程序,其试图“介入”游戏客户端与服务器之间的对话,它要么对游戏在本地电脑上的运行数据予以修改,要么模拟玩家的操作以对服务器进行欺骗。
比如平常常见的“透视”功能,是借助分析游戏内存里的人物坐标数据,接着将本应不被看到的敌人位置绘制出来。而“自动打怪”是依据捕获屏幕颜色或者内存数据,判断状态之后模拟鼠标键盘的点击。
吃透游戏机制是开发的第一步
.text:00401000 push ebp
.text:00401001 mov ebp, esp
.text:00401003 sub esp, 40h
.text:00401006 push ebx
.text:00401007 push esi
.text:00401008 push edi
.text:00401009 lea edi, [ebp-40h]
.text:0040100C mov ecx, 10h
.text:00401011 mov eax, 0CCCCCCCCh
.text:00401016 rep stosd
.text:00401018 mov eax, [ebp+8] ; EBP+8 是 level 的地址
.text:0040101B imul eax, eax, 100 ; 计算经验值的算法
.text:0040101E add eax, 1000
.text:00401023 mov [ebp-4], eax ; 将计算结果存入局部变量
.text:00401026 mov eax, [ebp-4]
.text:00401029 pop edi
.text:0040102A pop esi
.text:0040102B pop ebx
.text:0040102C mov esp, ebp
.text:0040102E pop ebp
.text:0040102F ret
若要对游戏进行干预,那么首先必须要比游戏策划更加深谙游戏之道。开发者得深入剖析角色升级所需要的经验公式,仔细探究装备强化的概率逻辑,还要钻研战斗系统里伤害计算的方式。
种种核心玩法常常关联复杂的数据交互,此亦是外挂最常切入之处。比如说,寻得了生命值于内存里存储的地址,便能够达成“锁血”;领会了攻击判定的逻辑,便能够达成“加速攻击”。这要求开发者仿若一名侦探,借由再三试验去逆向推导游戏的内部规则。
.版本 2
.程序集 程序集1
.子程序 _启动子程序, 整数型, 公开
.局部变量 游戏进程句柄, 整数型
.局部变量 消息内容, 文本型
游戏进程句柄 = 查找进程("游戏.exe")
如果 (游戏进程句柄 ≠ 0) 则
消息内容 = "游戏进程已找到"
否则
消息内容 = "游戏进程未找到"
结束如果
信息框(消息内容, "游戏进程检测", , )
.子程序结束
逆向工程决定外挂功能的上限
假设将游戏当成一个上了锁的黑盒子,那么逆向工程便是开启此盒子的技术手段,开发者会运用专门的工具,在游戏运行之际查看其内存数据的变动情况,或者拦截并分析游戏收发的网络数据包。
依靠逆向的方式,能够找寻到关键数据的存放地址,进而解析出服务器跟客户端相互之间的通信协议。举例来讲,只有先找到“金币数量”于内存当中的位置之后,才能够着手编写代码去对其进行修改。可以表明,逆向工程所达到的深度,直接对外挂能够实现的功能究竟有多强大具有决定作用。
.版本 2
.程序集 程序集1
.模块 模块1
.子程序 程序启动, 整数型, , , 启动
输出("欢迎使用易语言开发的程序!")
' 在这里编写其他启动代码
.子程序结束
.模块结束
.程序集结束
用易语言实现第一个功能模块
假设,我们要去达成一个最为基础的功能,那就是检测游戏窗口是不是已经在运行了。在易语言里面,仅仅只需调用“进程_是否存在”这个库函数,通过几行代码就能够完成判断,并且弹出提示。
.版本 2
.子程序 计算和, 整数型, , , x, y
.局部变量 result, 整数型
result = x + y
返回(result)
.子程序结束
这便彰显出易语言模块化设计所具备的优势,我们能够将“窗口检测”写成独立的子程序,能够将“内存读写”写成独立的子程序,能够将“热键控制”写成独立的子程序,如此一来,不但代码结构清晰,而且日后要是游戏更新致使某个功能失效,那么也仅仅只需修复对应的模块,而非重写整个程序。
事件驱动让外挂更智能灵活
传统程序的执行方式是呈线性的,然而游戏外挂对于响应的及时性有着更高要求,也就是要做到“随叫随到”。事件驱动编程恰好能够把这个问题给解决掉,它会使程序处于一种待命的状态,只要设定好的条件被触发了,那么就会马上执行与之对应的动作。
举个例子,我们能够借助易语言去监听按键“F10”被按下这样的事件,以此来开启自动打怪的功能,或者监听游戏人物血量出现变动的事件,瞬间引发自动喝药,此类机制使得外挂的反应比手动操作更为迅速,这同样是达成“全自动”脚本的关键技术。
瞧完这篇技术剖析,你针对游戏安全跟反外挂的较量有了怎样别样的认知呢?欢迎于评论区去分享你的见解,要是你觉着这篇文章给你带来了启发,不妨点个赞予以支持呀!


