- UID
- 35582
注册时间2007-8-28
阅读权限20
最后登录1970-1-1
以武会友
该用户从未签到
|
【文章标题】: MSN 密码监控器 5.2算法分析
【文章作者】: iawen
【作者邮箱】: [email protected]
【作者QQ号】: 160193626
【软件名称】: MSN 密码监控器 5.2
【软件大小】: 500KB
【下载地址】: http://www.onlinedown.net/soft/47884.htm
【加壳方式】: 无
【保护方式】: 注册码
【编写语言】: C++
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
用OD加载程序,运行,用插件搜索ASCII字符,找到提示信息,双击来到反汇编代码处:
1<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
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
2<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
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
--------------------------------------------------------------------------------
【版权声明】: 本文原创于PYG论坛, 转载请注明作者并保持文章的完整, 谢谢!
2007年09月06日 15:52:18 |
|