创联网络宽带上网助手的脱壳


        在学校上网,用的是创联网络的宽带上网助手(版本是2.3410),好像很多学校都用它来上网,但是它的限制非常多,不能用NAT,不能用代理,不能有多IP,不能有………一大堆的限制。于是,我决定就拿它开刀试试。

一.工具准备:

 1.ollyice,貌似地球人都知道呃;
 2.peid,不说了
 3. ASPR脱壳脚本
 4. ImportREC
 5.HideToolz,隐藏进程用

二.勘壳

 知己知彼,才能百战不殆。用PEid看看它用了什么壳先,发现是aspr的,在网上搜了下,发现没有好用点的自动脱壳机,但找到了一个ASPR脱壳脚本(没错就是传说中的Volx大侠写的),那好,现在就开始吧。
 
三.脱壳

  现在就OD载入,提示有压缩代码,点确定继续。然后,先运行Hide Toolz,选择OD进程,右键hide 隐藏OD进程,为什么呢,因为如果不隐藏的话有可能会导致脚本脱壳失败,为了确保成功,最好还是隐藏的好哈~~~,在接下来就是用脚本了,点右键-运行脚本-选Aspr2.XX_unpacker_v1.0SC.osc。屏幕一阵狂闪,最后提示有偷窃代码(图3)。点确定,接下来干什么呢,当然是记下OEP啦,点击 查看-记录,记下IAT的地址和大小和OEP的地址(是相对地址哦)。看看目录下是不是多了一个文件,果然,多了一个de_Dot1xClient程序,但是双击却提示”应用程序正常初始化失败”。
 下面就开始第2步,修复输入表。
 打开刚刚出错的那个文件,打开ImportREC,选择文件进程de_Dot1xClient.exe,在OEP中输入刚刚OD记录中的得到的0000DAB2,这时候不要点IAT AutoSearch,因为在刚刚OD提示有偷窃代码,所以可能用自动也未必找的到IAT,在RVA中输入OD中的IAT相对地址:015000,Size中输入2F4,再点击GET IMPORTS获得输入表。很快就出来结果了,点击show Invalid看看有没有值为NO的,呵呵,很好,全是YES。最后点击Fix Dump,选择刚刚的那个文件,确定。
  好了,现在运行de_Dot1xClient_.exe试试,OK,正常运行,在用PEID看看,发现一切正常,也没有提示有壳了,嘿嘿,到这里说明前面的脱壳步骤已经完成了。

四.突破限制

 现在用OD打开,程序停在40DAB2,然后就是参看字符串参考,居然没有相关的信息……看来只能下中断了,因为在客户端发现反代理或多IP时,都会有相应的对话框提示,所以,最先想到了用最简单的对话框断点,然后再开代理或连无线什么的,出现提示,再看能不能断下来。在命令行那输入bpx MessageBoxA,然后当然就是运行了,按下F9,发现OD停住了,但却不是在我们下的断点那里停的,这是因为我们脱壳不完全造成的,但现在我们直接忽略它,按shift+F9,忽略异常运行,按2次后就弹出了界面,点击连接,继续按下2次shirt+f9直到认证成功,然后程序马上被停了下来。很奇怪吧,平时认证成功后,就直接弹出一个网页,就没有任何提示了,但现在却被MessageBoxA断点断了下了,这是为什么呢,让我们把所有断点禁止掉,按CTRL+F2重新开始,几次shirt+F9后认证成功后,哈哈,发现了吧,它提示软件检测失败,请核实你是否更改客户端,这下倒省了不少事情哈。现在再次激活全部断点,重新再来,很快程序被断在刚刚的那个提示代理对话框那。在向上看,看到了LoadStringA这个API调用把那句出错提示装入到了MessageBox,。结果就显示了上面的提示了。继续向前,看到如下代码,

还有

就是运行了这些代码,才导致了我们无法用代理,无法用NAT,无法........
最后来到这里:
00406EEE      CC            int3
00406EEF      CC            int3
00406EF0  /$  8B4424 0C     mov     eax, dword ptr [esp+C]
00406EF4  |.  83EC 08       sub     esp, 8
00406EF7  |.  83F8 67       cmp     eax, 67
看来我们现在是断在一个函数里面,看看是哪里调用的这个函数呢,在406ef0上左键,OD提示:CALL来至4080b0。我们跟过去看看,“右键”-“转到CALL来至4080b0”,来到这里:
004080B8   .  E8 33EEFFFF   call    00406EF0
004080BD   .  83C4 10       add     esp, 10
004080C0   .  5F            pop     edi
004080C1   .  5E            pop     esi
004080C2   .  5D            pop     ebp
004080C3   .  B8 01000000   mov     eax, 1
004080C8   .  5B            pop     ebx
004080C9   .  81C4 58020000 add     esp, 258
004080CF   .  C2 1000       retn    10
pop,add esp,xxx,retn,还是一个函数,再向前看看,来到这句
0040809B   mov     ecx, dword ptr [esp+278] ;  Case 590 of switch 00407378
OD提示:跳转来自 00407DC5,继续跟,“右键”-“转到跳转来自00407DC5”,来到这里
00407DB7   .  C2 1000       retn    10
00407DBA   >  3D 90050000   cmp     eax, 590
00407DBF   .  0F87 0D030000 ja      004080D2
00407DC5   .  0F84 D0020000 je      0040809B
这就是传说中的那个跳转吗?分析下,先比较eax和590H的大小,大于则跳转,若等于,则跳到出错的那个CALL调用,貌似猜测成立。实践是检验真理的唯一标准,让我们试试看,记下地址407dc5,CTRL+F2重新开始,出现主界面后,CTRL+B,右键-禁用所有断点,然后,CTRL+G输入刚刚的那个记录的地址00407DC5,在je      0040809B这行“右键”-“二进制”-“用NOP填充”,这样一来程序流就没法进入那个出错的CALL调用了。试试看,点击连接,按下几次SHIRT+F9后,程序正常连接,连上无线,看看IP,果然成功了~~~
  主要的限制解决了,但相信大家对认证成功后的弹出的那个网页很讨厌吧,既然都到这一步了,那就来把这也去掉了吧~~~弹出网页,会用什么API呢,弹出一个网页其实和运行一个程序是一样的道理,所以应该有可能是WinExec或ShellExecute,输入bpx WinExec 看看,没有,囧~~,万分紧张的输入bpx ShellExecute,按下ALT+B看看,呵呵,找到了4个断点,有2个是EXPLORER.EXE的(一开始我自己调试的时候,没仔细看就直接下了断点开始埋头跟踪了说,正郁闷为什么没反应才发现跟了半天是EXPLORER而不是iexplore,汗啊)。最后的那个就是说要找的iexplore调用断点啦~~ 

接下来怎么办相信不用我说也明白了吧,向上找,看有跳转跳过它没,果然找到了一个
0040C9BB  |.  C3            retn
0040C9BC  |>  85F6          test    esi, esi
0040C9BE  |.  0F8E 98000000 jle     0040CA5C
0040C9C4  |.  81FE 00010000 cmp     esi, 100
0040C9CA      0F8F 8C000000 jg      0040CA5C ;就是这个跳转
把jg改成jmp,在试试,果然,再也没有烦人的网页弹出了。
 到现在所有的限制差不多都被处理了,没有烦人的网页弹出,可以用代理,可以边聊天边玩局域网游戏,世界终于自由了,呵呵。

五.

 不知道大家有发现没,在宽带上网助手的根目录下,有一个linkageclientconfig.ini文件,在这里有2个键LastUserName,Identify,难道这就是我们的卡号和密码?但是我们看Identify却不像是密码,应该是被加密了。反正都到这步了,再跟踪下看看是怎么回事也不错哈。打开OD,因为是对ini文件操作,下GetprivateProfileStringA断点。运行程序看看,断在00402b0a这里,在向后看看,在调用了2次API函数后,获得了那2个键值,继续向下几步来到这里:
00402B78  |> /8A08          /mov     cl, byte ptr [eax]
00402B7A  |. |40            |inc     eax
00402B7B  |. |84C9          |test    cl, cl
00402B7D  |.^/75 F9         /jnz     short 00402B78 ;计算用户账号位数
00402B7F  |.  8D8C24 D00000>lea     ecx, dword ptr [esp+D0]
00402B86 |.  51           push    ecx                   ;加密串
00402B87  |. 2BC6          sub     eax, esi
00402B89|.  50            push    eax                   ;用户账号位数
00402B8A  |.  52         push    edx                    ;  账号
00402B8B  |.  E8 70F7FFFF   call    00402300            ;关键CALL
00402B90  |.  8B15 88B14100 mov     edx, dword ptr [41B188]
00402B96  |.  83C4 0C       add     esp, 0C
00402B99  |.  8D8C24 D00000>lea     ecx, dword ptr [esp+D0] ;已解密密码串
00402BA0  |.  81C2 AE000000 add     edx, 0AE
跟进00402B8B那个CALL,继续向下几步,来到这里

继续跟入,向下几步,你就会看到这段代码:
0040A98C  |.  C74424 0C 012>mov     dword ptr [esp+C], 67452301
0040A994  |.  C74424 10 89A>mov     dword ptr [esp+10], EFCDAB89
0040A99C  |.  C74424 14 FED>mov     dword ptr [esp+14], 98BADCFE
0040A9A4  |.  C74424 18 765>mov     dword ptr [esp+18], 10325476
呵呵,对于67452301,EFCDAB89,98BADCFE,10325476这4串数字,相信看过MD5加密的都知道,这就是算法的初始化链接变量,由于MD5加密比较复杂,这里就不继续跟踪了,按CTRL+F9跳出这个CALL,继续。大家应该记得前面CALL 0040a970前有一个缓冲区指针压栈,没错账号的MD5加密结果就在这里放着。再后面的代码,很明显就是对密码进行解密了:

  00402336  |.  E8 35860000   call    0040A970                         ;这里进行对账号的MD5加密,过程很复杂的,有兴趣的自己看去
  0040233B  |.  83C4 0C       add     esp, 0C
  0040233E  |.  33C9          xor     ecx, ecx
  00402340  |.  85FF          test    edi, edi
  00402342  |.  7E 43         jle     short 00402387
  00402344  |.  53            push    ebx
  00402345  |>  8A044E        /mov     al, byte ptr [esi+ecx*2]          ;这里开始解密;取加密密码的第一位
  00402348  |.  3C 39         |cmp     al, 39                            ;与‘9’比较,
  0040234A  |.  0FBEC0        |movsx   eax, al
  0040234D  |.  7F 05         |jg      short 00402354                    ;大于则把它减去0x57,小于则减去0x30
  0040234F  |.  83E8 30       |sub     eax, 30
  00402352  |.  EB 03         |jmp     short 00402357
  00402354  |>  83E8 57       |sub     eax, 57
  00402357  |>  8A544E 01     |mov     dl, byte ptr [esi+ecx*2+1]         ;取加密密码的第二位
  0040235B  |.  C0E0 04       |shl     al, 4                              ;第一位的结果左移4位
  0040235E  |.  80FA 39       |cmp     dl, 39
  00402361  |.  88440C 1C     |mov     byte ptr [esp+ecx+1C], al
  00402365  |.  0FBED2        |movsx   edx, dl
  00402368  |.  7F 05         |jg      short 0040236F                     ;大于则把它减去0x57,小于则减去0x30
  0040236A  |.  83EA 30       |sub     edx, 30
  0040236D  |.  EB 03         |jmp     short 00402372
  0040236F  |>  83EA 57       |sub     edx, 57
  00402372  |>  8BD9          |mov     ebx, ecx
  00402374  |.  83E3 0F       |and     ebx, 0F
  00402377  |.  0AC2          |or      al, dl                              ;第一位与第二位新结果做或运算
  00402379  |.  32441C 0C     |xor     al, byte ptr [esp+ebx+C]            ;把刚刚得到的结果与用户名的MD5加密结果的最后1个字节做异或
  0040237D  |.  88440C 1C     |mov     byte ptr [esp+ecx+1C], al           ;保存结果~~
  00402381  |.  41            |inc     ecx
  00402382  |.  3BCF          |cmp     ecx, edi
  00402384  |.^ 7C BF         /jl      short 00402345
相信大家都看出来了,解密方法用C描述就是:
 code[]为加密的密码串,resultOfMd5[]为账号的MD5加密结果
 for(i=0;i<=15;i+=2){
  if(code[i]>'9') //第i位
   a=(code[i]-(unsigned char)0x57)<<4;
  else
   a=(code[i]-(unsigned char)0x30)<<4;
  if(code[i+1]>'9') //第i+1位
   b=(code[i+1]-(unsigned char)0x57);
  else
   b=(code[i+1]-(unsigned char)0x30);
  a|=b;
  a^=resultOfMd5[i/2];
  key[i/2]=a;
 }//解密过程
  再下面我们就可以写一个密码读取器之类的,直接读取INI文件下的LastUserName,Identify键值,把UserName进行MD5加密,再与加密密码做上面的运算的出密码明文了。这样就可以直接读出账号和密码了,而不是找以前的那张上网卡了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值