MSN 密码监控器 5.2算法分析

【文章标题】: MSN 密码监控器 5.2算法分析
【软件名称】: MSN 密码监控器 5.2
【保护方式】: 注册码
【编写语言】: C++
——————————————————————————–
【详细过程】
      用OD加载程序,运行,用插件搜索ASCII字符,找到提示信息,双击来到反汇编代码处:


  0040223D    6A 00           push 0
  0040223F    68 BCA14100     push MSNPwd.0041A1BC                        ; ngnsss
  00402244    68 B0A14100     push MSNPwd.0041A1B0                        ; 注册号无效
  00402249    8BCE            mov ecx,esi
  0040224B    E8 40AC0000     call MSNPwd.0040CE90


  004025EC    68 B0A14100     push MSNPwd.0041A1B0 <-------|               ; 注册号无效
  004025F1    8BCE            mov ecx,esi    |
  004025F3    E8 98A80000     call MSNPwd.0040CE90

  向上跟踪:


  004025CC    85C0            test eax,eax   |
  004025CE    6A 00           push 0    |
  004025D0    68 BCA14100     push MSNPwd.0041A1BC         |               ; ngnsss
  004025D5    74 15           je short MSNPwd.004025EC

  
      继续向上的第一个CALL就是注册码验证了呵呵,进去看看:

00402440    6A FF           push -1
  00402442    68 88324100     push MSNPwd.00413288
  00402447    64:A1 00000000  mov eax,dword ptr fs:[0]
  0040244D    50              push eax
  0040244E    64:8925 0000000>mov dword ptr fs:[0],esp
  00402455    83EC 18         sub esp,18
  00402458    53              push ebx
  00402459    8B4C24 2C       mov ecx,dword ptr ss:[esp+2C]
  0040245D    33C0            xor eax,eax
  0040245F    894424 05       mov dword ptr ss:[esp+5],eax
  00402463    33DB            xor ebx,ebx
  00402465    66:894424 09    mov word ptr ss:[esp+9],ax
  0040246A    895C24 24       mov dword ptr ss:[esp+24],ebx
  0040246E    884424 0B       mov byte ptr ss:[esp+B],al
  00402472    8B41 F8         mov eax,dword ptr ds:[ecx-8]
  00402475    83F8 10         cmp eax,10                          ; 判断注册码位数,是否等于16位
  
  00402478    885C24 04       mov byte ptr ss:[esp+4],bl
  0040247C    0F8C C0000000   jl MSNPwd.00402542
  00402482    56              push esi
  00402483    68 04010000     push 104
  00402488    8D4C24 34       lea ecx,dword ptr ss:[esp+34]
  0040248C    E8 DFC50000     call MSNPwd.0040EA70
  00402491    8B10            mov edx,dword ptr ds:[eax]
  00402493    33F6            xor esi,esi
  00402495    895424 10       mov dword ptr ss:[esp+10],edx
  00402499    8B48 04         mov ecx,dword ptr ds:[eax+4]
  0040249C    894C24 14       mov dword ptr ss:[esp+14],ecx
  004024A0    8B50 08         mov edx,dword ptr ds:[eax+8]
  004024A3    895424 18       mov dword ptr ss:[esp+18],edx
  004024A7    8B40 0C         mov eax,dword ptr ds:[eax+C]
  004024AA    894424 1C       mov dword ptr ss:[esp+1C],eax
  004024AE    8A4C34 10       mov cl,byte ptr ss:[esp+esi+10]     ; 循环对注册码进行处理,1
  004024B2    51              push ecx
  004024B3    E8 68FFFFFF     call MSNPwd.00402420
  004024B8    83C4 04         add esp,4
  004024BB    884434 10       mov byte ptr ss:[esp+esi+10],al
  004024BF    46              inc esi
  004024C0    83FE 10         cmp esi,10
  004024C3  ^ 7C E9           jl short MSNPwd.004024AE
  004024C5    33C0            xor eax,eax
  004024C7    8D4C24 10       lea ecx,dword ptr ss:[esp+10]
  004024CB    5E              pop esi
  004024CC    8A51 01         mov dl,byte ptr ds:[ecx+1]          ; 循环对注册码进行处理,2
  004024CF    8A19            mov bl,byte ptr ds:[ecx]
  004024D1    C0E2 04         shl dl,4
  004024D4    02D3            add dl,bl
  004024D6    83C1 02         add ecx,2
  004024D9    885404 04       mov byte ptr ss:[esp+eax+4],dl
  004024DD    40              inc eax
  004024DE    83F8 08         cmp eax,8
  004024E1  ^ 7C E9           jl short MSNPwd.004024CC

  
这两处是对用户输入的注册码进行初步处理,处理的方式是:
1:将16位注册码分成8对
2:将每对字符的顺序颠倒,如12 34 56 78 90 12 34 56==>21 43 65 87 09 21 43 65
  
  


  004024E3    8A4424 07       mov al,byte ptr ss:[esp+7]
  004024E7    8A5C24 04       mov bl,byte ptr ss:[esp+4]
  004024EB    8A4C24 0B       mov cl,byte ptr ss:[esp+B]
  004024EF    8A5424 05       mov dl,byte ptr ss:[esp+5]

  
如果将注册码看成是一个包含8个整型的数组Num[8],则这里的处理方式就是如下:
al=Num[3],bl=Num[0],cl=Num[7],dl=Num[1]
  


  004024F3    32C3            xor al,bl              //al=al^bl
    004024F5    8A5C24 06       mov bl,byte ptr ss:[esp+6]         //bl=Num[2]
    004024F9    32CA            xor cl,dl              //cl=cl^dl
    004024FB    8A5424 09       mov dl,byte ptr ss:[esp+9]           //dl=Num[5]
    004024FF    32D3            xor dl,bl                 //dl=dl^bl
    00402501    8A5C24 08       mov bl,byte ptr ss:[esp+8]          //bl=Num[4]
  00402505    325C24 0A       xor bl,byte ptr ss:[esp+A]           //bl=bl^Num[6]

  


  00402509    3C 4D           cmp al,4D
  0040250B    75 35           jnz short MSNPwd.00402542
  0040250D    80F9 6E         cmp cl,6E
  00402510    75 30           jnz short MSNPwd.00402542
  00402512    80FA 4E         cmp dl,4E
  00402515    75 2B           jnz short MSNPwd.00402542
  00402517    80FB 19         cmp bl,19
  0040251A    75 26           jnz short MSNPwd.00402542

这里是对四个寄存器的值分别判断
其实上面的流程可以简单的用C代码表述如下:


int Num[8];
if((Num[3]^Num[0])!=0x4D)
        break;
if((Num[7]^Num[1])!=0x6E)
        break;
if((Num[5]^Num[2])!=0x4E)
        break;
if((Num[4]^Num[6])!=0x19)
        break;

只要符合这四个条件的数组就是正确的注册码了,呵呵
  
  


  0040251C    8D4C24 2C       lea ecx,dword ptr ss:[esp+2C]
  00402520    C74424 24 FFFFF>mov dword ptr ss:[esp+24],-1
  00402528    E8 5FC30000     call MSNPwd.0040E88C
  0040252D    B8 01000000     mov eax,1
  00402532    5B              pop ebx
  00402533    8B4C24 18       mov ecx,dword ptr ss:[esp+18]
  00402537    64:890D 0000000>mov dword ptr fs:[0],ecx
  0040253E    83C4 24         add esp,24
  00402541    C3              retn
  00402542    8D4C24 2C       lea ecx,dword ptr ss:[esp+2C]
  00402546    C74424 24 FFFFF>mov dword ptr ss:[esp+24],-1
  0040254E    E8 39C30000     call MSNPwd.0040E88C
  00402553    8B4C24 1C       mov ecx,dword ptr ss:[esp+1C]
  00402557    33C0            xor eax,eax
  00402559    5B              pop ebx
  0040255A    64:890D 0000000>mov dword ptr fs:[0],ecx
  00402561    83C4 24         add esp,24
  00402564    C3              retn

  
  
——————————————————————————–
【版权声明】:很久以前的文章, 现转载到BLOG,以备收藏!

                                                       2007年09月06日 15:52:12

发表评论