游戏外挂是怎么炼成的

本人曾经帮朋友开发了一款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;
}

驱动程序安装程序

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

反外挂

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,670评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,928评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,926评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,238评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,112评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,138评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,545评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,232评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,496评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,596评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,369评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,226评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,600评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,906评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,185评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,516评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,721评论 2 335

推荐阅读更多精彩内容