【破解作者】 jsliyangsj
【作者邮箱】 sjcrack@yahoo.com.cn
【使用工具】 peid OllyDbg1.10
【破解平台】 Winxp
【软件名称】 还原精灵2003版的“设置密码”算法分析
还原精灵2003版的“设置密码”算法分析(不是注册码)
还原精灵5.5版本,是明码比较,在内存中能找到密码的!
还原精灵2003版不是明码比较了,所以在内存中不能直接找到密码了!!!
开始我们的寻找之路:
首先有OD的附加功能附加还原精灵2003版的进程!
F9以后,右击还原精灵,“设置”只要换一个选项,确定,就出来输入密码对话框
随便输入,出现错误信息,暂停,用堆栈中的返回,一步一步来到关键点:
004082E7   .  52            PUSH EDX                                 ; /Arg1
004082E8   .  E8 F3FEFFFF   CALL HDDGMon.004081E0            算法,于比较的地方了
004082ED   .  85C0          TEST EAX,EAX
004082EF   .  75 7B         JNZ SHORT HDDGMon.0040836C
…………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………
进入004082E8   .  E8 F3FEFFFF   CALL HDDGMon.004081E0 
…………………………………………………………………………………………………………………………
004081E0  /$  83EC 64       SUB ESP,64
004081E3  |.  33C0          XOR EAX,EAX
004081E5  |.  53            PUSH EBX
004081E6  |.  56            PUSH ESI
004081E7  |.  8BD9          MOV EBX,ECX
004081E9  |.  57            PUSH EDI
004081EA  |.  B9 19000000   MOV ECX,19
004081EF  |.  8D7C24 0C     LEA EDI,DWORD PTR SS:[ESP+C]
004081F3  |.  F3:AB         REP STOS DWORD PTR ES:[EDI]
004081F5  |.  8B4C24 74     MOV ECX,DWORD PTR SS:[ESP+74]
004081F9  |.  8B01          MOV EAX,DWORD PTR DS:[ECX]
004081FB  |.  8B40 F8       MOV EAX,DWORD PTR DS:[EAX-8]
004081FE  |.  40            INC EAX
004081FF  |.  50            PUSH EAX
00408200  |.  E8 D7400000   CALL <JMP.&MFC42.#2915>
00408205  |.  8BF8          MOV EDI,EAX
00408207  |.  83C9 FF       OR ECX,FFFFFFFF
0040820A  |.  33C0          XOR EAX,EAX
0040820C  |.  8D5424 0C     LEA EDX,DWORD PTR SS:[ESP+C]
00408210  |.  F2:AE         REPNE SCAS BYTE PTR ES:[EDI]
00408212  |.  F7D1          NOT ECX
00408214  |.  2BF9          SUB EDI,ECX
00408216  |.  8BC1          MOV EAX,ECX
00408218  |.  8BF7          MOV ESI,EDI
0040821A  |.  8BFA          MOV EDI,EDX
0040821C  |.  8D5424 0C     LEA EDX,DWORD PTR SS:[ESP+C]
00408220  |.  C1E9 02       SHR ECX,2
00408223  |.  F3:A5         REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS>
00408225  |.  8BC8          MOV ECX,EAX
00408227  |.  83E1 03       AND ECX,3
0040822A  |.  F3:A4         REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[>
0040822C  |.  8D4C24 0C     LEA ECX,DWORD PTR SS:[ESP+C]
00408230  |.  51            PUSH ECX
00408231  |.  52            PUSH EDX
00408232  |.  E8 D9A2FFFF   CALL HDDGMon.00402510                    ;  处理输入码
00408237  |.  83C4 08       ADD ESP,8
0040823A  |.  8D73 64       LEA ESI,DWORD PTR DS:[EBX+64]
0040823D  |.  8D4424 0C     LEA EAX,DWORD PTR SS:[ESP+C]
00408241  |>  8A10          /MOV DL,BYTE PTR DS:[EAX]                ;  下面一个循环就是比较了
00408243  |.  8A1E          |MOV BL,BYTE PTR DS:[ESI]
00408245  |.  8ACA          |MOV CL,DL
00408247  |.  3AD3          |CMP DL,BL
00408249  |.  75 2E         |JNZ SHORT HDDGMon.00408279
0040824B  |.  84C9          |TEST CL,CL
0040824D  |.  74 16         |JE SHORT HDDGMon.00408265
0040824F  |.  8A50 01       |MOV DL,BYTE PTR DS:[EAX+1]
00408252  |.  8A5E 01       |MOV BL,BYTE PTR DS:[ESI+1]
00408255  |.  8ACA          |MOV CL,DL
00408257  |.  3AD3          |CMP DL,BL
00408259  |.  75 1E         |JNZ SHORT HDDGMon.00408279
0040825B  |.  83C0 02       |ADD EAX,2
0040825E  |.  83C6 02       |ADD ESI,2
00408261  |.  84C9          |TEST CL,CL
00408263  |.^ 75 DC         \JNZ SHORT HDDGMon.00408241
00408265  |>  33C0          XOR EAX,EAX
00408267  |.  33C9          XOR ECX,ECX
00408269  |.  85C0          TEST EAX,EAX
0040826B  |.  0F94C1        SETE CL
0040826E  |.  5F            POP EDI
0040826F  |.  5E            POP ESI
00408270  |.  8BC1          MOV EAX,ECX
00408272  |.  5B            POP EBX
00408273  |.  83C4 64       ADD ESP,64
00408276  |.  C2 0400       RETN 4
00408279  |>  1BC0          SBB EAX,EAX
0040827B  |.  5F            POP EDI
0040827C  |.  83D8 FF       SBB EAX,-1
0040827F  |.  33C9          XOR ECX,ECX
00408281  |.  85C0          TEST EAX,EAX
00408283  |.  0F94C1        SETE CL
00408286  |.  5E            POP ESI
00408287  |.  8BC1          MOV EAX,ECX
00408289  |.  5B            POP EBX
0040828A  |.  83C4 64       ADD ESP,64
0040828D  \.  C2 0400       RETN 4
…………………………………………………………………………………………………………………………


…………………………………………………………………………………………………………………………
进入00408232  |.  E8 D9A2FFFF   CALL HDDGMon.00402510                    ;  处理输入码
…………………………………………………………………………………………………………………………
00402510  /$  56            PUSH ESI
00402511  |.  8B7424 0C     MOV ESI,DWORD PTR SS:[ESP+C]
00402515  |.  57            PUSH EDI
00402516  |.  8BFE          MOV EDI,ESI
00402518  |.  83C9 FF       OR ECX,FFFFFFFF
0040251B  |.  33C0          XOR EAX,EAX
0040251D  |.  F2:AE         REPNE SCAS BYTE PTR ES:[EDI]
0040251F  |.  F7D1          NOT ECX
00402521  |.  49            DEC ECX
00402522  |.  85C9          TEST ECX,ECX
00402524  |.  7E 22         JLE SHORT HDDGMon.00402548
00402526  |.  8B7C24 0C     MOV EDI,DWORD PTR SS:[ESP+C]
0040252A  |.  53            PUSH EBX
0040252B  |.  8BD7          MOV EDX,EDI
0040252D  |.  2BF7          SUB ESI,EDI
0040252F  |.  8BD9          MOV EBX,ECX
00402531  |>  8A0416        /MOV AL,BYTE PTR DS:[ESI+EDX]
00402534  |.  3C 64         |CMP AL,64                            判断输入的字符等不等于64
00402536  |.  74 02         |JE SHORT HDDGMon.0040253A
00402538  |.  04 9C         |ADD AL,9C                           若不等于64输入的各个字符加上9C
0040253A  |>  8802          |MOV BYTE PTR DS:[EDX],AL            存储
0040253C  |.  42            |INC EDX
0040253D  |.  4B            |DEC EBX
0040253E  |.^ 75 F1         \JNZ SHORT HDDGMon.00402531
00402540  |.  C60439 00     MOV BYTE PTR DS:[ECX+EDI],0
00402544  |.  5B            POP EBX
00402545  |.  5F            POP EDI
00402546  |.  5E            POP ESI
00402547  |.  C3            RETN
00402548  |>  8B4424 0C     MOV EAX,DWORD PTR SS:[ESP+C]
0040254C  |.  5F            POP EDI
0040254D  |.  5E            POP ESI
0040254E  |.  C60401 00     MOV BYTE PTR DS:[ECX+EAX],0
00402552  \.  C3            RETN
…………………………………………………………………………………………………………………………
过程是这样的,输入的各个字符如果不等于64的话就简单+9C了,如果等于64,不加9C,直接存储,
因为9C+64=100,字符变成00了,
…………………………………………………………………………………………………………………………
我们来找找真正的密码在哪:
00408241  |>  8A10          /MOV DL,BYTE PTR DS:[EAX]                ;  下面一个循环就是比较了
00408243  |.  8A1E          |MOV BL,BYTE PTR DS:[ESI]
00408245  |.  8ACA          |MOV CL,DL
00408247  |.  3AD3          |CMP DL,BL
00408249  |.  75 2E         |JNZ SHORT HDDGMon.00408279
0040824B  |.  84C9          |TEST CL,CL
0040824D  |.  74 16         |JE SHORT HDDGMon.00408265
0040824F  |.  8A50 01       |MOV DL,BYTE PTR DS:[EAX+1]
00408252  |.  8A5E 01       |MOV BL,BYTE PTR DS:[ESI+1]
00408255  |.  8ACA          |MOV CL,DL
00408257  |.  3AD3          |CMP DL,BL
00408259  |.  75 1E         |JNZ SHORT HDDGMon.00408279
0040825B  |.  83C0 02       |ADD EAX,2
0040825E  |.  83C6 02       |ADD ESI,2
00408261  |.  84C9          |TEST CL,CL
00408263  |.^ 75 DC         \JNZ SHORT HDDGMon.00408241
…………………………………………………………………………………………………………………………
其中EAX中放的就是刚才算好的我输入码,而ESI中放的就是真正的密码地址了,
0012F390  CD CE CF D0 D1 D2 D3 D4   
我们只要把每个如CD-9C=31就是字符1,这样就可以了,注意,64就不能减去9C,因为它没有加9C。
上面就是12345678
完成。