如果网络验证没有很好的算法的话, 那么简直是给破解者开方便之门.
本文针对的就是一种简单的网络验证算法, 简单到  仅供一笑.

正文:

 第一次跟踪MFC写的程序, 着实给它郁闷死了. 到最后还是没有正面解决 :( 绕过了正面分析, 从后面突破.

这个软件分为两个版本: 1, 是普通用户, 免费但是打开的时候有一个弹出广告. 2, 是类似VIP的用户, 比普通用户多出几个功能. 两个版本分别有不同的客户端, 但是它们的数据驱动是相同的, 这就成为了我们下手的地方.我们可以大胆的推测, 从服务器上发下来的数据应该同时适用于两种不同的客户端, 如果侥幸的话, 或许我们甚至可以弄到VIP的数据, 当然, 如果倒霉点的话, 我们至少可以绕过那个开始的广告了, 而不用对主程序进行修改. 那么, 我们该如何下手呢?

要得到服务器的承认, 登录是必不可少的, 用Iris可以帮你嗅探到这些登录数据. (Iris是收费软件, 这里提供的是试用版的连接, 网上找的Iris有可能是其他奇怪的软件, 或者你可以找4.X版本的).
用普通账户在两个不同的客户端登录看看, 可以拦截到下面信息:

普通客户端

Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F

00000000 B0 00 00 00 1B 02 00 00 0B 00 00 00 63 68 6F 70 ?……….chop
00000010 64 6F 77 6E 00 00 00 00 00 00 00 00 00 00 00 00 down…………
00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 …………….
00000030 00 00 00 00 31 32 33 34 35 36 00 00 00 00 00 00 ….123456……
00000040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 …………….
00000050 00 00 00 00 00 00 00 00 00 00 00 00 02 00 00 00 …………….
00000060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 …………….
00000070 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 …………….
00000080 00 00 00 00 00 00 00 00 33 33 33 34 46 66 44 39 ……..3334FfD9
00000090 2D 33 41 36 42 00 00 00 00 00 00 00 00 00 00 00 -3A6B………..
000000A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 …………….

VIP客户端

Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F

00000000 B0 00 00 00 1B 02 00 00 0B 00 00 00 63 68 6F 70 ?……….chop
00000010 64 6F 77 6E 00 00 00 00 00 00 00 00 00 00 00 00 down…………
00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 …………….
00000030 00 00 00 00 31 32 33 34 35 36 00 00 00 00 00 00 ….123456……
00000040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 …………….
00000050 00 00 00 00 00 00 00 00 00 00 00 00 7B 00 00 00 …………{…
00000060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 …………….
00000070 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 …………….
00000080 00 00 00 00 00 00 00 00 33 33 33 34 46 66 44 39 ……..3334FfD9
00000090 2D 33 41 36 42 00 00 00 00 00 00 00 00 00 00 00 -3A6B………..
000000A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 …………….
> 这里服务器会返回一个登录失败, 非VIP的信号

果然如我们所料, 封包只有一个字的差异:) . 我们只要把VIP的客户端标识7B修改为2, 那么我们就可以用普通用户的身份大摇大摆的登录进去了, 唯一不同的就是, 我们的坐骑换了 

纸上谈兵容易, 做起来就比较困难了. 不知道各位对MFC写的程序是什么感觉, 反正我是觉得晕晕的, 所以一直没去研究它. 另外, 客户端和数据驱动是两个独立的程序, 相互依靠, 我们不能单独把数据驱动运行起来, 除非你掉头又去研究客户端. 那可是一个大工程了. 如果我要调试它, 只能用附加的方式进入程序. 昨天晚上我唯一的想法是….通过IDA的反汇编代码….找到客户端怎么样把标识符传进数据驱动程序的, 为此我付出了惨重的代价: 两杯咖啡. 而且一无所获 

今天清醒过来才知道自己很笨, 其实只要在数据发送的时候把 标志位修改不就可以了么   马上对socket的send下断, 来到

0043A121 /$ FF7424 0C push dword ptr [esp+C] ; /Flags
0043A125 |. FF7424 0C push dword ptr [esp+C] ; |DataSize
0043A129 |. FF7424 0C push dword ptr [esp+C] ; |Data
0043A12D |. FF71 04 push dword ptr [ecx+4] ; |Socket
0043A130 |. FF15 20664700 call dword ptr [<&WS2_32.#19>] ; \send

上面的Data就是保存了我们登录信息的地址了.在0043A121 再次下断, 重新点登录, 就可以知道是从哪里转跳过来的(这里是公共部分, 我们不方便下手修改代码):

00403EF0 . 8379 44 00 cmp dword ptr [ecx+44], 0
00403EF4 . C741 3C 00000>mov dword ptr [ecx+3C], 0
00403EFB . 74 11 je short 00403F0E
00403EFD . 68 33270000 push 2733 ; /Error = WSAEWOULDBLOCK
00403F02 . FF15 08664700 call dword ptr [<&WS2_32.#112>] ; \WSASetLastError
00403F08 . 83C8 FF or eax, FFFFFFFF
00403F0B . C2 0C00 retn 0C
00403F0E > E9 E0140700 jmp 0043A121

找到上面的那句. 修改如下

00403F0E > \E9 E0140700 jmp 004753F3

004753F3 > \C740 5C 02000>mov dword ptr [eax+5C], 2
004753FA .^ E9 224DFCFF jmp 0043A121

eax保存了封包的地址, 然后PUSH进堆栈, 直接加上偏移就是客户端标识了.  , 程序经过我们的乾坤大挪移往别处走了一下, 回来的时候, 我们已经把标志修改回2了  
经过测试发现功能基本正常, 相比普通客户端, 多了几个功能. 不过由于有些数据需要VIP权限, 所以