找回密码
 立即注册
查看: 343|回复: 5

中国制作外挂为什么这么厉害?

[复制链接]
发表于 2023-3-11 21:22 | 显示全部楼层 |阅读模式
绝地求生外挂的猖獗让游戏公司倍感压力,回顾过去,许多之前占领各大网吧的大型游戏,几乎都经历过外挂的洗礼。所以很想知道为什么在中国制作外挂这一行业是怎样运作?背后的外挂开发者又是怎样的一群人?
发表于 2023-3-11 21:23 | 显示全部楼层
外挂功能的实现需要本地进行计算然后和服务器进行通讯配合实现。那么我们在本地把我们能做的做事情都做了,功能也自然就实现了,下面讲一下一款游戏外挂的原理让大家理解为什么无法抵制外挂的出现。

射击类游戏(FPS)它的结构比较简单,我们讲一个稍微复杂一点的武侠游戏,这样的结构分析出来了,FPS也就好说了.
武侠游戏的核心首先是一套挂机功能.能自动打怪,寻路,检测血量自动吃药,捡东西.

在追数据之前,要说的一句话是:一定要懂正向,了解数据结构,脑中构思功能间的调用关系.
比如打怪功能.,点击怪物之后触发的功能调用可能如下,通过这一层层的调用关系来实现一件事情。
鼠标点击CALL {         .
  判断点的什么东西call{             ....
    选中怪物call{                 ......
      走路call{                     ..........
        攻击call{                        
          技能CALL{                             ...                             ...                         }                     }                 }             }         }  }

这是调用关系的构思,同时还要捋清楚数据结构,比如技能对象的结构
struct 技能对象 {
技能ID
当前是否可用
攻击距离
消耗MP
伤害值
恢复值
技能类型
冷却
学习等级
} 脑中只有有了框架才会有突破口和追的方向.

接下来开始正式工作,首先要把人物自身对象结构找到.这个突破口比较多,比如利用人物的血量变化搜索到HP(同理MP/真气等) ,只要找到人物的一个属性(HP),那么基本等于找到了人物对象



左上角数值显示,人物当前血量为3871,进入CE搜索四字节的3871



然后,想办法让这个血量变化,换装备/掉血/吃药.这里我选择吃药,比较方便.



再次搜素4733



直接得到一条线索.接下来要做的就是追数据来源,所有新手们都知道,直接搜到的地址下次开游戏就不一定是这个地址了.要追到他的来源(基址),基址是固定不变的(游戏更新会变).

接下来开始追来源,



在找到的血量 右键=>查找是什么写入这个地址. 弹出来的页面没有变化,因为我们还没有改变血量,就没有写入内容. 再次吃药!



血量上升的同时,收到一条写入数据. 观察这条代码不难理解,将新的血量写入到人物血量地址.,eax是新的血量,[ecx+0x2D00]是存储的血量.



然后继续搜索ecx的值0x4F1FA458,看是什么地方存储了这个值.记得标选HEX(16进制)



将得到的结果 右键点击=>是什么访问    这里不需要再找写入了,找访问就可以(它存储的不再是人物血量了,而是存储的人物某个结构的指针,是不停的访问这个结构的,所以通过访问就能得到数据)



如上图所述,都是+0x4的偏移,在选择的时候有两个选择方法:
1.不要选这种左右都是同一个寄存器的,会让你分析的时候不知道给你的数值是左边的还是右边的.具有干扰性



2.尽量不要选择来源是eax的,因为eax还可以作为call的返回值,容易追错地方.(纯新手容易犯错)
(什么是call的返回值??在写C语言代码的时候每个函数都可以给他写一个返回值,return给一个东西.那么在汇编代码里面,所有的call只要有返回值都会在call内部的结尾赋值给eax)

继续,我们选中一行合适的代码继续往下分析.追0x51E539F8



得到三个结果,都选中,数量不多,挨个右键查看访问.发现只有第二个有访问数据.所以其他两个不是我们的目标/



从第二个得到如下图数据



我们继续选择合适的一行追.0x423E5DC8



又得到这么多数据,继续按照前面的方法挨个访问.



其中两三个数据都有访问,并且访问得到的偏移不同,这时可能有的数据特别难追追不通,也可能每条数据都可以使用.需要我们都去追一下,我已经挨个试过了都没问题都能追到,最后我选择的追+54的偏移.



接下来再次搜索我们便得到了四条基址



这个时候还不要高兴的太早,还有几个要注意的地方!!!
第一,一定要考虑这个游戏是不是模块动态加载.如果是那么基址一定要用模块+偏移的方式来写,如果不是,那么绿色的地址可以直接用.很巧,这个游戏是动态加载的.双击基址就可以查看他的模块+偏移



这才是他的最终结果.
还有一点就是,尽量使用主模块+偏移. 这个游戏的主模块就是Game.exe
我再双击另一个基址大家看一下他的模块+偏移是什么



是一个陌生的模块,可以用但没必要.

这时一整条人物血量的基址得到了.
[[[[[Game.exe+ABABC0]+54]+1a0]+4]+2D00]//人物血量
这个时候需要读者思考一下.大家都写过结构体,用过结构体指针+偏移表示某个成员. 也就是说人物血量作为人物结构的一个成员,他的偏移是2d00,那么是不是表示在同一层下面还有其他成员.
为了方便观察我们打开OD附加游戏
(附加过程中会发现附加失败,因为咱们用CE下过写入和访问断点.只要点一下ce的小电脑图标重新选择一下游戏进程就可以了.)




在OD中 dd 4F1FD158就直接看到了血量的数据(16进制的),然后再dd 4F1FD158-2d00就是本层结构的头部. 我们从头开始看看,看着感觉像是什么数据都把他转换为10进制在游戏里找找对比一下



比如上图,看到一个1F,选中之后右键修改,显示10进制位31.回到游戏观察一下人物属性,人物的等级为31



那么2d00改为6c就是表示人物等级
就继续往下翻,或者说需要什么人物属性就到这里找什么.我把我找到的直接分享给大家.
+38//名称
+6C//等级
+80//称号
+2d00 //当前血量
+2d04//当前蓝量
+2d08//拥有经验
+2d14//精力
+2d18//精力上限
+2d1c//活力
+2d20//活力上限
+2d50//体力
+2d54//定力
+2d58//身法
+2d60//力量
+2d64//灵力
+2d68//外功功力
+2d6c//内功功力
+2d70//外功防御
+2d74//内功防御
+2d78//生命上限
+2d7c//蓝量上限
+2d88//命中
+2d8c//闪避
+2d90//会心攻击
+2d94//会心防御
然后大家观察发现,这个结构下面并没有人物的坐标.看来游戏把坐标结构和人物属性结构分开了.
[[[[[Game.exe+ABABC0]+54]+1a0]+4]+2D00]//人物血量
观察一下这行数据. [+4]下面是人物结构,坐标不在这里他有可能在[+8]或者说他可能在前面的几层结构下面,可能在+54也可能在+1A0.这样一来范围太广无从下手.
方法有两个:
1.重新打开CE搜索人物地址,和搜索血量一样,不过人物坐标是个float(浮点)类型,不要选错
2.利用网上的遍历工具一层一层找坐标
我都用过了,方法不再展示,直接贴数据:
[[[[Game.exe+ABABC0]+54]
+2C//人物X坐标
        +30//人物Z坐标
+34//人物Y坐标

这里我们所需要的人物属性已经搜完了.接下来是找怪物

找怪物的话突破口在哪,从什么地方下手呢.打开怪物血量看一眼,不显示HP数值,也不显示MP.
只有怪物ID露在外面,那就搜索怪物的ID:花港毒蜂





得到800+数据,我们跑到别的地方,让身边的怪物不再是花港毒蜂,因为我们要找身边怪物,存储身边怪物的数组或者链表等结构是一直存在的,当我们身边怪物变成小狗,他就会存储小狗.  
那么我们去别的地方看看,搜ID:白堤柳鬼





出去第二个带身 字的 ,就是我们要的结果.那么哪些名称才是在怪物对象下面呢.???
我给大家分析一下,我们都学过类,学过继承,无论是人物还是怪物,游戏程序员在写的时候会有一个父类,然后人物和怪物会继承那个父类.在内存中观察的话,父类结构放在子类的头部,也就是说,人物和怪物对象的头部结构应该很相似.我们就利用这一点,用得到的怪物名称地址减去0x38,dd一下(因为人的名称偏移是38)
首先人物对象的头部结构是这样的



然后挨个dd得到的数据-38,最后有一个比较相似的,其他的都截然不同,如下图




验证一下,+6c也是等级,和人物的一样,说明没找错



上面的这个过程极其麻烦,要忍住寂寞,保持耐性.

基础到这里结束,接下来是重点部分了,寻找怪物遍历




我们在头部下硬件访问断点,
因为周围的怪物是在不断变化的,怪物列表在不停的访问怪物对象,所以我们要在怪物对象地址处下断




断在上图位置,这个游戏大部分是二叉树结构,大家做好心理准备,我开始走一次正常分析路线,把路上的坑给大家分析一遍
这个eax就是咱们下断的怪物对象,并且发现每次下断点eax在不断变化,说明前面有代码把所有的怪物都遍历了一遍,那么咱们就追eax的来源就会找到怪物遍历的地方.开始追!



直到最后追到这么一个地方,要继续追eax了.但是eax上面有个call,那么我们需要进入call追eax,给call下断点,断下之后按F7进入call内部,这时下面这个结构我们一步步分析



如下图的循环就是二叉树遍历,回想二叉树在C语言中是什么样的写法,先传递一个树根节点先遍历左子树,然后遍历右子树.  



在循环中,[eax]就是+0得到左子树   [eax+8]就是+8得到右子树. 通过循环把所有节点扫描出来



那么这个树根节点是谁呢?就是这个循环头部的eax,然后开始追她的来源.来自[esi+4],在追esi



esi来自[ecx+40]    //[[ecx+40]+4],再追ecx





在外层得到一个基址,不要忘记是动态加载,点击E按钮查看所有模块,找到主模块Game.exe



Game.exe的地址是00BB0000



然后用166ABC0-00BB0000得到偏移ABABC0
Game.exe+ABABC0(和人物基址偏移一样)

这个时候我们得到了树根  然后观察二叉树结构也能知道遍历的规则,最后就能得到所有的二叉树节点.
这里就可以编程实现遍历了,我们是在逆向分析游戏,就不教学写代码了.代码不会写的朋友要多敲代码.
我们写代码便利观察发现周围的花草树木NPC怪物人物宠物全部遍历出来了,这是什么情况.我们得到的竟然不是怪物二叉树而是所有环境对象的二叉树.

掉进坑里了,这个时候思考一下文章开头所说的游戏结构.

我们给怪物对象下断点断在了大环境对象中,那么他细致分类应该是在遍历结束之后.我们回到给怪物对象下断点断下的地方.



这个地方的eax还是大环境中的所有对象,那么下面的代码应该会有细致对象的分类遍历



下面的代码就是这些,一行一行分析并没有做分类处理,然后进入每个CALL看看,没有任何异常,直到最后一个CALL,里面是一个二叉树结构!!!!
这个地方进行判断,如果对象头部是-1也就是FFFFFFFF就跳转到最后一个call(新的二叉树遍历)



call内部结构如下图所示



我们按照之前的方法可以轻松找到树根.内部遍历也和之前的遍历一样.
最后遍历出内容发现.得到的内容范围确实缩小了.只剩下了玩家.自己.NPC.怪物.掉落物
我们要细分就需要手动分析对象结构了.分别拿出一个类型,挨个对比发现,在便利的道德节点下
+14]+20]+8]表示的是对象的类型
+14]+20]+8]//分类标志//6其他玩家//4npc(4包含怪)//8自己//1凋落物//9珍兽
这个过程需要耐心思考耐心比较,过程很痛苦.

在二叉树遍历的过程中,我们需要对这个+14]+20]+8]进行判断筛选怪物

经过细化我们找到了,npc和怪物类型是4,但是该怎么区分npc和怪物呢?如果不区分的话打怪就会选中NPC从而出错.
我在结构中继续找,没有找到区分NPC和怪物的地方,那么只能能从另一个思路下手了.既然打怪会失败.那么会有什么提示呢.???进游戏看一下



他提示不能攻击此目标,进CE搜这句话



把这个地址放到OD中dd  然后下访问断点.再回到游戏攻击NPC,触发断点.看看是什么地方调用了它
断下之后点击一下上方的K按钮.调用来自都会显示出来



然后我们给所有调用来自主模块的地方下断点.这些地方可能就是打印不能攻击那句话的CALL
下断之后 运行游戏,先不要进行任何攻击,如果哪些断点自己断了就把他删除,说明这个地方不是相关功能CALL,(功能CALL不会自己没事乱运行)

然后选一个NPC攻击,这些断点回一次断下,按照断下的顺序,给这些断点12345编号排序



然后再选一个怪物进行攻击,发现他没有运行编号5的断点!!!!!!!
说明编号4内部进行了判断.重点分析编号4
问题又来了,这个函数的内部代码太多.那个地方才是判断呢.
我是用的方法是,头部下端,然后攻击NPC从上到下运行一遍,做一下标记
然后攻击野怪再运行一遍.找到他们那些代码运行了哪些没运行,没运行的代码前面的跳转就是关键判断,最后定位在了这个CALL.就是怪物NPC判断CALL
选中人物自身返回1,选中怪物返回0,选中NPC返回2
那么我们只需要把它添加进入二叉树中,把返回值为0的对象选出来进行攻击即可.



另外一件需要判断的事情是,打怪不能乱打不能看见怪物就上去打,为了考虑效率,先打距离自己最近的怪物,那么就应该在二叉树遍历中取出怪物的XY坐标和人物自身的XY坐标,计算出两者的X差值和Y差值,利用勾股定理计算出两者距离.需要注意的事情是,数据类型是float,不要写错,容易出错



//角色位置 float RX = *(float*)(Base1 + 0x2C); float RY = *(float*)(Base1 + 0x34); //怪物位置 float GX = *(float*)(Attribute0 + 0x1E8); float GY = *(float*)(Attribute0 + 0x1EC);                                                          //计算 float tempjuli = sqrtf(labs(RX - GX) * labs(RX - GX) + labs(RY - GY) * labs(RY - GY));


到这里,怪物筛选完成了,接下来是选中怪物的实现

选中怪物如何下手分析呢
我作为一个新手,目前能想到的起手方法就两种,
第一种就是利用发包CALL追功能.因为每个功能都会发包,只要从发包call往回走就能找到功能,但是线程发包除外,线程发包的话需要先追到线程外的数据来源,然后再往回追才是功能CALL
第二种是找突破口(简单说法),比如,我想找某个动作的调用call,可以先找到动作列表,然后得知某个动作的对象地址,然后给他下访问断点,使用动作时就会断下,然后可以追到动作.  再比如想追走路call,那么可以从人物的状态下手.静止不动可能状态为0,走路起来,状态改变,(一般改为1,也可能23456),最后搜索到人物状态的地址.那么给这个地址下写入断点,进行人物移动就会断下,就能找到功能call

我利用的是发包追CALL,为什么要用发包呢.游戏内的操作它是需要服务器去进行判断然后实现的,比如你打死了一个野怪,那么你需要告诉服务器你打死了野怪.

发包三大函数send sendto WSASend,ctrl+g分别输入这三个函数下断点,哪个正常断下就说明游戏用的哪个发包函数.如果ctrl+G找不到这三个函数,可以在函数名前面输入模块ws2_32.send这样去书写.





最后我们找到了,这个游戏使用的send发包.
在send函数头部下断点,然后回到游戏右键选中一个怪物,断点断下.
堆栈数据如图:



data就是他的数据包,size是他的数据长度,
因为根据发包函数往回一层层的追发现这是线程发包,那么就需要在data右键数据窗口跟随. 在2c范围内给合适的一行数据下写入断,(删除发包函数的断点),然后会断在一个地方,再次运行起来,选择一只野怪,又会断下,这个时候就可以不停的返回上一层,把所有经过的主线程模块CALL都下断点(这些CALL中存在的选怪功能CALL),然后运行起来之后把自动断下的断点删除.   再次选怪,后把所有断下的CALL都挨个分析,看看他们的参数,找一个适合使用的CALL作为我们的选怪CALL



最后确定了这个CALL比较好用,只有两个参数.第一个参数 push  1 第二个参数是目标ID.(在怪物对象下面可以找到)
然后传入ecx,就可以调用.

选怪功能完成了.接下来就是打怪

打怪同样可以用发包函数返回的方式找到一个技能调用CALL,只需要传入目标ID和技能ID就可以释放技能,但是这样找到的CALL会有距离限制,不会自动寻路.
技能CALL
push 0xBF800000
push 0xBF800000
push 0xBF800000
push 0x26                        //若是攻击技能,则为目标ID
push 0xFFFFFFFF
push 0xFFFFFFFF
push 0x0                        //技能ID
mov ecx,0x2C72DBA0        //[[[1DDA0D0]+128]+1b4]
call 0x01728470                //GAME.EXE+408470并且在调用这个技能封包CALL之前你需要先确定自己的技能的ID,需要遍历技能背包.因为有太多局限性,还需要寻路,我们暂时不用这个去打怪.我们可以使用按键CALL打怪.

让游戏内自动按下F1实现调用技能,这样的好处是按键之后他会自己跑到打怪的距离内.不需要我们再去计算距离.



下面写一下按键CALL的寻找方法.

前面我们用的发包法,这里我们利用突破口.按下F1之后能不能用他会去判断F1上面有没有技能.,我们不断的改变F1上面的技能得到F1-F10的数组
打开CE,F1放上一个技能搜索未知初始值



切换技能位置搜索变动的数值.



移走技能搜索0



重复上述步骤,将最终得到的几个结果分别放到OD中dd一下,然后下访问断点,之后实用技能访问他们.
和前面的找CALL方法一样,在断下的地方开始返回,每个返回得到的CALL都有可能是按键CALL.
接下来分析剩下的断点的参数.找一个最合适的CALL作为按键CALL



最后定位在这里,只需要传入一个1和一个下标(0-9)(F1-F10,C语言下标从0开始)就可以调用技能了.

到这里打怪功能已经实现了,我们需要吃药,可以把药品放在技能栏,检测到血量低于多少时按一下相应的键位.(其实正常来说外挂作者也会找到相应的吃药CALL,这样按键偷懒了)




<hr/>通过以上的流程分析,大家也明白为什么无法杜绝外挂的出现了.因为数据在你本地,你的电脑你做主.同时提醒各位读者,学习技术请用在正确方向.本教程仅作技术交流,无任何恶意用途.

维护软件安全需要大家一起努力.

本文章仅限于交流,如果本文章侵犯了贵公司权益,请联系我删除。

欢迎大家评论留言,第一次发表文章,没有什么经验,希望能得到大家的点赞.

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2023-3-11 21:29 | 显示全部楼层
除去照搬现有代码的,国内当然有很厉害的外挂团队。
听反外挂的同事说这些团伙都是非常有组织有纪律的,而且跟一般公司一样有产品经理和研发(但是真正的核心开发者往往是神龙见头不见尾的,也是为了自身安全考虑)。同事说曾经对抗一款外挂,每次都是周末上线新版本,而且专挑下班的时间上线,鸡贼的狠(于是可怜的安全组同事只能下班回家后返回公司对抗外挂)。
并且,因为外挂的特殊性,通常反外挂也只能以防御为主,非常被动。你完全不知道外挂可能以哪一种方式来破坏你的游戏客户端。比如某射击端游出现了一款透视外挂,经逆向分析发现透视原理是修改的D3D状态机的DepthTest,关掉深度测试后所有的敌人都显示在了画面上面。后续安全相关的同事针对D3D Hook做了诸多保护,检测虚表、检测inline hook,甚至于监控了所有高危函数,这意味着简单的注入D3D的操作会被反外挂系统侦测到(比如在绝地求生中注入DX11修改虚表会直接导致账号被封)。然而坚持了没多久,类似的外挂却又出没了,这回他们发现外挂作者通过Hook EnterCriticalSection绕过了检测(因为DX9 API内部的一些函数会进入临界区,通过Hook这一函数进入了函数执行的上下文,从而可以干自己想要的事情)。
可以说外挂开发的攻防战需要的不只是技术功底,同时还需要很大的脑洞。就好比吃鸡最近出现的路飞挂,做透视外挂的都知道可以读取玩家的骨骼信息并表现出来,但是有谁想到把这个骨骼信息修改下就会出现这种非常搞笑但是又粗暴有效的效果。
尽管大家都对外挂不齿,但是对于这样的核心开发者,我多少会抱有一些敬意。而这样的人才,也有不少被招安成为外挂对抗的一份子。
发表于 2023-3-11 21:39 | 显示全部楼层
利益相关。10+年开挂经验,接触过外挂作者(国内国外都有)。手机码字,较乱,有问题留言。


PS:本人真的不出售外挂,一切真的均来源于网络,真的均为道听途说!相信我!不要私信我了!(手动滑稽)


pps:插一个小故事。当国外制作者们还想着怎么破解游戏绕检测,能实现自动瞄准的时候,国内的外挂制作者们已经贴心的为顾客准备了主播定制版外挂。游戏界面分屏,给观众看的是一个画面,自己看的是透视画面。并且外挂作者们很贴心的加入了小地图和M键地图中加入透视,地图上每个小红点都是一个人。加入了透视物品(可以选择看什么物品)直接用蓝点显示出来,落地必然98k。观众也不傻,鼠标跟着头移动也知道你开挂啊。没事没事,枪法烂无所谓,作者们制作出了魔法子弹功能,子弹自动跟踪爆头,只要打在人物模型一定范围内就行~我就是想屠杀,不想走路怎么办。好说!子弹穿墙穿越山体,你就站在原地开枪就行,直接能击杀800米外厕所里面的人,这样也无聊的话可以开启吸星大法,直接将对手抓到您的面前被您屠杀。那…我也容易被偷袭致死啊…好说!无敌锁血,飞天遁地无所不能!总这么屠杀没意思了怎么办…也行啊,11月5日新更新的隐身外挂,让对手死的不明不白,让您拳头吃鸡!(手动滑稽)
“据说”主播定制版每月销量约为200多份。如果自己玩肯定不会买主播版啊~大家可以去各大平台看看一共有多少主播,然后算一下主播开挂的百分比…直播的半壁江山被开外挂的主播霸占真是毫不夸张。


首先先回答题主的问题。中国外挂制作者厉害么?答案是确实很厉害。但是这并不代表国外顶尖的外挂制作者并不厉害。
这个问题可以这么来看。就像是做一个精美的工艺品。国内外挂制作者采用的是规模工业化的模式,每一个步骤都有成规模的团体进行研究,最后交由专人打包出售。同比而言国外的外挂更像是小作坊模式,顶尖的手艺人(外挂作者)能做出看起来一样,甚至有些时候看起来更加精细的物品,但是论规模论效率国内的外挂产业简直能爆出国外100条街以上。热门游戏更新,检测更新。作者可以保证6小时之内出新版本正常发售,我所知道的国外工作室没有一个能做到这一点的。总而言之,感觉国外的外挂产业还停留在爱好者层面,国内的已经开始产业化了。
我开挂至今也有10年了。从最开始的金山游侠修改单机游戏,也经历过后来外挂最猖獗的dnf和csol时代,再到现在的lol守望先锋等等…没有一个游戏是完全杜绝外挂的。可以这么说,外挂是和病毒很类似的一个东西,一个游戏发行的时候只能尽量杜绝简单的外挂,然后等外挂出来了之后再去研究外挂的方式,然后封禁漏洞,走这样一条路。完全没有外挂的游戏需要所有的计算产生在服务端,pc端基本只产生一个接收作用。有这样的游戏么?有的。棋牌类的游戏基本都是这样,比如你开挂了不能天胡不能马走田象走日。fps游戏很多计算发生在本地。这也是fps游戏外挂屡禁不止的原因。
按照技术含量来看,外挂分为几种。一是破解无检测单机游戏(红警,cs本地版)。破解最简单。类似八门神器,金山游侠都可以修改。技术含量较低,因为只涉及到修改本地文档的部分,而计算机权限较广,很容易破解。
二是脚本类。脚本类技术含量最低,功能最次,封号概率最低(如果不提取内存)。小学生没有任何经验均可写出来,如自动吃药,打开脚本检测你的血槽上一个点的颜色,是红色不吃药,是白色吃药,原理就这么简单。按键精灵可以做到如qq炫舞自动perfect,炉石传说自动上分(优先法术打脸,优先出怪,有嘲讽打嘲讽。后来的智慧型脚本增加了算法,但是论技术含量还是很低,涉及点深度学习的东西)。但是这里注意,之前有大神号称通过按键精灵的手段开发出了lol自动躲技能辅助,百分之百出现神走位,任何非指向性技能根本打不到,当画面中出现一个飞行技能,系统会自动做出走位判断,同样的机制还有当普攻能打死小兵,小兵会发光,自动释放技能消耗对手。能闪现r死可以一键斩杀…。后来另有大神通过这个思路重新打了一个包开始出售,也有了后来“lol主播蛋糕揭秘外挂BOL小苹果,外挂使用者打到了国服第二”的新闻。
三是检测弱的网络游戏。某些韩国网游真的惨不忍睹,之前玩的一个游戏,只要把客户端某个文档用txt打开,修改几个0和1,就可以神挡杀神佛挡杀佛了。csol当初某个文档0改为1,就可以把生化武器带入爆破模式使用。游戏防挂方面真的菜得很。
四是疯狂检测宁杀一千不放过一个多手段多检测并且还疯狂更新的游戏。对,我说的就是腾讯的TP。腾讯的防封真的可以算是世界前三(个人感觉是第一)。其实想编写一个外挂很简单。CE修改技能代码全屏大爆炸不是梦。

技术含量在哪里呢?防封!!!

在dnf火爆那些年,dnf外挂和腾讯的反外挂部门打起了莫斯科保卫战。我提几个名字你们可能都还记得,dnf科比,dnf血刃,dnf宝马…在外挂的高潮时期各出阴招,你这边禁止注入,我那边输入法注入。你这边封禁输入法注入漏洞,我用迅雷白名单注入,你这边修改检测方式,我套双层壳三层壳注入。游戏检测异常伤害了,我修改武器强化,武器强化31,按你的逻辑还是无限秒怪。你这边人物伤害检测了,我这边无限召唤人偶,用人偶打怪自己不动手。人偶系统下线了,我这边修改药品给自己攻击力+999。你开始暴力检测人物单次伤害了,我这边加速器一秒999刀单次伤害还是不触发检测。又封了之后,我可以使用npc的武器自带无敌光环…在dnf的那几年真的是一个野花盛开的年代,最疯狂的一天我记得游戏还了6种检测,外挂在检测更换的30分钟内更新好,一天更新了6个版本外挂,最后还是可以奔放。数以万计的外挂爱好者(有些不为了盈利,虽然为了盈利的很多,dnf外挂周卡50到100,一周卖几万份的话…)均以突破腾讯检测为荣。练兵,就是这样练出来的。
时光荏苒。dnf检测不再是腾讯的重点。现在dnf已经开发出来了脱机挂。什么是脱机挂?游戏界面黑屏,角色进去之后自动刷图自动拾取金币自动上架拍卖行,疲劳清空之后自动换下一个角色。


(亮点在右下角红色字,还有屏幕右下角的时间)


在利益的驱动下,在腾讯的安全投入不断增多的情况下,在法律监管不严的情况下。国内外挂黑产真的是练出来了一只铁军。现在的外挂产业化。作者作为食物链顶端。写核心源码。永远不透露自己真实身份,可能某天作者的qq就再也不曾亮起。也可能你下一个找到的作者和上一个作者是同一个人而你毫不知情。之后是分销商。分销商拿到不同作者的源码后包装成不同的外挂,交给渠道商。渠道商建站,建卡盟,出售给代理商。代理商也就是大家平时能找到的“老板”。在这个产业中因为作者很多,作者其实拿不到很多钱,大部分钱被渠道商收割。之前沸沸扬扬的糯米事件,使用的就是顺丰主播版,售价5000每月。渠道商提卡1500每月。



(黑色的是售价。红色的是渠道提卡价。一个售价5000元的主播定制版外挂,渠道提走3500,打包分一部分,作者的工作室一般只能拿走800左右)
蓝洞官方封的30多万号。数量如此巨大证明肯定是很多人是多次开挂(你爽了n天,没被封。才会二次购买,刚开就封号就没人买了)假设n等于15(真没有夸张)这样来看公开的绝地求生的外挂产业值约为3个亿左右。但是游戏有那么多款,还有无数没被封过号的…外挂产业已经很凶了…
绝地求生上线了。火爆异常。也是外挂们的狂欢。外挂制作者们为了抢腾讯网易的几块金子,拉锯战中经常被打的灰头土脸,仅仅偶尔打几个小规模的翻身仗。你给我一枪我埋个地雷,你排一个雷我抄起了身边的火箭筒…然后突然间发现身边出现了一个拿着长矛木棍,背着几大筐黄金的野人(绝地求生)。艹,那和tx干个屁啊,兄弟们抄家伙朝这边打!

外挂制作者们高潮了。也创下了蓝洞一天之内封禁15万账号的记录。

在不断的进化,市场竞争中。活到现在的工作室没有一个很简单。要么掌握渠道,要么掌握很多作者联系方式,要么自己技术真的很强。

经过这样的发展…你说,中国外挂产业强么?

诸位看官,感觉还不错可以点个赞!感谢作者也是对我的支持!更可以点个关注不迷路!选哪个都行(再次手动滑稽)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2023-3-11 21:40 | 显示全部楼层
2019.11.27更新:
最近突然翻到这个问题,看到楼下有个匿名答主对我的内容挨段批判了一番,所以解释一下:
我没有歧视什么国内外技术高低的意思,都是实事求是地说,也没有提到什么技术不好。我学习的资料都是从UC获得,问的问题都有人很友好答复我。我夸一下它的社区氛围不过分吧。其次是我对国内的开发者的能力都是持肯定态度的,我只是举例子说明了开发门槛高低的问题,所以我从产业链上说明一件事,想表达的是外挂开发这件事不都是那些非常顶尖的大神在做,也有很多新手可以做到。怎么到你这儿就变成了我在暗示中国开发者没能力了呢?
我只是希望技术不分国界,跟什么国家没关系,我说国外某社区氛围好,并不是说他们技术比中国厉害,学无先后,达者为师,取长补短,认清自己的不足才能进步。
另外我并不是做安全的开发者,有很多人回答得比我好,也更加回答在点上,我都是虚心学习,不要搞这些有的没的,动不动就挂人,年轻人能不能纯粹点呀。
<hr/>以下为原答案:
前段时间曾经在开发吃鸡的外挂(学习研究用途,纯属兴趣),后来反作弊机制更新后就没再折腾。那段时间都泡在国外的UC论坛里,暂且不评价中国制作外挂是否厉害,这里从技术角度客观地说一下我的观点。

国外的外挂制作技术厉害吗?
在这里重点提一下unknowncheats, 简称UC. 这是一个关于外挂、逆向等技术的论坛,类似国内的看雪,但他们对外挂技术的专业态度以及良好的氛围,让人好像发现了新大陆。在吃鸡这游戏的版块里,不管是BE Bypass(绕过吃鸡的第三方保护服务BattlEye), 还是透视、自瞄,都能找到很好的思路。

当然,公布出来的BE Bypass可能已经被检测到了,而且大家一致潜意识不会把有效的BE Bypass公布出来。但对于一些可能已经失效的bypass, 大多数人都会选择公开源码。

让人惊讶的是,他们还专门为制作外挂的新手准备了非常不错的入门资料,包括教你如何调试,如何找游戏的模块基地址,另外还专门制作了一张指针关系图,告诉你关于UWorld / Entities / Camera之类的偏移量,可以直接通过他们提供的指针偏移量读取内存拿到摄像机的矩阵,可以直接拿到周边单位(敌人、载具、空投箱等)的坐标,通过这些可以很轻易实现map-hack, 也就是我们说的“透视”。并且这个指针关系图会定期更新,几乎是在游戏更新之后的5小时内就会有人发布新的内存地址。所以外挂作者几乎不担心内存地址的更新了。

另外吃鸡整个客户端的结构代码都被dump下来导出为SDK并且开源在Github, 只要包含头文件,就可以轻易用于开发吃鸡的外挂,包括Vector3等通用的Utils类定义。也可以直接通过读内存然后写入到Player的实例里,因为Player里定义的字段完整对应了读出来的内存结构,在每个字段还注释这个字段的偏移量。

在这种条件下,制作吃鸡的门槛已经变得极低,只要有一定的开发能力似乎就可以做到,并且大家似乎都乐于开源自己做好的外挂(虽然也有可能是已经被检测到的),包括覆盖窗口的实现,绘图,内存读写,几乎都是从Github Clone下来就能用。所以回到问题,国外制作外挂厉害吗?答案无法直接给出,但可以说,这种对于外挂开发的社区氛围绝对是独一无二的。

中国制作外挂厉害吗?
前些时间制作吃鸡外挂的时候,我也专门研究过国内市面上的其它外挂。发现大部分都是易语言写的,甚至从制作程度上看,作者可以说几乎没有像样的开发能力,因为不仅界面画的难看,就连联网验证都做不好,随便抓几个包就能做中间人,并且免费用他们的外挂。而且他们依仗的只是一个DLL, 主界面程序除了负责联网验证、充值之类的功能外,唯一的作用就是通过调用LoadLibrary去加载这个DLL, 然后外挂的功能就生效了。

基于这样的猜想,一个像样开发能力都没有的人,有可能做出吃鸡外挂吗?从我的角度分析,应该不能。至少说他们没有能力不借助别人的资料,自己从头到尾去逆向分析内存地址,自己实现自瞄算法,甚至他们都没搞懂自瞄为什么要通过调整摄像机的FOV进行,不知道世界坐标跟屏幕坐标之间是怎么转换的,但没关系,他们会有自己的渠道去拿到那个DLL,甚至是源代码,他们依赖自己的方式,每天入账过万,甚至数十万,你是不是很气?

那么,中国制作外挂厉害吗?我可以回答厉害。即使抛开大多数国内的外挂作者的编程水平不说,但他们在这种环境下的作战经验,并不是在正儿八经行业待着的程序员能比的。因为他们有很多奇技淫巧。例如吃鸡实现透视,在不入侵客户端进程的情况下,无法通过hook dx实现,那么这时候一般会实现一个透明的窗体,覆盖在游戏窗口上面,然后通过在上面绘制框架或者骨骼实现透视效果,他们绘图可能用的是GDI+,导致窗体上的图形不断闪烁。然后看到外挂的说明文件有这么一段描述,只要打开迅雷(迅雷可能做了一些骚操作,可以一定程度优化顶层窗口闪烁问题),就可以解决闪烁问题。当时心里惊叹,居然还有这种骚操作!

其次是关于外挂进程隐藏,国内早期做外挂的时候曾经利用输入法注入,但如今这种方法几乎过时了。而在吃鸡上,有些外挂还会通过注入explorer, 注入yy语音, 注入迅雷之类的,被BE加入了白名单的模块去隐藏自己。

另外大多数外挂用的验证系统居然是同一个第三方提供的模块,API是一模一样的。我们可以想象,国内的这部分产业可以说是相当的成熟,他们甚至不需要自己有过强的开发能力,就可以把这么个东西工业化,而不知道的人会认为外挂作者都是大神,其实未必。
发表于 2023-3-11 21:47 | 显示全部楼层
外挂并不是逆向技术的唯一的用途,在回答里也说明了,我并不支持外挂。技术是一把双刃剑,用在什么地方在于人。仅回答问题,保持客观中立。
======================
现在国内辅助开发者,大都是早期跟着手段龌龊无比连PG都敢Patch的腾讯游戏TP摸爬滚打多年熬出来的正规军,很多都是杀毒软件公司的前员工,还有很多纯粹的技术爱好者。
早期从输入法注入到LSP注入,再到驱动注入,只要能注入不惜单独写内核模块插APC,甚至内核重载,VT调试。连DX的SDK库都不需要引用,靠纯内联汇编来实现坐标投影变换,各种为了对抗TP创造出的各种黑科技Hook,手写Naked函数几乎没有特征,为了缩小体积隐藏自己连Shell code都用上了,对抗PUBG还不是如鱼得水。很多国内的土办法虽然写起来可能并不稳定,但对抗一个非本土游戏确实很有优势。
一般都是一两个作者找数据写程序,加上网络验证和保护壳,这些都有成型的完整解决方案,毕竟有钱赚就有人做。用注册充值或者激活码的方式限制使用,这样就可以招代理代卖,挂在发卡平台上,用黑身份注册,充值卡买黑支付宝收款,拿到钱以后去菲律宾菠菜平台之类的提现洗干净,以虚拟物品等方式转回国内。
外挂也分面向个人玩家的和面向工作室的,显而易见面向个人风险高,但是赚的可能也会很多。面向工作室多数是那种打金挂或者自动模拟操作的辅助工具,淘宝上有专门为了这种模拟而做的视频转接(图像识别)和u盘大小的键鼠盒子来模拟真实操作。外挂这个产业实在太大,每个环节都有一拨人,竞争激烈,有的环节是完全合法的,比如发卡平台。由于国内缺少游戏分级制度,中国在游戏发布上的审核非常落后,没有分级就意味着全年龄,这样很多优秀的游戏作品被挡在国外,直接导致外挂泛滥时,这些非本土游戏开发商却无法通过正规法律途径解决问题(如腾讯的做法)。
外挂核心逆向技术其实大都是跟老外学的,知名的比如mpgh和uc论坛,毕竟国内很少有看雪这样优秀的平台供大家学习,多数都是看一些小工作室出品的教程入门的,不过在一些方向上国内的的技术确实是青出于蓝。老外大多喜欢玩那种从引擎层面就开始操作的多功能的外挂,而在国内,多数玩家只需要有基本的透视自瞄就够了,花哨无用的功能最终是被市场淘汰掉的。本身功能少,检测面小,再加上腾讯教的一些比较猥琐的技术,越来越难检测。国内的逆向技术经过多年发展,其实也是很厉害的。单独说某国厉害这种事个人觉得没有意义,也不要妄自菲薄。
另外很多玩家只是看到了在游戏里被外挂虐到死。外挂也是一项技术,逆向分析有多精彩,怕是只有玩过的人才感受的到,而逆向技术也并不仅限于外挂本身。本人不支持外挂,但支持对逆向技术的探索精神。
未知攻,焉知防。
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-5-6 20:01 , Processed in 0.096426 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表