请结合博文

https://blog.csdn.net/ioio_jy/article/details/28142093

中的内容,对游戏《仙剑奇侠传》

链接:https://pan.baidu.com/s/1guSqYNE3kvDsTaY2qKbnTA
提取码:1v18

设计一款修改工具,要求必须有界面,能对人物属性进行显示与修改,最后还需要在实验报告中论述,作为游戏开发商,应当采用何种方式来防止自己的游戏信息被逆向分析。


仙剑游戏修改器:

原理:其实就是找到指定资源的地址,通过修改文件的函数fopen_s打开、fseek找到该地址、fwrite写入、fclose关闭文件。

//金钱数修改
void CXianjianModiferhsb20190625Dlg::OnBnClickedButton2()
{TODO: 在此添加控件通知处理程序代码// // TODO: 在此添加控件通知处理程序代码//char fileName[256];std::cout << "请输入仙剑奇侠传存档文件路径:";MessageBox(L"请输入仙剑奇侠传存档文件路径:", L"提示", MB_OK);//CString str;IDC_EDIT1 - 路径输入框//GetDlgItemText(IDC_EDIT1, str);//int strLength = str.GetLength() + 1;//const char* fstr = CStringA(str);//strncpy(fileName, fstr, strLength);//FILE* fp = 0;//fopen_s(&fp, fileName, "rb");//if (!fp)//{//   MessageBox(L"无法打开指定的仙剑奇侠传存档文件", L"提示", MB_OK);//    //system("pause");//  //state = 0;//}//else//{// //int fix;//    fseek(fp, 0, SEEK_END);//   int fileSize = ftell(fp);//    rewind(fp);//   char* PalSaveFullP = (char*)malloc(fileSize);//    fread(PalSaveFullP, 1, fileSize, fp);// fclose(fp);//   unsigned int* PalSavePGold = (unsigned int*)malloc(4);//   memcpy(PalSavePGold, PalSaveFullP + 0x28, 4);//    //IDC_EDIT4 = *PalSavePGold;// //当前金钱数 - IDC_EDIT2//   SetDlgItemText(IDC_EDIT2, (LPCTSTR)*PalSavePGold);//    //std::cout << "输入要修改的金钱数量(0~16777215):";// //fix = ;//    //GetDlgItemText(IDC_EDIT2, fix);// CString str2;// GetDlgItemText(IDC_EDIT3, str2);//  //fix = str2;//    memcpy(PalSavePGold, &str2, 4);//   memcpy(PalSaveFullP + 0x28, PalSavePGold, 4);//    fopen_s(&fp, fileName, "wb");//   fwrite(PalSaveFullP, 1, fileSize, fp);//    fclose(fp);//   //std::cout << "保存成功,即将返回上级菜单,";//  //GetDlgItemText(IDC_EDIT2, str);// MessageBox(L"保存成功,即将返回上级菜单:", L"提示", MB_OK);//  //system("pause");//  //state = 0;//}//char fileName[256] = {0};//std::cout << "请输入仙剑奇侠传存档文件路径:";//std::cin >> fileName;CString Cpath;GetDlgItemText(IDC_EDIT1, Cpath);MessageBox(((LPTSTR)((LPCTSTR)Cpath)), L"提示", MB_OK);FILE* fp = 0;//strcpy(fileName, Cpath);//char fileName[256] = {0};//strcpy(fileName, CStringToChar(Cpath));/*const size_t strsize = (Cpath.GetLength() + 1) * 2;char* pstr = new char[strsize];size_t sz = 0;*/USES_CONVERSION;char * pstr = T2A(Cpath.GetBuffer(0));Cpath.ReleaseBuffer();//fileName = CStringToChar(Cpath);//fopen_s(&fp, "H:\\1大三学习第二学期资源\\网络安全\\实验\\实验14_20190623\\仙剑奇侠传2\\1.rpg", "rb");MessageBox((LPCTSTR)pstr, L"提示", MB_OK);fopen_s(&fp, pstr, "rb");if (!fp){//std::cout << "无法打开指定的仙剑奇侠传存档文件,";MessageBox(L"无法打开指定的仙剑奇侠传存档文件,", L"提示", MB_OK);system("pause");//state = 0;}else{//int fix;fseek(fp, 0, SEEK_END);int fileSize = ftell(fp);rewind(fp);char* PalSaveFullP = (char*)malloc(fileSize);fread(PalSaveFullP, 1, fileSize, fp);fclose(fp);unsigned int* PalSavePGold = (unsigned int*)malloc(4);memcpy(PalSavePGold, PalSaveFullP + 0x28, 4);//std::cout << "当前金钱数量为:" << *PalSavePGold << std::endl;//std::cout << "输入要修改的金钱数量(0~16777215):";//std::cin >> fix;//int fix;CString Cstr;GetDlgItemText(IDC_EDIT3, Cstr);int fix = _ttoi(Cstr);memcpy(PalSavePGold, &fix, 4);memcpy(PalSaveFullP + 0x28, PalSavePGold, 4);//fopen_s(&fp, "H:\\1大三学习第二学期资源\\网络安全\\实验\\实验14_20190623\\仙剑奇侠传2\\1.rpg", "wb");fopen_s(&fp, pstr, "wb");fwrite(PalSaveFullP, 1, fileSize, fp);fclose(fp);//std::cout << "保存成功,即将返回上级菜单,";MessageBox(L"保存成功,即将返回上级菜单,", L"提示", MB_OK);//system("pause");//state = 0;}
}//经验值修改
void CXianjianModiferhsb20190625Dlg::OnBnClickedButton3()
{// TODO: 在此添加控件通知处理程序代码char fileName[256];//std::cout << "请输入仙剑奇侠传存档文件路径:";//std::cin >> fileName;FILE* fp = 0;CString Cpath;GetDlgItemText(IDC_EDIT1, Cpath);MessageBox(((LPTSTR)((LPCTSTR)Cpath)), L"提示", MB_OK);//fopen_s(&fp, "H:\\1大三学习第二学期资源\\网络安全\\实验\\实验14_20190623\\仙剑奇侠传2\\1.rpg", "rb");USES_CONVERSION;char * pstr = T2A(Cpath.GetBuffer(0));Cpath.ReleaseBuffer();//fileName = CStringToChar(Cpath);//fopen_s(&fp, "H:\\1大三学习第二学期资源\\网络安全\\实验\\实验14_20190623\\仙剑奇侠传2\\1.rpg", "rb");//MessageBox((LPCTSTR)pstr, L"提示", MB_OK);fopen_s(&fp, pstr, "rb");//const size_t strsize = (Cpath.GetLength() + 1) * 2;//char* pstr = new char[strsize]; size_t sz = 0;//wcstombs_s(&sz, pstr, strsize, Cpath, _TRUNCATE);//MessageBox((LPCTSTR)pstr, L"提示", MB_OK);//fopen_s(&fp, pstr, "rb");//fopen_s(&fp, (char *)((LPTSTR)((LPCTSTR)Cpath)), "rb");if (!fp){MessageBox(L"无法打开指定的仙剑奇侠传存档文件,", L"提示", MB_OK);system("pause");}else{int fix;fseek(fp, 0, SEEK_END);int fileSize = ftell(fp);rewind(fp);char* PalSaveFullP = (char*)malloc(fileSize);fread(PalSaveFullP, 1, fileSize, fp);fclose(fp);unsigned long* PalSavePSaveT = (unsigned long*)malloc(2);memcpy(PalSavePSaveT, PalSaveFullP + 0x7c, 2);int prt = 0;memcpy(&prt, PalSavePSaveT, 2);//std::cout << "当前经验值为:" << prt << std::endl;do {//std::cout << "输入要修改的经验值为(0~32000):";//std::cin >> fix;CString Cstr;GetDlgItemText(IDC_EDIT4, Cstr);fix = _ttoi(Cstr);} while (fix < 0 || fix > 32000);memcpy(PalSavePSaveT, &fix, 2);memcpy(PalSaveFullP + 0x7c, PalSavePSaveT, 2);//fopen_s(&fp, "H:\\1大三学习第二学期资源\\网络安全\\实验\\实验14_20190623\\仙剑奇侠传2\\1.rpg", "wb");fopen_s(&fp, pstr, "wb");fwrite(PalSaveFullP, 1, fileSize, fp);fclose(fp);//std::cout << "保存成功,即将返回上级菜单,";MessageBox(L"保存成功,即将返回上级菜单,", L"提示", MB_OK);system("pause");//state = 0;}
}

首先我们科普一下外挂的定义(自己总结非官方):能够修改目标程序原有的行为或数据的第三方程序。其中最常见的目标程序就是网络游戏客户端。一直以来,网络游戏开发商以及运营商与外挂开发者之间的对抗,从未停止过。正所谓,八仙过海各显神通。在对抗的过程当中,双方都有一定的收益,在利益的驱使下,双方都竭尽所能使用更高端的技术完成攻与防的内容。

正所谓,知己知彼百战百胜。我们作为专业的反外挂开发商,非常有必要了解各种常见游戏外挂所采用的技术。只有知道了他们的原理,我们才能想出对抗外挂的技术方法。下面列出我们在十数载反外挂研究中发现的外挂技术种类(不全之处,还望补充)。

一.脱机类外挂

在游戏开发过程中,每款游戏的客户端与服务端都会有固定的通信格式,大部分游戏通信协议位于TCP层之上,自定义的数据结构,外挂开发者们称此为封包。下面简单列举一个简单的打斗封包,以方便说明脱机类外挂原理。

0000ABCD 0000DCBA 00001234 00001000

例如玩家1在与玩家2打斗过程中,发送到服务器这样一个16字节的数据包,其中游戏开发者定义此数据包含义如下:

0000ABCD:玩家1的ID。

0000DCBA:玩家2的ID。

00001234:玩家1所使用的技能编号。

00001000:玩家1对玩家2造成的伤害,转换为十进制为:4096。

当服务器接收到此数据包时,则会将玩家2的血量减少4096点,如果玩家血量减少后小于等于0,则判定为玩家2已经阵亡。这时服务器会返回给玩家2的客户端一个数据包,玩家2的客户端则播放一个玩家2已经死亡的动画。

以上逻辑,其实存在着大量的漏洞,比如说,服务器应该判定玩家上一次释放00001234号技能是否在冷却时间内,再比如说,服务器应该判定玩家战斗过程中所造成的伤害是否与其装备、法力值、攻击力、暴击等相吻合,是否超过了游戏本身限制的最大伤害。类似这种漏洞,每一款游戏都会存在,只不过不会这么明显。一些老游戏在这方面做的相对较弱,所以漏洞更多。

另外,在游戏开发过程中,数据通信的格式在游戏开发商的公司中都有相关文档明确定义的。而这些文档非常机密。一些游戏开发商公司的安全做的不够好的情况下,可能会造成游戏代码以及文档的泄露。这些资料,一旦流入外挂开发者手中,那么这款游戏就极有可能会出现脱机式外挂。

脱机外挂定义:在不开启游戏客户端的情况下,第三方程序直接与游戏服务器进行通信,模拟账号登陆验证、选择角色、进入游戏、进入场景、开始战斗、对怪物造成伤害等操作时的合法数据包,发送给服务器,而服务器是没有能力判断出这些包是否是客户端发来的,即便有验证手段,由于源码已经泄露,外挂开发者可以轻而易举的模拟出服务端的各种验证机制。即便数据包传送过程中是加密的,由于源码外漏,外挂开发者一样可以正确模拟出数据包的加密方式。

对于这种类型的外挂,常见的屏蔽手段就是修改加密方式,使得脱机外挂发送过来的数据包,服务端无法解析,或者解析出的结果是错误的,而服务端发现客户端发送错误的数据包时,则断开连接。此方法,需要客户端与服务端同步更新。改动较大。

还有一种常见方法,是在客户端中嵌入一些验证性代码,与另外一个专门负责验证的服务端通信,客户端必须正确作答后,服务端方可认为是合法客户端发来的数据包。此类反外挂方式,我们也会经常见到,比如一些游戏中为防止挂机行为而加入的答题机制。

二.模拟发包类外挂

脱机类外挂多半依赖于游戏开发商的资料外泄,而模拟发包类外挂与脱机类外挂很近似。原因是一些外挂开发者本身可能是游戏开发者出身,对游戏中的逻辑相当了解,他们可以用调试+抓包分析的方法,在没有源码以及通信格式资料的情况下,分析出一些游戏中关键的数据包,并采用一定的模拟发包技术,完成游戏中本身含有的功能。

此类外挂多半需要向游戏中注入一个dll文件,并且用dll获取到与服务器通信的socket句柄,在此socket句柄上,将自己组织好的、合法的数据包发送到服务器。部分比较老的游戏中很常见此类的外挂,比如决战OL中的挂机内挂中的喊话功能,自动喝药功能,都是模拟发包方式完成的。

防此类外挂的方法,可以从数据安全的角度来做,也就是更换数据包的加密方式,但这种方式多半需要对游戏客户端和服务端进行较大的改动。我们也可以从技术角度来防此类外挂。既然需要dll注入,我们采用合理的办法防止dll注入到我们的游戏进程中即可。后文中会详细分析注入与反注入相关技术。

三.内存式外挂

在没有游戏客户端源码,并且没有一定的游戏开发经验的情况下,依然是可以进行外挂开发的。而这些外挂开发者,一般熟练掌握操作系统的各种底层机制,如模块、线程、内存、内核对象、内核机制等技术。这些技术,有助于他们去分析游戏客户端进程中的逻辑和重要数据,之后他们一般会注入dll到游戏进程,去操作游戏进程内数据,完成一些特殊功能。当遇到一些改动,服务器恰好没有校验时,他们的外挂功能便成功执行。

对于这种类型的外挂,通常的反外挂方式是,尽量让服务器端加入更多的校验。但是对于一些古老的游戏,无人维护,无人更新,此方法很难行得通。

另外,也可以在客户端对dll的注入进行限制,当外挂开发者无法注入dll到游戏进程时,那么他们也就无法完成对游戏数据的修改操作。

参考:https://blog.csdn.net/maomao7278449/article/details/51872566

以上就是网上对大多数反外挂的方法,我简单说一下我的见解(通过老师教授的知识)

  1. 资源加密
  2. 修改文件地址(随机产生偏移)

-- 这两个就是最经常用的反外挂的方法 --

还有一个厂商要做到的是源码泄露,如果源码泄露那么这个游戏几乎没有完全没有安全性。我认为这个是做到防游戏外挂的最重要方法。


通过这个实验的学习,认识怎么制作游戏外挂。

做外挂就是使用逆向,找到游戏各资源的地址,通过修改该地址的数据,可以做到修改资源的作用。道理其实就是这么简单。但是找到游戏资源地址可以说是重中之中。

期间遇到不少问题。

例如使用MFC开发时,要把输入框的Cstring转为char *。一直装换不成功,所以通过问同学,使用一下方法解决:

USES_CONVERSION;

char * pstr = T2A(Cpath.GetBuffer(0));

Cpath.ReleaseBuffer();

//fileName = CStringToChar(Cpath);

//fopen_s(&fp, "H:\\1大三学习第二学期资源\\网络安全\\实验\\实验14_20190623\\仙剑奇侠传2\\1.rpg", "rb");

MessageBox((LPCTSTR)pstr, L"提示", MB_OK);

fopen_s(&fp, pstr, "rb");

通过此次试验,可以说是收益良多。

网络安全学习第14篇 - 游戏(仙剑奇侠传95)外挂之修改游戏资源文件(修改人物属性)相关推荐

  1. 网络安全学习第15篇 - 游戏内存修改

    请依据实验文档<游戏辅助的实现>中的内容,自行编写一个游戏内存数据修改程序,使其可以对某款游戏的某一项或某几项数值进行修改.有余力的同学可以任选一款游戏尝试修改. 实验报告的最后请简述,作 ...

  2. 网络安全学习第4篇-使用特征码和MD5对勒索病毒进行专杀,并对加密文件进行解密

    请使用IDA或其它分析工具分析本次的样本文件,写一个简要的行为分析报告,并编写一个针对于这次样本的专杀(恢复)程序. 要求: 1.样本分析只要说明主要行为即可.提示:sub_401320主要用于文件加 ...

  3. 网络安全学习第6篇 - 爆破及PE文件解释

    1.请采用暴力破解的方式去尝试破解crack.exe文件(在实验报告中说明破解原理即可,无需提交破解后的文件) 2.请依据参考文档中的内容编写一个小程序,使其可以实现如下功能: ①判断一个文件是否为P ...

  4. 网络安全学习第10篇 - ping程序的实现,抓包分析ping数据包以及ping工具对于网络安全方面的威胁

    请结合附件:Ping的实现原理与ping.cpp的内容,编写一个程序,使其能够实现简单的ping的功能,即判断目标网站是否可以连接,然后通过Wireshark进行抓包分析其ICMP协议,指出哪个数据包 ...

  5. [网络安全学习篇51]:信息收集

    引言:我的系列博客[网络安全学习篇]上线了,小编也是初次创作博客,经验不足:对千峰网络信息安全开源的视频公开课程的学习整理的笔记整理的也比较粗糙,其实看到目录有300多集的时候,讲道理,有点怂了,所以 ...

  6. [网络安全学习篇21]:防火墙(千峰网络安全视频笔记 21 day)

    引言:我的系列博客[网络安全学习篇]上线了,小编也是初次创作博客,经验不足:对千峰网络信息安全开源的视频公开课程的学习整理的笔记整理的也比较粗糙,其实看到目录有300多集的时候,讲道理,有点怂了,所以 ...

  7. [网络安全学习篇18]:ACL及实验(千峰网络安全视频笔记 18 day)

    引言:我的系列博客[网络安全学习篇]上线了,小编也是初次创作博客,经验不足:对千峰网络信息安全开源的视频公开课程的学习整理的笔记整理的也比较粗糙,其实看到目录有300多集的时候,讲道理,有点怂了,所以 ...

  8. [网络安全学习篇19]:NAT、动态路由及实验(千峰网络安全视频笔记 19 day)

    引言:我的系列博客[网络安全学习篇]上线了,小编也是初次创作博客,经验不足:对千峰网络信息安全开源的视频公开课程的学习整理的笔记整理的也比较粗糙,其实看到目录有300多集的时候,讲道理,有点怂了,所以 ...

  9. [网络安全学习篇23]:DNS欺骗与钓Y网站(千峰网络安全视频笔记 p114-p116)

    引言:我的系列博客[网络安全学习篇]上线了,小编也是初次创作博客,经验不足:对千峰网络信息安全开源的视频公开课程的学习整理的笔记整理的也比较粗糙,其实看到目录有300多集的时候,讲道理,有点怂了,所以 ...

  10. [网络安全学习篇12]:数据链路层及交换机的学习(千峰网络安全视频笔记 12 day)

    引言:我的系列博客[网络安全学习篇]上线了,小编也是初次创作博客,经验不足:对千峰网络信息安全开源的视频公开课程的学习整理的笔记整理的也比较粗糙,其实看到目录有300多集的时候,讲道理,有点怂了,所以 ...

最新文章

  1. 【事务】特性、安全保障及实现
  2. js调整数组某些元素到指定位置顺序_如何将一个 JavaScript 数组打乱顺序?
  3. MySQL Explain详解,分析语句为何运行慢
  4. PYTHON读取EXCEL内容再转变成HTML添加到OUTLOOK中
  5. 图像匹配之序贯相似性检测法匹配
  6. 自制电吉他效果器 DIY PCB(三)原理图与封装 上
  7. 神舟微型计算机登录密码忘记,win10开机密码忘记按f2(win10忘记密码强制重置)
  8. 电脑关闭所有应用的快捷键
  9. 前端性能和加载体验优化实践(附:PWA、离线包、内存优化、预渲染)
  10. Echarts水滴图
  11. 基于云平台的电力供电设备远程监控系统
  12. win10安装TensorFlow2.8.0
  13. 随机生成邀请码、随机生成10位数字、随机生成英文字母+数字
  14. centos yum 安装jdk
  15. 2022柏林葡萄酒大奖赛 | 瑞格尔侯爵佳酿斩获两枚金奖
  16. 【ffprobe】查看TS : 视频和音频的pts、dts;查看文件的音频包/视频包总数
  17. 软件cs页面分辨率测试
  18. java jai create 方法_Java-JAI创建似乎使文件描述符保持打开状态
  19. verilog运算符优先级别
  20. 利用pandas合并excel文件

热门文章

  1. [已实现]暴力破解路由器管理密码
  2. 神经网络算法是什么意思,人工神经网络英文缩写
  3. java 邮件接收,用Java接收电子邮件
  4. 博科光纤交换机默认密码更改
  5. 两台ROS相互通信,并测试节点
  6. 解决报错:错误使用 xlsread未找到工作表 ‘sheet1‘
  7. ssim算法计算图片_OpenCV 实现图像结构相似度算法 (SSIM 算法)
  8. Java在一定范围随机生成经纬度
  9. 工程结算的23个问题及技巧
  10. python内置库和标准库的区别_python标准库和第三方库的区别