首页
社区
课程
招聘
[旧帖] [原创]密码监听器v2.5算法分析 高手飘过 0.00雪花
发表于: 2008-1-20 15:57 3748

[旧帖] [原创]密码监听器v2.5算法分析 高手飘过 0.00雪花

2008-1-20 15:57
3748
【文章标题】: 密码监听器v2.5算法分析
【文章作者】: frozenrain
【作者邮箱】: frozenrain15061986@yahoo.com.cn
【作者主页】: blog.sina.com.cn/lengyu1986
【作者QQ号】: 403121809
【软件名称】: 密码监听器v2.5
【软件大小】: 450K
【下载地址】: 自己搜索下载
【加壳方式】: 无
【保护方式】: 无
【编写语言】: VC++
【使用工具】: PEiDv0.94,OllyDbg1.1,W32Dsm8.93
【操作平台】: WINXP
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
  --------------------------------------------------------------------------------
【详细过程】

学破解才半个月,分析的不是很清楚。在学校图书馆找了2本汇编书看了看,就在网上找了个东西,以前用过还可以。不过没注册。总的来说算法很简单,给新手看看,高手飘过。我也是新手。 呵呵!!
现在可以用注册的拉 哈哈!现在有3.0的不敢去动他 只好先拿个2.5的练下手感。
先拿PEiD查无壳,这好办 VC++写的。W32Dasm反汇编,查找字符串。发现“您注册成功”,“注册失败”没发现什么可用信息。OD载入,发现有个比较的函数,断下试试。若断不下断MessageBox。0040BA65 断下了。 继续往下看。经过多次测试,得到如下信息:

  0040BA59     . 8B4D E4            MOV ECX,DWORD PTR SS:[EBP-1C]
  0040BA5C     . 8D45 EC            LEA EAX,DWORD PTR SS:[EBP-14]
  0040BA5F     . 50                 PUSH EAX
  0040BA60     . 68 15040000        PUSH 415
  0040BA65     . C645 FC 01         MOV BYTE PTR SS:[EBP-4],1
  0040BA69     . E8 2C200000        CALL <JMP.&MFC42.#3097>           ;  取用户名长度
  0040BA6E     . 8B4D E4            MOV ECX,DWORD PTR SS:[EBP-1C]
  0040BA71     . 8D45 F0            LEA EAX,DWORD PTR SS:[EBP-10]
  0040BA74     . 50                 PUSH EAX
  0040BA75     . 68 16040000        PUSH 416
  0040BA7A     . E8 1B200000        CALL <JMP.&MFC42.#3097>           ;  取注册码长度
  0040BA7F     . 8D4D EC            LEA ECX,DWORD PTR SS:[EBP-14]                     
  0040BA82     . E8 711C0000        CALL <JMP.&MFC42.#6282>
  0040BA87     . 8D4D EC            LEA ECX,DWORD PTR SS:[EBP-14]
  0040BA8A     . E8 631C0000        CALL <JMP.&MFC42.#6283>
  0040BA8F     . 8D4D F0            LEA ECX,DWORD PTR SS:[EBP-10]
  0040BA92     . E8 611C0000        CALL <JMP.&MFC42.#6282>
  0040BA97     . 8D4D F0            LEA ECX,DWORD PTR SS:[EBP-10]
  0040BA9A     . E8 531C0000        CALL <JMP.&MFC42.#6283>                           
  0040BA9F     . 8B45 EC            MOV EAX,DWORD PTR SS:[EBP-14]
  0040BAA2     . 3978 F8            CMP DWORD PTR DS:[EAX-8],EDI        ;  用户名为空就挂
  0040BAA5     . 0F84 F6020000      JE pswmonit.0040BDA1                ;  等于就挂了
  0040BAAB     . 8B45 F0            MOV EAX,DWORD PTR SS:[EBP-10]
  0040BAAE     . 3978 F8            CMP DWORD PTR DS:[EAX-8],EDI        ;  注册码空就挂
  0040BAB1     . 0F84 EA020000      JE pswmonit.0040BDA1
  0040BAB7     . 8D4D EC            LEA ECX,DWORD PTR SS:[EBP-14]
  0040BABA     . E8 1D1D0000        CALL <JMP.&MFC42.#4202>             ;  用户名为大写字母则转化为小写,
  0040BABF     . A1 00704100        MOV EAX,DWORD PTR DS:[417000]
  0040BAC4     . 33F6               XOR ESI,ESI
  0040BAC6     . 3BC7               CMP EAX,EDI
  0040BAC8     . 7E 3F              JLE SHORT pswmonit.0040BB09
  0040BACA     > 8D45 E0            LEA EAX,DWORD PTR SS:[EBP-20]
  0040BACD     . 56                 PUSH ESI
  0040BACE     . 50                 PUSH EAX
  0040BACF     . B9 F86F4100        MOV ECX,pswmonit.00416FF8
  0040BAD4     . E8 CA9DFFFF        CALL pswmonit.004058A3
  0040BAD9     . 8D4D E0            LEA ECX,DWORD PTR SS:[EBP-20]
  0040BADC     . C645 FC 02         MOV BYTE PTR SS:[EBP-4],2
  0040BAE0     . E8 F71C0000        CALL <JMP.&MFC42.#4202>             ;  返回固定字符串(系统注释)
  0040BAE5     . FF75 EC            PUSH DWORD PTR SS:[EBP-14]
  0040BAE8     . 8D4D E0            LEA ECX,DWORD PTR SS:[EBP-20]
  0040BAEB     . E8 F61B0000        CALL <JMP.&MFC42.#2764>             ;  EAX为FFFFFFFF
  0040BAF0     . 85C0               TEST EAX,EAX
  0040BAF2     . 7D 6A              JGE SHORT pswmonit.0040BB5E
  0040BAF4     . 8D4D E0            LEA ECX,DWORD PTR SS:[EBP-20]
  0040BAF7     . C645 FC 01         MOV BYTE PTR SS:[EBP-4],1
  0040BAFB     . E8 801B0000        CALL <JMP.&MFC42.#800>              ;  EAX清零
  0040BB00     . 46                 INC ESI
  0040BB01     . 3B35 00704100      CMP ESI,DWORD PTR DS:[417000]
  0040BB07      ^7C C1              JL SHORT pswmonit.0040BACA
  0040BB09     > 8D45 D8            LEA EAX,DWORD PTR SS:[EBP-28]
  0040BB0C     . 6A 01              PUSH 1
  0040BB0E     . 50                 PUSH EAX
  0040BB0F     . 8D4D F0            LEA ECX,DWORD PTR SS:[EBP-10]
  0040BB12     . E8 111C0000        CALL <JMP.&MFC42.#4129>
  0040BB17     . 8B00               MOV EAX,DWORD PTR DS:[EAX]
  0040BB19     . 8B35 AC044100      MOV ESI,DWORD PTR DS:[<&MSVCRT._mbscmp>]         ;  msvcrt._mbscmp
  0040BB1F     . BB 60524100        MOV EBX,pswmonit.00415260
  0040BB24     . C645 FC 03         MOV BYTE PTR SS:[EBP-4],3
  0040BB28     . 53                 PUSH EBX                                         ; /s2 => "0"
  0040BB29     . 50                 PUSH EAX                                         ; |s1 (若s1=0则挂了)
  0040BB2A     . FFD6               CALL ESI                                         ; \_mbscmp
  0040BB2C     . 59                 POP ECX
  0040BB2D     . 85C0               TEST EAX,EAX                                    
  0040BB2F     . 59                 POP ECX
  0040BB30     . 74 4E              JE SHORT pswmonit.0040BB80         ;  等于就跳了
  0040BB32     . 8D45 D4            LEA EAX,DWORD PTR SS:[EBP-2C]
  0040BB35     . 6A 01              PUSH 1
  0040BB37     . 50                 PUSH EAX
  0040BB38     . 8D4D F0            LEA ECX,DWORD PTR SS:[EBP-10]                  
  0040BB3B     . E8 F21D0000        CALL <JMP.&MFC42.#5710>
  0040BB40     . 8B00               MOV EAX,DWORD PTR DS:[EAX]
  0040BB42     . 53                 PUSH EBX
  0040BB43     . 50                 PUSH EAX
  0040BB44     . FFD6               CALL ESI                                         
  0040BB46     . 8BD8               MOV EBX,EAX
  0040BB48     . 59                 POP ECX
  0040BB49     . F7DB               NEG EBX
  0040BB4B     . 59                 POP ECX
  0040BB4C     . 1ADB               SBB BL,BL
  0040BB4E     . 8D4D D4            LEA ECX,DWORD PTR SS:[EBP-2C]
  0040BB51     . FEC3               INC BL
  0040BB53     . E8 281B0000        CALL <JMP.&MFC42.#800>           ;  BL清0
  0040BB58     . 84DB               TEST BL,BL
  0040BB5A     . 75 24              JNZ SHORT pswmonit.0040BB80
  0040BB5C       EB 24              JMP SHORT pswmonit.0040BB82
  
  
  
  0040BB8E     . 84DB               TEST BL,BL
  0040BB90       74 0B              JE SHORT pswmonit.0040BB9D            ;  不等于就挂了
  0040BB92     . 51                 PUSH ECX
  0040BB93     . 8BCC               MOV ECX,ESP
  0040BB95     . 8965 E0            MOV DWORD PTR SS:[EBP-20],ESP
  0040BB98     . E9 0A020000        JMP pswmonit.0040BDA7                 ;  跳就挂
  0040BB9D     > BB BC554100        MOV EBX,pswmonit.004155BC             ;  ASCII "whm_w"
  0040BBA2     . 8D4D EC            LEA ECX,DWORD PTR SS:[EBP-14]
  0040BBA5     . 53                 PUSH EBX
  0040BBA6     . E8 D71B0000        CALL <JMP.&MFC42.#941>                ;  将whm_w加到用户名后面 用户名长度放ECX
  0040BBAB     . 8B45 EC            MOV EAX,DWORD PTR SS:[EBP-14]
  0040BBAE     . 33C9               XOR ECX,ECX
  0040BBB0     . 897D DC            MOV DWORD PTR SS:[EBP-24],EDI
  0040BBB3     . 8B50 F8            MOV EDX,DWORD PTR DS:[EAX-8]          ;  新用户名长度放EDX
  0040BBB6     . 3BD7               CMP EDX,EDI
  0040BBB8     . 7E 0E              JLE SHORT pswmonit.0040BBC8
  0040BBBA     > 0FBE3401           MOVSX ESI,BYTE PTR DS:[ECX+EAX]       ;  逐个取新用户名
  0040BBBE     . 0175 DC            ADD DWORD PTR SS:[EBP-24],ESI         ;  加上自身ASCII存堆栈0013E4B0中
  0040BBC1     . 41                 INC ECX
  0040BBC2     . 3BCA               CMP ECX,EDX
  0040BBC4     .^7C F4              JL SHORT pswmonit.0040BBBA
  0040BBC6     . 33FF               XOR EDI,EDI
  0040BBC8     > 8B45 F0            MOV EAX,DWORD PTR SS:[EBP-10]
  0040BBCB     . 8D4D F0            LEA ECX,DWORD PTR SS:[EBP-10]
  0040BBCE     . 8B40 F8            MOV EAX,DWORD PTR DS:[EAX-8]          ;  取注册码长度放EAX中
  0040BBD1     . 83C0 FE            ADD EAX,-2                            ;  注册码长度减2
  0040BBD4     . 50                 PUSH EAX
  0040BBD5     . 8D45 D4            LEA EAX,DWORD PTR SS:[EBP-2C]
  0040BBD8     . 57                 PUSH EDI
  0040BBD9     . 50                 PUSH EAX
  0040BBDA     . E8 511C0000        CALL <JMP.&MFC42.#4278>               ;  去掉注册码后2位
  0040BBDF     . FF30               PUSH DWORD PTR DS:[EAX]                          ; /s
  0040BBE1     . 8B35 C4044100      MOV ESI,DWORD PTR DS:[<&MSVCRT.atol>]            ; |msvcrt.atol
  0040BBE7     . FFD6               CALL ESI                                         ; \atol
  0040BBE9     . 59                 POP ECX
  0040BBEA     . 8BF8               MOV EDI,EAX
  0040BBEC     . 8D4D D4            LEA ECX,DWORD PTR SS:[EBP-2C]
  0040BBEF     . E8 8C1A0000        CALL <JMP.&MFC42.#800>
  0040BBF4     . 8D45 D4            LEA EAX,DWORD PTR SS:[EBP-2C]
  0040BBF7     . 6A 02              PUSH 2
  0040BBF9     . 50                 PUSH EAX
  0040BBFA     . 8D4D F0            LEA ECX,DWORD PTR SS:[EBP-10]
  0040BBFD     . E8 301D0000        CALL <JMP.&MFC42.#5710>              ;  取注册码后2位
  0040BC02     . FF30               PUSH DWORD PTR DS:[EAX]                          ; /s
  0040BC04     . FF15 C0044100      CALL DWORD PTR DS:[<&MSVCRT.atoi>]               ; \atoi
  0040BC0A     . 59                 POP ECX
  0040BC0B     . 8945 D8            MOV DWORD PTR SS:[EBP-28],EAX
  0040BC0E     . 8D4D D4            LEA ECX,DWORD PTR SS:[EBP-2C]
  0040BC11     . E8 6A1A0000        CALL <JMP.&MFC42.#800>
  0040BC16     . 337D D8            XOR EDI,DWORD PTR SS:[EBP-28]         ;  注册码前n-2位与后2位异或(设注册码长度为n)
  0040BC19     . 397D DC            CMP DWORD PTR SS:[EBP-24],EDI         ;  与前面逐个用户名相加的结果比较
  0040BC1C       0F85 66010000      JNZ pswmonit.0040BD88                 ;  关键跳转,不相等就挂 应该可以做爆破点
  
  
  0040BD3A     . 68 30100000        PUSH 1030
  0040BD3F     . 68 085E4100        PUSH pswmonit.00415E08
  0040BD44     . 68 F85D4100        PUSH pswmonit.00415DF8
  0040BD49     . E8 9E190000        CALL <JMP.&MFC42.#4224>               ;  哇噻! 成功了!
  
  
  
0040BD8B     . 68 30100000        PUSH 1030
0040BD90     . 68 085E4100        PUSH pswmonit.00415E08
0040BD95     . 68 1C5E4100        PUSH pswmonit.00415E1C
0040BD9A       E8 4D190000        CALL <JMP.&MFC42.#4224>                 ; 失败处
0040BD9F     . EB 16              JMP SHORT pswmonit.0040BDB7
0040BDA1     > 51                 PUSH ECX
0040BDA2     . 8BCC               MOV ECX,ESP
0040BDA4     . 8965 E0            MOV DWORD PTR SS:[EBP-20],ESP
0040BDA7     > 68 1C5E4100        PUSH pswmonit.00415E1C
0040BDAC     . E8 71190000        CALL <JMP.&MFC42.#537>
0040BDB1       E8 39BAFFFF        CALL pswmonit.004077EF                  ; 失败处
--------------------------------------------------------------------------------
  
  
【经验总结】

输入的用户名后面加上固定的字符,把他们所有的字符串ASCII码加起来
取输入的密码后2位和前面的几位异或
他们相等则表示注册码相等。
个人感觉算法不严密,每个用户名差不多都有好几个注册码。
现给出一组注册码供参考:
    用户名:frozenrain
    注册码:166331(其实有好几组)
PS:4位注册码 不能成功。程序中没T掉4位的注册码

上面是我的分析 不知道有没有错的地方 学破解没多久, 希望能增加自己的信心 ~_~!
  算法不算复杂 ,我也不懂算法, 用C++写了个注册机。下面代码已经通过VC++6.0编译。
#include <iostream.h>
#include <string.h>
void Calc(int m);
void main()
{
        char Client[32]={0},Result[32]={0};
        cout<<"请输入用户名"<<endl;       
        do{
          cin>>Client;
          int length=strlen(Client);
          for(int i=0;i<length;i++)
          {   
                if(Client[i]>64&&Client[i]<91)
            Client[i]=Client[i]+32;
       
          }
          strcat(Client,"whm_w");
       int asciisum=0;
          length=strlen(Client);
          for(int j=0;j<length;j++)
          asciisum+=Client[j];
      Calc(asciisum);
         
        }while(1);

}
void Calc(int m)
{
        int s=0,t=0;
        int n=0;
  for(int i=0;i<9999;i++)
  {   
       
        for(int j=0;j<100;j++)
        {  

                n=s^t;
            if(m==n)
                {
                  cout<<"注册码为:"<<t<<s<<endl;
         
                  break;
                }
        t++;
        }
         s++;  
         
  }
  

}
  
--------------------------------------------------------------------------------

  【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
  
                                                         2008年01月18日 22:23:46
  
--------------------------------------------------------------------------------

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

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 107
活跃值: (1628)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
2
忘了传附件了 呵呵补上了
上传的附件:
2008-1-20 16:01
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
学习了,顶一下。
2008-1-20 21:05
0
雪    币: 347
活跃值: (25)
能力值: ( LV9,RANK:420 )
在线值:
发帖
回帖
粉丝
4
不错的文章,学习
2008-1-20 21:45
0
游客
登录 | 注册 方可回帖
返回
//