【破解作者】 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
完成。
[注意]看雪招聘,专注安全领域的专业人才平台!