圆圆网络 手游攻略 手游评测 如何创建游戏插件

如何创建游戏插件

时间:2024-09-08 08:30:04 来源:互联网 浏览:0

记得上小学的时候,我玩网页游戏时把家里的电脑损坏了(这是怎么回事,网页游戏也会损坏电脑?),然后我爸爸就把它拿走了,重新安装了系统。他回来后,电脑上多了两款新的单机游戏。植物大战僵尸和大鱼吃小鱼。

那时候周围的小学生都在看赛尔号/奥比岛/摇滚王国/天上掉馅饼/屠龙之刃/梦幻西游。扮演《摩尔庄园》的小学生并未接受九年义务教育。虽然《植物大战僵尸》现在看起来比较老了,但它的游戏元素催生了很多游戏音乐文化,比如Billie Eilish 的《bad guy》。节奏简直就像植物大战僵尸的轻、轻、轻、轻、轻~。

当时因为生存模式被虐,就在网上找到了一个可以修改阳光点数的修改器。虽然当时我不是计算机专业,但对于修改器的运行机制还是有一些猜测的。那时候小学还不知道内存,所以修改的是文件里的数据。

这个猜测现在看起来很可笑,但却很有道理(我正要开始狡辩)。有些游戏数据可能会先放在文件中,游戏启动后,将文件中的数据读入游戏的内存区域。所以我们需要先修改数据所在文件的内容,然后再启动游戏。但是,很多游戏的数据文件都是加密的(一个大问题,骑马与砍杀没有加密),我们无法从文件中修改它,所以我们需要让游戏进程先将其读入内存,然后修改从内存里出来,然后游戏进程退出游戏的时候自动保存下来,然后就是这个数据了。

所以综上,我们可以找到这几类修改对象:

游戏数据是本地未加密的文件。直接修改即可修改游戏数据。这一类别的代表是《骑马与砍杀》。它的字符数据在文档中。玩家属性可以任意修改,但不要修改太多,否则数据会溢出。另外,它的游戏数据,比如NPC对话、NPC名字、国名、城堡名都是以纯文本给出的(还是保存在Excel中?)。最可怕的是它的内部机制,比如兵力限制/士气/攻城时间/酒馆费用等等都写得很清楚。难怪骑兵和伐木有各种版本。数据封装,通过修改内存来修改游戏数据。在网络游戏中,数据都在对方的服务器上,无法直接修改。可以通过模拟网络请求形式来模拟获取游戏物品(取决于对方服务器逻辑的严格程度)。这里举几个例子(所有腾讯游戏忽略,这个不在新手教程里),你在玩一款网页游戏《龙之刃》,杀了一个小怪,获得了15个银币。这时候你的网页需要给你发送银币数据+15的信息到服务器。您开发人员可以使用浏览器附带的工具来调试并查看此数据的格式,然后模仿类似的发送服务器。当然,不太成熟的游戏厂商无法完善这方面的逻辑。 (另外,我有一个想法,当我们玩游戏的时候,Steam应该有一个线程来监控我们在玩什么游戏,这样我们就可以监控这个线程发出的网络表单,然后我们自己继续发出来,是不是?这是一套完整的卡牌吗?)让我们从实战部分开始吧。因为不想再次下载QB,而且QB官网上有很多修改文件的教程,所以就跳过了。

1. 内存数据故障排除

游戏作为一个进程在我们的计算机上运行,因此要修改其数据,我们可以在内存中搜索和修改它。

以植物大战僵尸为例,我们要修改的是阳光的量。如果我们当前的阳光值为75,我们需要找到内存中的数字75。

首先使用记忆工具打开植物大战僵尸的进程。

然后查找数字25。下图中只找到了一个,因此阳光数据存储在地址21BF10C8处。然而,许多游戏可能会搜索比这个地址更多的地址。我们需要在查询到的prop(sunshine)上少花一点钱,把Scan改成另一个值,才能准确定位。

修改该地址的值。

查看游戏中的阳光量。

是不是太简单了?这是因为游戏本身的设计已经脱离了这个时代。如今的游戏厂商不仅要考虑内容,还需要在安全性上与高端玩家竞争。

如何创建游戏插件

接下来我会尝试另外一款游戏来练手,那就是最近很火的宫崎英高老作《只狼》。

只狼: 影逝二度

作为一个九十目下忍,这个游戏真的教会了我如何写“死”字。

先看一下我现在的金币,2323。

然后照常选择只狼的进程,搜索2323这个数据,可以发现有很多。

我去杀了一个小怪,金币增加到2360。

再次搜索,发现还有5个地址。如果直接修改它们,你会发现它们不会改变。一种猜测是,它采用了类似于病毒中多个进程互相守护的方式,会保持数据一致,所以我们可以直接全部修改,选择一个同事修改,你会发现第三个还没有被修改修改成功,因为这个值不是背包里的金币数量,而是战斗界面的数量。你可以自己尝试一下。

两万金币添加成功。本地其他数据也是如此。你可以自己尝试一下,但这种方法总是效率低下。我们可以使用代码来自动化修改过程。

这里还要说一下,编码方式就是将数据的地址编码成代码。如果游戏的更新导致地址发生变化,代码也必须同时修改。因此,在需要频繁更新的游戏中,很多修改器都会变得无效。

2. 编写插件程序

我们先来了解几个Windows API。

HWND FindWindow(LPCTSTR IpClassName, LPCTSTR IpWindowName);按类名或窗口名搜索并返回窗口句柄DWORD GetWindowThreadProcessId(HWND hWnd,LPDWORD lpdwProcessId);获取窗口句柄后,使用GetWindowThreadProcessId函数获取窗口的进程ID和线程ID HANDLE OpenProcess( DWORD dwDesiredAccess,BOOL bInheritHandle,DWORD dwProcessId) 打开一个现有的进程对象并返回进程的句柄bool WriteProcessMemory(HANDLE hProcess ,LPVOID lpBaseAddress,LPVOID lpBuffer,DWORD nSize,LPDWORD lpNumberOfBytesWritten);可以写入进程的内存区域。输入区域必须可访问,否则操作将失败附件是代码:

#include windows.h#include stdio.hint main() { HWND h=:FindWindow(NULL, '植物大战僵尸中文版'); //查找并打开进程DWORD processid; GetWindowThreadProcessId(h, 进程ID);处理hprocess=0 ; hprocess=OpenProcess(PROCESS_ALL_ACCESS, FALSE, processid); if (hprocess==0) { //对应处理printf('打开进程失败!\n');返回1; } else { printf('进程打开成功!\n'); n');双字马力=3000; //需要修改的游戏数据最大值LPCVOID addr=(LPVOID)0x21BF10C8; //通过CE找到的游戏数据地址DWORD res=WriteProcessMemory(hprocess, (LPVOID)addr, hp, 4 , 0); //写入内存修改游戏数据return 0; }}

这样的代码可以让我们随时调用它来将阳光改为2000。这个程序没有图形界面,因为它太简单了,所以我们把它当作一个入门demo。

如何创建游戏插件

我们通过地址修改了直接游戏的数据,那么我们是否可以将其作为游戏助手,读出一些游戏数据来辅助玩家呢? CE工具虽然可以搜索读取,但是效率太差了。接下来,引入了一个新的API来读取固定地址的数据。

HWND ReadProcessMemory(HANDLE hProcess, LPCVOID lpBaseAddress, LPVOID lpBuffer, DWORD nSize, LPDWORD lpNumberOfBytesRead);根据进程句柄读取进程某内存空间lpBaseAddress的nSize个字节,写入缓冲区lpBuffer中。计算基地址并多次求和。偏移并尝试读取:

附上代码实现:

#include stdio.h#include windows.hint main() { HWND h=:FindWindow(NULL, '植物大战僵尸中文版'); //查找并打开进程DWORD processid; GetWindowThreadProcessId(h, 进程ID);处理进程h=0 ; processh=OpenProcess(PROCESS_ALL_ACCESS,FALSE,processid); if (processh==0) { //对应处理printf('打开进程失败!\n');返回1; } else { printf('进程打开成功!\n'); n');国际太阳; //用于存储阳光数据LPCVOID mbase=(LPCVOID)0x1E0CF020; LPVOID mbuffer=(LPVOID)sun;ReadProcessMemory(processh, mbase, mbuffer, 4, 0); printf('你有阳光: %d\n', sun); return 0;} 3.挂机自动插件

以上是一些修改数据的插件。另外,还有自动操作的修改器,比如自动玩连连看(雾)、自动下棋(雾)、自动拼图(笑)。

比如下面的连连看,当你用CE观察内存时,你会发现它的数据奇妙之处在于它是一个二维数组。内存中不同的卡有不同的值。这里参考网上lgx小伙给出的解决方案。

如果想要自动消除连连看,首先要模拟鼠标操作。我们来介绍一个可以模拟鼠标操作但不会移动我们的物理鼠标(虚拟点击?)的API。

LRESULT SendMessage (HWND hWnd, UINT Msg, WPARAM wParam, LPARAM IParam);其中Msg为WM_LBUTTONDOWN、WM_LBUTTONUP,代表软件模拟鼠标操作(虽然兼容性和安全性不如硬件模拟mouse_event,但不会改变移动的鼠标指针)另外,BFS算法可以用于在二维数组中查找两张可以消除的牌。

voidclearapair() { //找到两个可以消去的点,点击POINT p1, p2; int x1, y1, x2, y2; for (y1=0; y111; y1++) for (x1=0; x119; x1++) { if (!chessdata[y1][x1]) 继续; for (y2=0; y211; y2++) for (x2=0; x219; x2++) if (chessdata[y2][x2] (chessdata[y1][x1 ]==chessdata[y2][x2]) (x1!=x2 || y1!=y2) ) { p1.x=x1; p1.y=y1; p2.x=x2; p2.y=y2;读棋(); if (llk_bfs(y1, x1, y2, x2) !=-1) { click2p(p1, p2);返回; } } }} 4. 在线游戏修改

这是我从小学四年级就开始玩的游戏。因为很久没有登录了,所以在这里积累了很多经验。我们可以在声明之前观察它。

一张表格被抓住了。

初步分析,文中并没有直接指定经验数据,而是用其他数值代替,并且经验获取的类型也用其他数字代替。这里最初的猜测是年龄。

好吧,可能类型太多,找不到同龄的。

但我改变了方法,在宠物身上使用了两次经验包。我抓到的两个包都叫fcode1f3.

如何创建游戏插件

Age 类型也是如此。

几分钟后,我们使用了第三袋。

南达?难道这个时代真的是……(小声)

还是不确定,我们用爬虫来模拟一下这个形式,max out(账号封禁)!

经过N次测试.

成功!

需要注意的是,这个游戏服务器已经好几年没有更新了,最后一次公布已经是十年前了。

如果你想用爬虫来模拟道具的使用,一个非常关键的信息就是cookie,它是确认你登录的账号的判断信息。

代码贴在下面(我的cookie必须删除)

导入java.util.ArrayList;导入java.util.List;导入org.apache.http.Header;导入org.apache.http.HttpResponse;导入org.apache.http.NameValuePair;导入org.apache.http.client。 ResponseHandler;导入org.apache.http.client.entity.UrlEncodedFormEntity;导入org.apache.http.client.methods.HttpGet;导入org.apache.http.client.methods.HttpPost;导入org.apache.http.impl。 client.BasicResponseHandler;导入org.apache.http.impl.client.CloseableHttpClient;导入org.apache.http.impl.client.HttpClients;导入org.apache.http.message.BasicNameValuePair;导入org.apache.http.protocol。 HTTP; public class Renren { private static String renRenLoginURL='http://resourcemop.l.imop.com/res/fc/fcde1f39034b164a0d5fe7e455b0c32e';私有HttpResponse 响应;私有CloseableHttpClient httpclient=HttpClients.createDefault();私有布尔登录(){ HttpGet httpGet=new HttpGet(renRenLoginURL); httpGet.setHeader('接受范围', '字节'); httpGet.setHeader('年龄', '74342'); httpGet.setHeader('缓存控制', ''); http获取。 setHeader('内容长度', '3266'); httpGet.setHeader('Content-Type', 'text/plain'); httpGet.setHeader('日期', '星期四, 2019 年5 月23 日08:41:58 GMT'); httpGet .setHeader('过期', '2029 年5 月20 日星期日08:41:58 GMT'); httpGet.setHeader('Last-Modified', '星期三,2019 年5 月22 日08:13:20 GMT'); httpGet.setHeader('服务器', 'Apache' ); httpGet.setHeader('Via', '1.0 Static1.lzr.squid1:80 (squid/2.6.STABLE7)'); httpGet.setHeader('X-Cache', '来自Static1.lzr.squid1 的命中'); http获取。 setHeader('推荐人', 'http://s34.l.imop.com/'); httpGet.setHeader('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, 如Gecko) Chrome/75.0.3770.100 Safari/537.36');尝试{ 响应=httpclient.execute(httpGet); } catch (Exception e) { e.printStackTrace();返回假; } 最后{ httpGet.abort();返回真; } public static void main(String[] args) { Renren renRen=new Renren(); renRen.login(); }} 这其实是人人网两年前写的爬虫。您可以通过更改表单数据来使用它。拉。

篇幅有限,暂时写这么多。以后可能会继续更新其他修改教程,关于蒸汽冷冻我一定会写的。

敲代码就是爱,敲代码让世界充满爱!撤退!

原文:cnblogs.com/LexMoon/p/wgjc.html 回复“资源”领取练习源码、视频教程、微服务、并发、数据可调性等,搜索【Java知音】

用户评论

浮殇年华

这篇文章太棒了,正好是我想学习的东西!

    有7位网友表示赞同!

寂莫

创建游戏插件感觉好难啊,这篇文章给了我一些启发。

    有19位网友表示赞同!

墨染天下

终于找到一篇靠谱的教程了,感谢分享!

    有20位网友表示赞同!

作业是老师的私生子

插件开发的门槛很高吗?

    有18位网友表示赞同!

纯情小火鸡

文章太详细了,收藏起来慢慢学习!

    有18位网友表示赞同!

苏樱凉

看了文章感觉自己要开始尝试做插件了!

    有9位网友表示赞同!

反正是我

能否分享一些常用的插件开发工具?

    有12位网友表示赞同!

放肆丶小侽人

有没有什么学习插件开发的资源推荐?

    有8位网友表示赞同!

苍白的笑〃

学习插件开发需要掌握哪些编程语言?

    有9位网友表示赞同!

满心狼藉

文章内容很实用,可以帮助我快速入门插件开发。

    有7位网友表示赞同!

我没有爱人i

这篇文章对我来说简直是救星!

    有12位网友表示赞同!

发型不乱一切好办

期待看到更多关于插件开发的文章!

    有12位网友表示赞同!

烟雨离殇

感觉文章内容有点深奥,希望有更详细的解释。

    有20位网友表示赞同!

落花忆梦

对于新手来说,这篇文章有点难度了。

    有13位网友表示赞同!

烬陌袅

能不能给个简单的示例代码?

    有17位网友表示赞同!

孤廖

插件开发真的很有趣!

    有16位网友表示赞同!

蔚蓝的天空〃没有我的翅膀

感谢作者的分享,让我对插件开发有了新的认识。

    有10位网友表示赞同!

哭花了素颜

文章内容很清晰,讲解也比较通俗易懂。

    有9位网友表示赞同!

陌上花

学完这篇文章,感觉自己离插件开发又近了一步!

    有16位网友表示赞同!

莫失莫忘

希望文章能更新更多插件开发的实战案例。

    有14位网友表示赞同!

标题:如何创建游戏插件
链接:https://yyuanw.com/news/sypc/18563.html
版权:文章转载自网络,如有侵权,请联系删除!
资讯推荐
更多
绯红之境兑换码最新2021 礼包兑换码大全

绯红之境兑换码最新2021 礼包兑换码大全[多图],绯红之境兑换码怎么领取?绯红之境兑换码有哪些?绯红之境在今日

2024-09-08
妄想山海怎么加好友 加好友方法大全

妄想山海怎么加好友 加好友方法大全[多图],妄想山海添加好友功能在哪里?妄想山海添加好友的方法是什么?好友添

2024-09-08
三国群英传7霸王再临攻略 霸王再临攻略技巧开启方法

三国群英传7霸王再临攻略 霸王再临攻略技巧开启方法[多图],三国群英传7霸王再临怎么玩?三国群英传7霸王再临

2024-09-08
江南百景图又见桃花村钓鱼位置在哪?又见桃花村钓鱼攻略

江南百景图又见桃花村钓鱼位置在哪?又见桃花村钓鱼攻略[多图],江南百景图又见桃花村钓鱼怎么钓?又见桃花村钓

2024-09-08