文档章节

游戏外挂是怎么炼成的

一个灰
 一个灰
发布于 2018/10/14 14:20
字数 1900
阅读 197
收藏 1

本人曾经帮朋友开发了一款DNF外挂程序,其重要功能是使用账户列表中的用户名密码自动登录DNF,后面的事情交给按键精灵完成。

外挂是一条黑色产业链,由于腾讯的保护程序相当强悍,如今要做出一个外挂将非常困难。外挂是怎么赢利的?很多人了解的模式是直接把外挂卖给需要外挂的人。而在本例中,外挂的作用是给那些机器自动代打,获取游戏币,再通过渠道将游戏币换成人民币。运行这些代打机器的作坊有一个专用的名称叫“工作室”。当然此工作室非彼工作室。这些工作室会购买最廉价的电脑,每台电脑可以同时运行几个对系统要求不高的游戏,24小时不间断自动代打,虽然有的游戏会限制在线时间,但是由于账号众多,可以轮番使用。这些账号从哪里来的?有一批人专门会养号,然后再卖给工作室。

在早期,游戏知名度比较低的情况下,游戏厂商希望有更多的人气,所以对工作室的行为是睁一只眼闭一只眼。

言归正传,要实现自动登录DNF,需要以下几个步骤

  1. 清理系统缓存
  2. 选择网卡拨号(多个宽带账号,防止被识别为同一个使用者)
  3. 自动启动DNF游戏程序
  4. 选择登录账号
  5. 启动外挂主程序(通过启动rootkit服务,隐藏外挂进程)

这些功能都没有什么太多技术含量,前期使用MFC开发,为了开发方便,后面就转成WPF实现。 守护程序

守护程序除了上述正常流程外,还有日志记录,通过邮件发送,自动重启等功能。

自动登录

外挂主程序用到了一个大名鼎鼎的大漠插件,而且使用该插件需要付费。付费后会给你一个dll文件。

首先,我们需要从配置文件中读取游戏大区数据,然后我们需要注册大漠插件dm.reg()

然后,通过调用dm.find_wnd函数查找游戏主窗口。找到后需要绑定主窗口,方便使用按键精灵进行自动点击游戏中的区域。

状态自动机

在自动登录的过程中,有些流程会有所变化,比如可能会弹出输入验证码窗口,还有就是每一个步骤需要等待一个不确定的动画等。所以就使用了状态自动机去做。提前设置好每一种状态在遇到特定动作的时候进入某一个下一个状态。

确定当前步骤

如何确定当前画面中是否有输入框呢? 这就要用到dm的图片匹配功能。我们事先将游戏画面中有特征的画面截取一小部分,作为判断依据。例如判断是否是选择大区的状态。则用提前准备的截图去匹配屏幕。 选择大区截图

总体流程就是,选择服务器->选择大区->输入用户名密码->登录成功。

验证码自动输入

有时候登录的时候会弹出输入验证码,这验证码很变态,是四个轮流闪烁的图。机器肯定无法识别。这时候就诞生了产业链中的另外一环,就是人工识别验证码。 打码兔 在某个偏远的地区,公司雇佣一堆平时没事做的大妈,盯着屏幕发送过来的验证码,人工识别然后把验证码打入消息框传回外挂程序中,程序再用按键精灵去打入验证码框中。 这个服务也需要付费的。所以外挂也是需要付出成本的。利润会分配的产业链中的各个环节。

避免被腾讯保护程序查杀

腾讯的保护程序——DProtector会随着游戏的启动而启动,不可以被杀,否则游戏不会正常运行。这个保护程序可以监控进程列表中的可疑程序,并阻止可疑程序的执行。那么如何才能避免被它发现呢?这就需要用到流氓软件360使用的技术了——驱动级编程!

进程保护驱动程序

驱动程序的权限很高,可以访问系统内核,而普通程序则不行。所以很多计算机病毒都是驱动级的程序,查杀比较困难,普通的操作无法清除。 使用visual studio 开发windows驱动的时候,需要安装WindowsKernelModeDriver8.1 工具集。配置类型选择Driver。最后我们会生成一个sys文件。 在内核驱动中,我们可以侦测到对进程的所有的操作,我们可以筛选出需要保护的进程,当遇到诸如挂起进程,终止进程之类的操作的时候,我们可以拦截,这样就无法终止该进程了。 无法中止进程

进程保护进阶

还有更为变态的方法,就是修改系统的SSDT表。

ssdt全称为System Services Descriptor Table,中文为系统服务描述符表,ssdt表就是把ring3的Win32 API和ring0的内核API联系起来。SSDT并不仅仅只包含一个庞大的地址索引表,它还包含着一些其它有用的信息,诸如地址索引的基地址、服务函数个数等。

#pragma pack(1) //SSDT表的结构
typedef struct ServiceDescriptorEntry {
	unsigned int *ServiceTableBase;
	unsigned int *ServiceCounterTableBase; //Used only in checked build
	unsigned int NumberOfServices;
	unsigned char *ParamTableBase;
}ServiceDescriptorTableEntry_t, *PServiceDescriptorTableEntry_t;
#pragma pack()

__declspec(dllimport) ServiceDescriptorTableEntry_t KeServiceDescriptorTable; //变量名是不能变的,因为是从外部导入
//这个是查询某个函数的地址的一个宏
#define SYSTEMSERVICE(_function)  KeServiceDescriptorTable.ServiceTableBase[*(PULONG)((PUCHAR)_function+1)]

我们可以定义一个自己的函数,然后修改地址,让系统调用API的时候调用我们自己的函数。

//修改 ZwOpenProcess 函数地址
	OldZwOpenProcess = (ZWOPENPROCESS)(SYSTEMSERVICE(ZwOpenProcess));
	(SYSTEMSERVICE(ZwOpenProcess)) = NewZwOpenProcess;
NTSTATUS NewZwOpenProcess(OUT PHANDLE ProcessHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, IN PCLIENT_ID ClientId OPTIONAL)
{//用来替换的新函数
	NTSTATUS nStatus = STATUS_SUCCESS;
	if ((long)ClientId->UniqueProcess == pid)
	{
		DbgPrint("保护进程 PID:%ld\n", pid);
		return STATUS_ACCESS_DENIED;
	}

	//剩下的交给我们的原函数
	nStatus = OldZwOpenProcess(ProcessHandle, DesiredAccess, ObjectAttributes, ClientId);
	return STATUS_SUCCESS;
}

驱动程序安装程序

驱动程序写好了,我们还需要一个安装程序去安装这个驱动程序。这个也没啥技术含量,就是一个自动化的过程,包括启动驱动程序注册好的系统服务,还有卸载功能。

反外挂

游戏公司的反外挂和外挂之前就如同病毒和杀毒软件一样,是一个道高一尺魔高一丈的过程,上使用的这些手段,早已不是什么新鲜玩意儿了。这场较量会一直持续下去,希望国家在这方面的法律能够不断健全,消灭灰色、黑色产业链,让大家有一个健康的市场环境,把智慧用到正途上。

© 著作权归作者所有

一个灰
粉丝 28
博文 33
码字总数 21699
作品 3
南京
高级程序员
私信 提问
脑洞不是一般大!肆虐《绝地求生》的外挂还有这种操作?

作为2017年最热的游戏,《绝地求生:大逃杀》(俗称“吃鸡游戏”)的火爆,不仅压掉了《王者荣耀》,也让昔日游戏界的无敌IP《魔兽世界》有些黯然失色,形成了一个独特的“吃鸡”现象。然而,...

张书乐
2018/01/17
0
0
如何做好iOS应用安全?这有一把行之有效的“三板斧”

本文由 网易云 发布 iOS应用面临很多破解问题,常见的有IAP内购破解、山寨版本、破解版本等;大众应用上,微信抢红包、微信多开等;而在iOS游戏上,越来越泛滥的外挂问题也不断困扰着游戏厂商...

wangyiyungw
2018/05/15
0
0
揭秘暴利游戏外挂后面的黑色产业链,外挂开发者是优秀程序员还是菜鸟码农?

可能在大家眼里,卖外挂顶多算是灰色产业,钻钻法律漏洞、与游戏公司斗智斗勇,不过是想混口饭吃。然而直到这条新闻被爆出,大家才意识到,原来外挂不仅仅只是打法律擦边球这么简单,这是切切...

IT智云编程
2018/11/03
0
0
手游开发者必看:手游屡遭外挂为哪般?

  网游已走过十余年的历史,期间诞生了不少经典作,也有许多游戏黯淡离去,退出这个精彩的舞台。这些淡出视线的游戏有的是未被玩家所记住,有的却是经历过辉煌,而后“香消玉殒”的作品。有...

科技创造
2014/09/17
244
1
案例教程—200行python实现杀手级连连看外挂程序

欢迎关注天善智能,我们是专注于商业智能BI,人工智能AI,大数据分析与挖掘领域的垂直社区,学习,问答、求职一站式搞定! 对商业智能BI、大数据分析挖掘、机器学习,python,R等数据领域感兴...

天善智能
2018/06/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

刚哥谈架构 (二) 我眼中的架构师

之前在公司,有小伙伴在向别人介绍我的时候,经常会有人这么说:“刚哥是我们的architcture”,如果来人是老外,心中一定是一惊,心中暗叹,“这位匪首看上去貌不惊人,难道已经做到了架构和...

naughty
27分钟前
2
0
OSChina 周日乱弹 —— 别问,问就是没空

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @tom_tdhzz :#今日歌曲推荐# 分享容祖儿/彭羚的单曲《心淡》: 《心淡》- 容祖儿/彭羚 手机党少年们想听歌,请使劲儿戳(这里) @wqp0010 :周...

小小编辑
56分钟前
43
2
golang微服务框架go-micro 入门笔记2.1 micro工具之micro api

micro api micro 功能非常强大,本文将详细阐述micro api 命令行的功能 重要的事情说3次 本文全部代码https://idea.techidea8.com/open/idea.shtml?id=6 本文全部代码https://idea.techidea8....

非正式解决方案
今天
5
0
Spring Context 你真的懂了吗

今天介绍一下大家常见的一个单词 context 应该怎么去理解,正确的理解它有助于我们学习 spring 以及计算机系统中的其他知识。 1. context 是什么 我们经常在编程中见到 context 这个单词,当...

Java知其所以然
昨天
5
0
Spring Boot + Mybatis-Plus 集成与使用(二)

前言: 本章节介绍MyBatis-Puls的CRUD使用。在开始之前,先简单讲解下上章节关于Spring Boot是如何自动配置MyBatis-Plus。 一、自动配置 当Spring Boot应用从主方法main()启动后,首先加载S...

伴学编程
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部