联创上网助手的简单分析
苏州大学独塾湖校区上网方式用的是802.1x拨号协议,不能用普通路由器实现共享上网,拨号软件是联创通信的宽带上网助手,其中加了反代理检测,不许系统有双网卡,不许有多个ip,也不许开代理服务器等违规产品,为了省上网费(1.2元/小时,抢钱啊。。!但是网速很快,是10M的),我决定对它的程序开一开刀!
PEID查壳,无壳!!VC++7.0写的。看来联创通信比较小看我们学生,这么大胆,居然不加壳!(其实最不能让我忍受的是它的密码加密算法实在太简单,这么简单的算法还不加壳。。。。)
(一)破解反代理检测
废话不多说了,用OllyDBG载入,bp MessageBoxA下断点,运行,点连接,这是拨号成功,然后大概过了1秒,程序断在
代码:
00406EDD |. E8 5E1C0000 call Dot1xCli.00408B40 ; 这个call是下线
00406EE2 |. 8B0D 2C9D4100 mov ecx,dword ptr ds:[419D2C]
00406EE8 |. 6A 00 push 0 ; /Style = MB_OK|MB_APPLMODAL
00406EEA |. 68 684D4100 push Dot1xCli.00414D68 ; |Title = "反代理激活!"
00406EEF |. 8D4424 0C lea eax,dword ptr ss:[esp+C] ; |
00406EF3 |. 50 push eax ; |Text
00406EF4 |. 51 push ecx ; |hOwner => NULL
00406EF5 |. FF15 20424100 call near dword ptr ds:[<&USER32.Messa>; \MessageBoxA ★断在这里!!
00406EFB |. 81C4 84030000 add esp,384
00406F01 |. C3 retn
这里出现反代理检测的对话框,我们向下运行,alt+F9,来到
代码:
00407922 > \8B8424 74030000 mov eax,dword ptr ss:[esp+374] ; Case 475 of switch 00406F8A
★这个分支是反代理激活消息号是475
00407929 . 8B8C24 70030000 mov ecx,dword ptr ss:[esp+370]
00407930 . 8B9424 68030000 mov edx,dword ptr ss:[esp+368]
00407937 . 50 push eax
00407938 . 51 push ecx
00407939 . 68 75040000 push 475
0040793E . 52 push edx
0040793F . E8 4CF4FFFF call Dot1xCli.00406D90 ; 这个call就是处理代码
00407944 . 83C4 10 add esp,10 ; 返回这里★
00407947 . 5F pop edi
00407948 . 5E pop esi
00407949 . 8BC5 mov eax,ebp
0040794B . 5D pop ebp
0040794C . 81C4 58030000 add esp,358
00407952 . C2 1000 retn 10 ; 这个分支就是处理的过程,我们直接跳过就行了
去掉这个分支,就可以破解了,但我们这里去找找它怎么发现我们有违规产品的。记下消息号为475,显然,程序用消息的方式来调用反代理激活。然后,点右键,选搜索,当前模块中的名称,然后选SendMessageA,选出消息号为475的
只有一个SendMessageA满足要求
代码:
00405FCA |> \33FF xor edi,edi ; 这里判断是否有违规产品; Case 7C of switch 00405CDA
00405FCC |. E8 8FBCFFFF call Dot1xCli.00401C60 ; 检测多网卡
00405FD1 |. 85C0 test eax,eax
00405FD3 |. 75 05 jnz short Dot1xCli.00405FDA
00405FD5 |. BF 01000000 mov edi,1 ; 有多网卡edi+1
00405FDA |> E8 51B7FFFF call Dot1xCli.00401730 ; 检测多ip地址
00405FDF |. 85C0 test eax,eax
00405FE1 |. 75 03 jnz short Dot1xCli.00405FE6
00405FE3 |. 83CF 02 or edi,2 ; 多个ip地址edi+2
00405FE6 |> 833D C89D4100 14 cmp dword ptr ds:[419DC8],14 ; 检测proxy代理
00405FED |. 7C 03 jl short Dot1xCli.00405FF2
00405FEF |. 83CF 04 or edi,4 ; proxy代理edi+4
00405FF2 |> 833D CC9D4100 02 cmp dword ptr ds:[419DCC],2
00405FF9 |. 7C 03 jl short Dot1xCli.00405FFE
00405FFB |. 83CF 05 or edi,5
00405FFE |> 85FF test edi,edi ; 判断是否有违规产品
00406000 |. C705 C89D4100 000000>mov dword ptr ds:[419DC8],0
0040600A |. C705 CC9D4100 000000>mov dword ptr ds:[419DCC],0
00406014 |. 0F84 CB010000 je Dot1xCli.004061E5 ; 没有,则不发消息,爆破点★改为jmp,爆破
0040601A |. 8BB424 1C010000 mov esi,dword ptr ss:[esp+11C]
00406021 |. 55 push ebp
00406022 |. 8B2D EC414100 mov ebp,dword ptr ds:[<&USER32.Ki>; USER32.KillTimer
00406028 |. 68 F5010000 push 1F5 ; /TimerID = 1F5 (501.)
0040602D |. 56 push esi ; |hWnd
0040602E |. FFD5 call near ebp ; \KillTimer
00406030 |. 6A 7C push 7C ; /TimerID = 7C (124.)
00406032 |. 56 push esi ; |hWnd
00406033 |. FFD5 call near ebp ; \KillTimer
00406035 |. 57 push edi ; /这里是哪种违规产品
00406036 |. 6A 00 push 0 ; |wParam = 0
00406038 |. 68 75040000 push 475 ; |检测到违规产品!!消息号为475
0040603D |. 56 push esi ; |发给自己
0040603E |. FF15 E4414100 call near dword ptr ds:[<&USER32.>; \SendMessageA ★就这一处消息号为475的
其中检测多网卡的方法是遍历系统中可用的网卡树目,超过一个就eax=1,这样,edi=edi+1,这样edi不为0,即有违规品,然后发送475消息,出现反代理激活。检测多个ip也是一样,遍历系统中的所以ip,超过一个edi=edi+2,然后就发送475消息。检测proxy代理就有点不太看得懂了,不太懂网络编程,可能按数据包来算的吧。反正我的系统开了proxy代理也不出现反代理激活,还有多个ip也是,我不太懂一块网卡能有多个ip??有网络方面的高手请指点一下,我的机器只出现过第一个分支。不管了,爆破点太多了。
这样,宽带上网助手就能容忍我们系统有双网卡了,有双网卡也就能共享上网了,方法不难,不是本文重点,就不提了。
(二)保存密码的算法
无意中看到linkageclientconfig.ini文件里有这么两行:
LastUserName=F02143879
Identify=2b1b4f3eb539abc0
所以可以肯定是可逆的算法保存密码的,而且文件这么暴露。。。。
od中下断点 bp GetPrivateProfileStringA
代码如下
代码:
00402C56 |. 50 push eax ; /IniFileName
00402C57 |. 68 96000000 push 96 ; |BufSize = 96 (150.)
00402C5C |. 83C1 18 add ecx,18 ; |
00402C5F |. 51 push ecx ; |用户名存放处
00402C60 |. 68 A2474100 push Dot1xCli.004147A2 ; |Default = ""
00402C65 |. 68 8C474100 push Dot1xCli.0041478C ; |Key = "LastUserName"
00402C6A |. 68 34484100 push Dot1xCli.00414834 ; |Section = "General"
00402C6F |. FFD6 call near esi ; \GetPrivateProfileStringA;读出用户名
00402C71 |. 33C0 xor eax,eax
00402C73 |. 8D5424 08 lea edx,dword ptr ss:[esp+8]
00402C77 |. 52 push edx ; /IniFileName
00402C78 |. 68 2C010000 push 12C ; |BufSize = 12C (300.)
00402C7D |. B9 4B000000 mov ecx,4B ; |
00402C82 |. 8DBC24 D8000000 lea edi,dword ptr ss:[esp+D8] ; |
00402C89 |. F3:AB rep stos dword ptr es:[edi] ; |
00402C8B |. 8D8424 D8000000 lea eax,dword ptr ss:[esp+D8] ; |
00402C92 |. 50 push eax ; |加密后的密码存放处
00402C93 |. 68 A2474100 push Dot1xCli.004147A2 ; |Default = ""
00402C98 |. 68 80474100 push Dot1xCli.00414780 ; |Key = "Identify"
00402C9D |. 68 34484100 push Dot1xCli.00414834 ; |Section = "General"
00402CA2 |. FFD6 call near esi ; \GetPrivateProfileStringA
00402CA4 |. A1 3C9D4100 mov eax,dword ptr ds:[419D3C]
00402CA9 |. 8B48 04 mov ecx,dword ptr ds:[eax+4]
00402CAC |. 85C9 test ecx,ecx
00402CAE |. 74 40 je short Dot1xCli.00402CF0
00402CB0 |. 8D50 18 lea edx,dword ptr ds:[eax+18]
00402CB3 |. 8BC2 mov eax,edx
00402CB5 |. 8D70 01 lea esi,dword ptr ds:[eax+1]
00402CB8 |> 8A08 /mov cl,byte ptr ds:[eax]
00402CBA |. 40 |inc eax
00402CBB |. 84C9 |test cl,cl
00402CBD |.^ 75 F9 \jnz short Dot1xCli.00402CB8
00402CBF |. 8D8C24 D0000000 lea ecx,dword ptr ss:[esp+D0]
00402CC6 |. 51 push ecx
00402CC7 |. 2BC6 sub eax,esi
00402CC9 |. 50 push eax
00402CCA |. 52 push edx
00402CCB |. E8 70F7FFFF call Dot1xCli.00402440 ; 还原加密的密码★跟进
跟进后:解密代码
代码:
00402440 /$ 81EC A8000000 sub esp,0A8
00402446 |. 56 push esi
00402447 |. 8BB424 B8000000 mov esi,dword ptr ss:[esp+B8]
0040244E |. 8BC6 mov eax,esi
00402450 |. 57 push edi
00402451 |. 8D50 01 lea edx,dword ptr ds:[eax+1]
00402454 |> 8A08 /mov cl,byte ptr ds:[eax]
00402456 |. 40 |inc eax
00402457 |. 84C9 |test cl,cl
00402459 |.^ 75 F9 \jnz short Dot1xCli.00402454
0040245B |. 8B8C24 B4000000 mov ecx,dword ptr ss:[esp+B4]
00402462 |. 2BC2 sub eax,edx
00402464 |. D1E8 shr eax,1
00402466 |. 8BF8 mov edi,eax
00402468 |. 8B8424 B8000000 mov eax,dword ptr ss:[esp+B8]
0040246F |. 50 push eax
00402470 |. 51 push ecx
00402471 |. 8D5424 10 lea edx,dword ptr ss:[esp+10]
00402475 |. 52 push edx
00402476 |. E8 657D0000 call Dot1xCli.0040A1E0 ; 卡号md5存到12fa70
0040247B |. 83C4 0C add esp,0C
0040247E |. 33C9 xor ecx,ecx
00402480 |. 85FF test edi,edi
00402482 |. 7E 43 jle short Dot1xCli.004024C7
00402484 |. 53 push ebx
00402485 |> 8A044E /mov al,byte ptr ds:[esi+ecx*2] ; 取第一个
00402488 |. 3C 39 |cmp al,39 ; 比较是不是数字
0040248A |. 0FBEC0 |movsx eax,al
0040248D |. 7F 05 |jg short Dot1xCli.00402494
0040248F |. 83E8 30 |sub eax,30 ; 是则-30
00402492 |. EB 03 |jmp short Dot1xCli.00402497
00402494 |> 83E8 57 |sub eax,57 ; 不是-57
00402497 |> 8A544E 01 |mov dl,byte ptr ds:[esi+ecx*2+1] ; 取第二个
0040249B |. C0E0 04 |shl al,4 ; 第一个移4位
0040249E |. 80FA 39 |cmp dl,39 ; 和上面一样处理,只是不移位
004024A1 |. 88440C 1C |mov byte ptr ss:[esp+ecx+1C],al
004024A5 |. 0FBED2 |movsx edx,dl
004024A8 |. 7F 05 |jg short Dot1xCli.004024AF
004024AA |. 83EA 30 |sub edx,30
004024AD |. EB 03 |jmp short Dot1xCli.004024B2
004024AF |> 83EA 57 |sub edx,57
004024B2 |> 8BD9 |mov ebx,ecx
004024B4 |. 83E3 0F |and ebx,0F
004024B7 |. 0AC2 |or al,dl ; 前面两个加起来
004024B9 |. 32441C 0C |xor al,byte ptr ss:[esp+ebx+C] ; 与卡号的md5值xor(异或)
004024BD |. 88440C 1C |mov byte ptr ss:[esp+ecx+1C],al ; 保存
004024C1 |. 41 |inc ecx ; 指针后移
004024C2 |. 3BCF |cmp ecx,edi ; 是否结束
004024C4 |.^ 7C BF \jl short Dot1xCli.00402485 ; 没结束继续
004024C6 |. 5B pop ebx
004024C7 |> 8D4424 18 lea eax,dword ptr ss:[esp+18]
004024CB |. C6440C 18 00 mov byte ptr ss:[esp+ecx+18],0 ; 结尾加'\0'★这里就是密码
004024D0 |. 8BD6 mov edx,esi
004024D2 |. 8BC8 mov ecx,eax
004024D4 |. 5F pop edi
004024D5 |. 2BD1 sub edx,ecx
004024D7 |. 5E pop esi
004024D8 |> 8A08 /mov cl,byte ptr ds:[eax]
004024DA |. 880C02 |mov byte ptr ds:[edx+eax],cl
004024DD |. 40 |inc eax
004024DE |. 84C9 |test cl,cl
004024E0 |.^ 75 F6 \jnz short Dot1xCli.004024D8
004024E2 |. B8 01000000 mov eax,1
004024E7 |. 81C4 A8000000 add esp,0A8
004024ED \. C3 retn
密码每2位为一组,如果>39就-57,否则-30.转换成数字,或字母。然后与卡号的MD5值异或,得到密码。安全起见,程序就不写了。
如此简单的加密,而且不加壳,可见联创公司对我们上网用户的态度!
BY 海风月影
Greets to you all!