首页
社区
课程
招聘
[原创]关于网络验证破解的一些思想的总结(协议级分析)
发表于: 2008-11-25 15:11 54537

[原创]关于网络验证破解的一些思想的总结(协议级分析)

2008-11-25 15:11
54537
沉淀太少,不敢多言,其中有很多成果属于我的一位故友finger(可以说大部分),由于他时常比较忙,所以我想又我来发出这篇总结,技术含量不高,意在抛砖引玉.

昨年,有很多人想去破译别人的游戏外挂,也有更多的人最终失败.为什么失败的人比想去破译的人还多呢?因为有很多人他们不想破译,而是直接想拿到成品,换句话说,他们就是请人去破译的人.

是啊,其实这个逻辑很简单,A找B去破译,B失败了,那么A自然就失败了.想去破译的人是B,而A只想得到个结果而已.

其实,这个是一个最简单的协议.

为什么要讲这么多呢?放心,看完前边的东西会对你后边的理解有莫大的帮助.

首先我们来破译我们前边立出的那个最简单的协议.那个最简单的协议的流程大概是这样的:

A  找B 破译
B  破译  成功告诉A,失败告诉A
B成功,A成功.B失败,A失败.

好OK,这时候,我们进入下一轮的思考,我们在A和B之间穿插C,A通过C,找B,B返回给C,C再告诉A是否成功.------很显然,C的功能就是个代理的功能.

那么如果我们让C欺骗A,B的破译是成功的,那么很显然,A会认为B的破译是成功的.

是的欺诈!~~~恩,我们来谈谈欺诈这个很基础的思想,在网络验证中的一些简单的用法.

对于游戏外挂这个东西.大多协议和执行流程是这样:
情况1:

外挂首先连接外挂验证服务器.

然后外挂验证服务器返回成功或失败.

成功,外挂就会去连接游戏服务器,进行外挂功能扩展.

好谈到这里,我们就知道,一个很明确的概念,外挂验证是外挂验证,游戏验证是游戏验证,他们两个是丝毫没有关系的.唯一的存在的关键就是外挂验证成功,那么外挂功能代码就会执行.

好了,外挂验证和游戏验证就存在一个A和B的关系了.

这时候,我们就开始在外挂验证和游戏验证中穿插个C.相当于一个代理嘛.其实就是个欺诈点嘛.让外挂验证结果告诉C,在让C告诉A是否成功.

怎么穿插这个C呢?大概很多人都会想到以下几招:
1.在外挂程序代码里,关于外挂验证的那断进行HOOK(HOOK是什么,HOOK是挂接),这样的方法建立在分析完外挂程序的基础上.
2.在外挂验证的封包上进行截获,实现协议级的一个代理.从封包层面让外挂验证成功.这往往需要分析出其外挂验证的具体算法.
3.建立在二的基础上,但是却不需要分析完外挂验证的全部数据,而是直接返回一个固定的成功包.

-------------------------------在这里,我谈谈,网络验证的流程.有个很简单的逻辑是这样的:正确的帐号+正确的密码 = 成功的封包.
-------------------------------在这里,我再谈谈封包的截获.方法1:从写WS2_32,挂接connect,send,recv.(写很多代码)
2,加密与解密3的DLL劫持技术.(都没仔细看,不知道是不是和方法3是一样的)
3.其实可以直接用OD改WS2_32的connect.让它connct到本机的某个端口,再写个服务器监听那个端口,那个服务器的作用,就是接收,转发.具体的做法入下.

1.OD载入ws2_32,并找到connect的入口

71A24A07 >    8BFF          mov     edi, edi -----这里是我机器上的ws2_32的connect的入口
71A24A09   .  55            push    ebp
71A24A0A   .  8BEC          mov     ebp, esp
71A24A0C   .  83EC 18       sub     esp, 18
71A24A0F   .  57            push    edi
71A24A10   .  8D45 E8       lea     eax, dword ptr [ebp-18]

用5个字节在前头写个jmp 到xxxxxx,----跳到ws2_32.dll的缝隙,(HOOK API基础),然后写上这样的逻辑流.判断connect地址,如果是外挂验证服务器的地址,就连接到本机.(这里我就不写了.具体查看别人的文章,HOOK API和PE文件).在做之前,一定要改一改ws2_32.dll的pe文件属性,保证你跳到的地方,添加的代码可能执行.最后再用OD的功能,保存到可执行文件.保存之,就改好了,很省事.

好,到这里,我们就可以把外挂验证连到本机了,这时候我们写一个程序监听发送到本机固定端口的数据.监听后后,再转发给外挂验证服务器.其实这个过程相当于HOOK了send和recv.

这时候我们去买个正确的外挂帐号,很显然,发送一个正确的外挂,帐号和密码,到外挂验证服务器很显然,其会返回一个正确的包回来.好的,我们把这个正确的包的数据保存起.

存在我们那个中转的server里.然后再用一个错误帐号,去登陆,当然会返回一个错误的数据,这时候我们就在那个中转的server里把返回的错误数据换成正确的数据.........那么外挂就截取了一个成功的包.恩,成了.外挂认为成功了.

呵呵!~~~其实这种可能性很微弱.因为外挂可能存在帐号名字的验证.比如是用户名aaa的成功封包不等于用户名BBB的成功封包,恩,这很正常.

好了,我们来把这微弱的曙光稍微变大一点,情况二,就是其外挂验证有用户名信息.这里说一说下边几种情况,外挂验证在建立TCP连接验证并返回封包后,持续保持连接,如果出现相同的用户名再去连接外挂验证明服务器,那它就断开连接.它这样做的目的,就是一个帐号,就只有一次登陆.

OK这里就扯蛋了,漏洞就在这里,如果,我们用一个代理去连接外挂服务器,然后我代理只跟外挂服务器建立一个连接.然后用代理,来不停的返回给外挂成功信息.

我日,这不就成了.是啊,一个用成功的用户名和密码,就能让无数个外挂跑起来了.恩不错.就是这样.

实际这样容易破的外挂,确实还真的很少见.曙光依然很微弱,比起刚刚那点只强烈了点点.因为实际上大多数外挂验证的时候,别人都会在封包里加一个随机变量,一般是4个字节.Dword.

随意每次每次返回相同的成功封包,这招行不通啊.别个有随机啊.我们的招的前提,就是要每次返回相同的成功封包.

好了!~~无论多么牛B的验证方式,都有他多么牛B的破法,关键问题,我们怎么去思考一些问题.

好,这里给出一种思想让我们复用刚刚那招,返回同一个成功的包,我们必须得分析那几个随机变量的地址,然后把他们写死.

遗憾的是,大多数同志都战死在某某某强壳那里,根本就无法找到那4个字节的地址.

这里我就不谈能脱壳的程序怎么找随机变量了.我主要谈谈不能脱的时候怎么找.

方法1,很体力,很体力的过程,4个GB的内存地址,在每次send之后就写一段数据,如果随机变量是封包验证的关键,那么,用一个成功的帐号,发送一个成功的数据后,我们又把它的随机变量写之了,最终导致它,recv之后的验证,为失败.很明显,我们给了钱的,但是因为我们把随机变量写了,它就会觉得我们没给钱.

---------这样的方法,要在4个G的内存中用排除找发.很黄,很暴力,也很累.

方法2.直接观测封包,一般情况,封包的算法不会太复杂,其变化会有一定的对应过程.恩,咱们直接看.凭感觉找.这个不好说,要跟到fell走.然后找出一些细节,根据接受,改变封包的返回.(这样的的希望大多也很渺茫)------------其实封包的分析的关键,在于分析其内部的数据,大多都是有规律可寻的.很多时候根据具体情况具体处理.

-----------------------------------------------------------------------------到这里,对于不能脱壳的程序,用封包去破译的思想就到这里了----因为很活,也不好说.其实,思想就一个,封包欺诈.

---------------------------------------------------------------------------------------------------
这里我谈谈能脱的程序,杂破网络验证.

我这人贼懒,不习惯去逆别人的算法,硬去逆算法我会觉得很受不了,这也许是我一直很菜的原因.在这里要感谢finger,感谢那些脱壳脚本研究者,感谢党,感谢祖国的人民.或许没有他们的研究,就永远走不到脱壳后的的程序如何破解这写谈论上了.因为,我确实从来没用心去研究过壳这东西.深感惭愧.

外挂的验证方式千奇百怪,比如说昨年的那个天堂二天行者外挂,它大概的做法就是,外挂帐号,就是游戏帐号,验证后后就直接断开...你想麻,同一个游戏帐号不可能连续登陆两次三.

方法1:去把它的验证算法逆完.然后自己写验证服务器.(恩,我没有这样做)
方法2:分析验证流程,找到一个关键点,换帐号.这个手法的关键是,找到程序里的关键流程,在外挂验证的时候,用一个收了钱的帐号去验证.但是在游戏验证的时候就把那个帐号换成你真的要登陆那个帐号.

哎呀,我的妈呀!~~那多困难啊.很多人可能会说.(我日,这就是最简单的办法了.)....这样做的话,就能用一个帐号,登陆无数个帐号啊.

好了,再来谈个例子昨年有个www.51wg.net,出了个外挂,叫三国群英Online的外挂,脱机的,它更牛B,它会把用户数据在每次地图切换的时候,做一次数据验证,....恩,昨年的时候,根据我的分析,直接在它每次进行地图切换验证的时候,直接去把那个用户名换成个给了钱的用户名就KO了.

这个招的关键就是,外挂验证后会立刻断开连接.

--------------------------------------------------------------------------------------------------------
再谈一个外挂,我当时看我朋友分析了分析,那外挂,定时用UDP发数据去验证,那壳又脱不掉,就那TMD壳....就是那个R2啥啥啥的.最后把那个sleep给他怎成永远,它的验证就各屁了.一般别人会开个线程,while(TRUE) sleep(1).等待接受数据.
------------------------------------------------------------------------------------------------------

到这里,我大概阐述的也不是太清楚.其实关键就是,协议分析,然后根据协议分析得到的结论进行协议级的欺诈.

像我们的生活样.欺诈无处不在.所以大家一定要当心.

................无论写多么牛B的保护,不过大家在写之前,一定要把协议和顺序理一次.这样才可能事半功倍.否则会被猥亵的.

-------------另外,某知名游戏保护...也存在思想上的漏洞....不过也是我朋友告诉我的,也不知道是不是.

完毕,很仓促,还有工作要完成.

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 7
支持
分享
最新回复 (83)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
恩,听起来不错,不过没有做过,先记下了....
2008-11-25 15:50
0
雪    币: 513
活跃值: (2258)
能力值: ( LV9,RANK:2130 )
在线值:
发帖
回帖
粉丝
3
up,文字写了很多,我就怕打字 
2008-11-25 15:50
0
雪    币: 213
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
OKBUZUO
2008-11-25 15:52
0
雪    币: 251
活跃值: (25)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
5
一上线就看到好文章
2008-11-25 16:09
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
已阅。
2008-11-25 17:12
0
雪    币: 163
活跃值: (60)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
7
不错,............
2008-11-25 17:35
0
雪    币: 282
活跃值: (31)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
网络验证要结合服务端计算
2008-11-25 18:35
0
雪    币: 136
活跃值: (105)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
9
顶一个 楼主的语言组织能力 也不好 不过比我强
2008-11-25 18:42
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
rep     movs byte ptr es:[edi], byte ptr [esi]
2008-11-25 20:04
0
雪    币: 65
活跃值: (811)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
11
顶一下,,最近的原创文章貌似不多哦`~~
2008-11-25 20:34
0
雪    币: 67
活跃值: (66)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
12
多次尝试未见失败.

主要看服务器上算什么东西, 呵呵.
一些很核心的东西多数的破解的人都不会了解.

不过服务器上要对核心计算的部分做个计数 这样就知道有没有提交太多次运算的请求了
知道了这个就可以玩些有意思的事了例如等他大到一个量的时候封掉这个id,最理想的就是他又替换上一个id.如此继续.
2008-11-26 20:08
0
雪    币: 590
活跃值: (177)
能力值: ( LV9,RANK:680 )
在线值:
发帖
回帖
粉丝
13
打字太痛苦了
LZ辛苦
2008-11-26 20:28
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
膜拜下,呵呵,思路很好啊
2009-2-17 08:49
0
雪    币: 255
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
就是破hmac…………

写得有点复杂了。
2009-2-17 13:25
0
雪    币: 217
活跃值: (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
--------------------------------------------------------------------------------------------------------
再谈一个外挂,我当时看我朋友分析了分析,那外挂,定时用UDP发数据去验证,那壳又脱不掉,就那TMD壳....就是那个R2啥啥啥的.最后把那个 sleep给他怎成永远,它的验证就各屁了.一般别人会开个线程,while(TRUE) sleep(1).等待接受数据.
------------------------------------------------------------------------------------------------------

这算不算暴破啊....

好文章..学到不少东西
2009-2-17 14:13
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
学习……
LZ辛苦
2009-2-17 14:31
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
LZ写得不错,学习了,希望多有这方面的文章可以学习。
在看雪玩了几个月,才把“。。。。。。再来谈个例子昨年有个www.51wg.net,出了个外挂,叫三国群英Online的外挂,脱机的,。。。。。.”这个挂的壳脱了,本想做个本地验证,听你分析,难度相当大哦~~~
2009-2-19 17:22
0
雪    币: 157
活跃值: (416)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
19
嘿嘿,不好意思。本文提到的早用过了。以前破外挂。基本上都用这样的方法。
最有意思的是有一个外挂。有试用期。每次发送的数据。还是一样的。结果取一次数据。做个本地验证。只用了。半个小时不到。就破好了。
2009-2-21 11:56
0
雪    币: 136
活跃值: (51)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
绕了半天!总算是看明白了
2009-2-21 23:31
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
现在的外挂在防破解上做的很不错了,而且都向系统的低层核心发展,很多都采用了驱动.拦截封包是以前的做法,现在显然行不通.现在壳无一不是采用了虚拟机,想动态调试也不是哪么容易了.想要破解软件,在脱壳上必须有一定的功力.
2009-2-22 10:28
0
雪    币: 205
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
网络验证,太复杂了,
2009-2-24 00:45
0
雪    币: 474
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
辛苦楼主了
UP
2009-2-24 10:02
0
雪    币: 236
活跃值: (60)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
介绍了很多好的思路
2009-2-25 14:35
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
一直感觉网络验证内部分析很难,LZ思路确实不错,写的感觉有点饶。。。。
2009-2-25 20:47
0
游客
登录 | 注册 方可回帖
返回
//