首页
社区
课程
招聘
[原创]新手破解一个带网络验证的程序
发表于: 2010-3-14 02:34 11531

[原创]新手破解一个带网络验证的程序

2010-3-14 02:34
11531
【文章标题】:
【文章作者】:
【作者邮箱】:
【作者主页】:
【作者QQ号】: 17599228
【软件名称】: 名将XX
【下载地址】: http://wgqq.net/soft/show.asp?id=9299
【保护方式】: 通过调用webserver与远程服务器通讯进行的网络验证
【使用工具】: ODbyDYK v1.10[05.09]
【作者声明】: 只是感兴趣,没有其他目的。没有追到算法,只是分享经过,请各位指点

---------------------------------------------------------------------------

文件夹内有几个文件,分别是main.dat,start.exe

OD加载start.exe,退出,弹出软件窗口,OD下断CreateProcess,发现其打开的是main.dat,用UE查看main.dat,原来是个可执行文件被改名了,于是改名为main.exe。

PE查壳 ASPack 2.12 -> Alexey Solodovnikov
直接cooldumper搞定

开始分析
点击登录,出现MessageboxW,未注册用户,窃喜,bp MessageBoxW.
果断断住,看堆栈调用情况

0013F550   0065A066  /CALL 到 MessageBoxW
0013F554   007802CC  |hOwner = 007802CC ('三国哈哈1.17',class='TLoginForm',parent=018803B2)
0013F558   00C6F33C  |Text = "?,B4,"",D7,"",A2,"",B2,"嵊?,BB,"?
0013F55C   00C76544  |Title = ""D7,"",A2,"意"
0013F560   00000000  \Style = MB_OK|MB_APPLMODAL
0013F564   0013F93C  指向下一个 SEH 记录的指针
0013F568   00546D1F  SE处理程序
0013F56C   0013F5F8
0013F570   0013F798
0013F574   0044E700  dumped_.0044E700
0013F578   00BC67C0  ASCII "pkD"
0013F57C   00000000
0013F580   00000000
0013F584   00000000
0013F588   00000000
0013F58C   00000000
0013F590   00000000
0013F594   00000000
0013F598   00000000
0013F59C   00000000
0013F5A0   00C6F33C  ASCII "*g鑜孮(u7b"
0013F5A4   00C76544
0013F5A8   00000000
0013F5AC   00000000
0013F5B0   00C8AA7C  UNICODE "d00b-207dcdd2"
0013F5B4   00C8AA1C  UNICODE "D00B-207DCDD2"
0013F5B8   00C8AA4C  UNICODE "d00b-207dcdd2"
0013F5BC   00C8EC14  UNICODE "D:\sg117\script\"
0013F5C0   00000000
0013F5C4   00000000
0013F5C8   00000000
0013F5CC   00000000
0013F5D0   00CA581C  UNICODE "D:\sg117\upup.exe"
0013F5D4   00000000
0013F5D8   00CA57E4  UNICODE "D:\sg117\start.exe"
0013F5DC   00C8EC14  UNICODE "D:\sg117\script\"
0013F5E0   00000000
0013F5E4   00CA5774  UNICODE "D:\sg117\updata.exe"
0013F5E8   00000000
0013F5EC   00000000
0013F5F0   00C8A9EC  UNICODE "D00B-207DCDD2"

看到最后面几行有D00b什么的,是软件上提示的机器码。其他没什么营养,先放住不管。
可能我才疏学浅,认为这种外挂一定是网络验证的,所以也没去深究这个D00B什么的,既然MessageBox没看出什么端倪,换方法。

bp send, bp recv全部打好断点

点击登录。断下在bp send ,看发包data,是明文,如下
0013F2A8  |00C214F8  ASCII "GET Http://60.190.222.188:8000/wglogin/wglogin.asp?id=9D1669ADA23091A6F454E45991E4EB2258E2B2DF5B591B9EA8330EFCB1E3BCF8E6CA50C8AA1E6B98F7A78CB1449ADBF6DC2C2DECE8F09C85&port=8020 HTTP/1.1",CR,LF,"Host: 60.190.222.188",CR,LF,"Connection: Ke"...

好长的一段串啊,不管它查下堆栈很容易发现它的组包过程。
几个Unicode串摆在堆栈里面,是由之前的D00B-207DCDD2+我硬盘号+我MAC地址+一个时间数,然后看长度好像将这些参数组合进行了一次SHA运算,得出的这个串.当然这只是猜想,我认为没必要去跟组包的算法。毕竟网络验证都是通过回包的信息进行各种跳,各种逻辑的。

直接F9跑到recv这里看看,收包明文,如下

0013F274  |0110A048  ASCII "HTTP/1.1 200 OK",CR,LF,"Connection: keep-alive",CR,LF,"Content-Type: text/html",CR,LF,"Content-Length: 20",CR,LF,"Server: Indy/9.00.10",CR,LF,CR,LF,"REG:AAEDGWE29AB8C"

恩服务器回来的包很短REG:AAEDGWE29AB8C

分析一下发包的包值吧,每次发包相同值都是9D1669ADA23091A6F454E45991E4EB2258E2B2DF5B591B
不同点的地方在于后面,如果我每次把不同的值记录下来,发一样的,服务器是否会给我回一样的包呢,测试一下。

使用一次截获的包进行测试F7A78CB1449ADBF6DC2C2DECE8F09C85

013F2A8  |00C214F8  ASCII "GET Http://60.190.222.188:8000/wglogin/wglogin.asp?id=9D1669ADA23091A6F454E45991E4EB2258E2B2DF5B591B9EA8330EFCB1E3BCF8E6CA50C8AA1E6B98F7A78CB1449ADBF6DC2C2DECE8F09C85&port=8020 HTTP/1.1",CR,LF,"Host: 60.190.222.188",CR,LF,"Connection: Ke"...

服务器回的
结果两次完全一致
0013F274  |0110A048  ASCII "HTTP/1.1 200 OK",CR,LF,"Connection: keep-alive",CR,LF,"Content-Type: text/html",CR,LF,"Content-Length: 20",CR,LF,"Server: Indy/9.00.10",CR,LF,CR,LF,"REG:AAED1FAE8829AB8C"

0013F274  |0110A048  ASCII "HTTP/1.1 200 OK",CR,LF,"Connection: keep-alive",CR,LF,"Content-Type: text/html",CR,LF,"Content-Length: 20",CR,LF,"Server: Indy/9.00.10",CR,LF,CR,LF,"REG:AAED1FAE8829AB8C"

由此断定,服务器那边并没有随机算法。客户端和服务器端只有一方进行了随机处理,外挂并没有做双面的随机同步。

那么请各位大牛帮小弟分析一下这样做是否可行?
hook其Send Api,修改验证服务器地址,改写为本地
购买一个正版KEY,截获正确的发包收包的数据,记录
然后每次hook Send将包重组,发给本地服务器,本地服务器返回刚才截获到的正确回包值,是否就可以破解。

另外小弟想请各位大牛看看,我追到了一个地方,那个地方将Reg后面的值push进去,但是在里面没进行什么操作就ret了。不知道是不是关键点。

00426FB5    85C0            test    eax, eax
00426FB7    74 05           je      short 00426FBE
00426FB9    83E8 04         sub     eax, 4
00426FBC    8B00            mov     eax, dword ptr [eax]
00426FBE    8BD8            mov     ebx, eax
00426FC0    85DB            test    ebx, ebx
00426FC2    74 16           je      short 00426FDA
00426FC4    8BCB            mov     ecx, ebx
00426FC6    03C9            add     ecx, ecx
00426FC8    8B55 E0         mov     edx, dword ptr [ebp-20]          ; 将服务器返回信息给edx
00426FCB    8B45 F8         mov     eax, dword ptr [ebp-8]
00426FCE    E8 81C4FDFF     call    00403454

下了内存访问断追到这里。EDX里面保存着服务器返回REG后面的信息,但是不知如何追到比对算法,请各位老师指点

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 95
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
看看。。。。
2010-3-14 09:11
0
雪    币: 213
活跃值: (147)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3

那么请各位大牛帮小弟分析一下这样做是否可行?
hook其Send Api,修改验证服务器地址,改写为本地
购买一个正版KEY,截获正确的发包收包的数据,记录
然后每次hook Send将包重组,发给本地服务器,本地服务器返回刚才截获到的正确回包值,是否就可以破解。


通常都是这么做的
不过这个挂的壳。。。
2010-3-14 10:19
0
雪    币: 0
活跃值: (954)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
如果服务器随机传个KEY给你,本地验证起不是没用了吗?
2010-3-14 16:39
0
雪    币: 283
活跃值: (74)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
测试了,弄了一个KEY,模拟收KEY,本地好像有校验时间乱数的算法,但是还没找到
2010-3-14 19:09
0
雪    币: 191
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
看封包一样不一样用封包精灵0.6就好了,用od太复杂了吧
2010-3-16 07:59
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
是啥游戏啊,QQ的吗?
2010-3-16 09:55
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
哦,看错了,是3国的,呵呵
2010-3-16 09:55
0
游客
登录 | 注册 方可回帖
返回
//