• 标 题:Directory Scanner v1.5 注册算法分析 (6千字)
  • 作 者:炎之川
  • 时 间:2003-4-6 22:06:23
  • 链 接:http://bbs.pediy.com

Directory Scanner v1.5 注册算法分析

破解目标:Directory Scanner v1.5
官方主页:http://dekasoftware.mastak.com/
软件简介:通过设置过滤掩码,让你快速查找电脑中的文件
下载地址:http://dekasoftware.mastak.com/dirscan.zip

使用工具:W32Dasm、Ollydbg、Windows 自带的计算器、32bit Calculator 1.6 by cybult

作者:炎之川
时间:2003.4.2
主页:http://skipli.yeah.net/

声明: 此文仅用于学习及交流,若要转载请保持文章完整。


Delphi 写的软件,也没有什么干扰分析的东西,W32Dasm 反汇编后可以在串式参考中找到注册成功及失败的提示,算法也比较简单。

简单分析后用 Ollydbg 载入程序,在 43D538 处下断点,然后 Ctrl+F2 重新开始,F9 运行程序,在注册对话框中填入注册名和假注册码,我填入:
Name: lovefire
S/N: 78787878

按 Register,被 Ollydbg 断下:
(; 后是 Ollydbg 所分析的内容,// 后是我加的注释)

0043D538  /. 55            PUSH EBP  //停在这里
0043D539  |. 8BEC          MOV EBP,ESP
0043D53B  |. 6A 00          PUSH 0
0043D53D  |. 6A 00          PUSH 0
0043D53F  |. 53            PUSH EBX
0043D540  |. 56            PUSH ESI
0043D541  |. 57            PUSH EDI
0043D542  |. 8BF8          MOV EDI,EAX
0043D544  |. 33C0          XOR EAX,EAX
0043D546  |. 55            PUSH EBP
0043D547  |. 68 3BD64300    PUSH DirScan.0043D63B
0043D54C  |. 64:FF30        PUSH DWORD PTR FS:[EAX]
0043D54F  |. 64:8920        MOV DWORD PTR FS:[EAX],ESP
0043D552  |. 8D55 FC        LEA EDX,DWORD PTR SS:[EBP-4]
0043D555  |. 8B87 E0010000  MOV EAX,DWORD PTR DS:[EDI+1E0]
0043D55B  |. E8 20E4FDFF    CALL DirScan.0041B980  //取得注册名
0043D560  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]  //注册名放入 eax
0043D563  |. E8 2465FCFF    CALL DirScan.00403A8C  //比较是否已输入注册名
0043D568  |. 33DB          XOR EBX,EBX
0043D56A  |. 8BF0          MOV ESI,EAX  //eax 中是注册名
0043D56C  |. 85F6          TEST ESI,ESI  //用户名输入了么?
0043D56E  |. 7E 22          JLE SHORT DirScan.0043D592  //没有输入就886啦~~~
0043D570  |. B9 01000000    MOV ECX,1  //ecx 置1,作为记数器

//算法开始
0043D575  |> 69C1 15CD5B07  /IMUL EAX,ECX,75BCD15  //eax = ecx*75BCD15,ecx 是记数器
0043D57B  |. 8B55 FC        |MOV EDX,DWORD PTR SS:[EBP-4]  //注册名送 edx
0043D57E  |. 0FB6540A FF    |MOVZX EDX,BYTE PTR DS:[EDX+ECX-1]  //逐位取注册名的字符
0043D583  |. F7EA          |IMUL EDX  //eax*edx,得数放入eax,溢出值放入edx
0043D585  |. 03C3          |ADD EAX,EBX  //eax=eax+ebx,此处第一次循环时ebx=0
0043D587  |. 99            |CDQ  //edx 清零
0043D588  |. 33C2          |XOR EAX,EDX  //eax异或edx,得数放入eax
0043D58A  |. 2BC2          |SUB EAX,EDX  //eax=eax-edx,edx中是上面乘法运算的溢出值
0043D58C  |. 8BD8          |MOV EBX,EAX  //ebx=eax
0043D58E  |. 41            |INC ECX  //ecx+1,即记数器+1
0043D58F  |. 4E            |DEC ESI  //esi-1
0043D590  |.^75 E3          \JNZ SHORT DirScan.0043D575  //跳回去继续循环
//算法结束,eax 中保存的就是注册码的16进制值,转换为10进制即是注册码

0043D592  |> 8D55 F8        LEA EDX,DWORD PTR SS:[EBP-8]
0043D595  |. 8B87 E8010000  MOV EAX,DWORD PTR DS:[EDI+1E8]
0043D59B  |. E8 E0E3FDFF    CALL DirScan.0041B980
0043D5A0  |. 8B45 F8        MOV EAX,DWORD PTR SS:[EBP-8]  //取假码
0043D5A3  |. 33D2          XOR EDX,EDX
0043D5A5  |. E8 3294FCFF    CALL DirScan.004069DC
0043D5AA  |. 3BD8          CMP EBX,EAX  //比较真假注册码
0043D5AC  |. 75 4D          JNZ SHORT DirScan.0043D5FB  //不同则注册失败,若此处改为 jne 0043D5AE,不管注册码是否正确都写入 dirscan.ini 文件,即可爆破(软件没有在启动的时候再次验证注册码有效性)
0043D5AE  |. A1 E8FA4300    MOV EAX,DWORD PTR DS:[43FAE8]
0043D5B3  |. 8918          MOV DWORD PTR DS:[EAX],EBX
0043D5B5  |. B9 54D64300    MOV ECX,DirScan.0043D654                ;  ASCII "dirscan.ini"
0043D5BA  |. B2 01          MOV DL,1
0043D5BC  |. A1 644F4300    MOV EAX,DWORD PTR DS:[434F64]
0043D5C1  |. E8 FA79FFFF    CALL DirScan.00434FC0
0043D5C6  |. 8BF0          MOV ESI,EAX
0043D5C8  |. 53            PUSH EBX
0043D5C9  |. B9 68D64300    MOV ECX,DirScan.0043D668                ;  ASCII "Serial"
0043D5CE  |. BA 78D64300    MOV EDX,DirScan.0043D678                ;  ASCII "Register"  //注册成功就将信息写入 dirscan.ini
0043D5D3  |. 8BC6          MOV EAX,ESI
0043D5D5  |. E8 DE7BFFFF    CALL DirScan.004351B8
0043D5DA  |. 8BC6          MOV EAX,ESI
0043D5DC  |. E8 5B57FCFF    CALL DirScan.00402D3C
0043D5E1  |. 6A 40          PUSH 40
0043D5E3  |. B9 84D64300    MOV ECX,DirScan.0043D684                ;  ASCII "Directory scanner"
0043D5E8  |. BA 98D64300    MOV EDX,DirScan.0043D698                ;  ASCII "Thank you for registering Directory Scanner!"  //注册成功
0043D5ED  |. A1 A4FB4300    MOV EAX,DWORD PTR DS:[43FBA4]
0043D5F2  |. 8B00          MOV EAX,DWORD PTR DS:[EAX]
0043D5F4  |. E8 53DFFEFF    CALL DirScan.0042B54C
0043D5F9  |. EB 18          JMP SHORT DirScan.0043D613
0043D5FB  |> 6A 10          PUSH 10
0043D5FD  |. B9 84D64300    MOV ECX,DirScan.0043D684                ;  ASCII "Directory scanner"
0043D602  |. BA C8D64300    MOV EDX,DirScan.0043D6C8                ;  ASCII "Wrong Serial Number. Register aborted!"  //注册失败
0043D607  |. A1 A4FB4300    MOV EAX,DWORD PTR DS:[43FBA4]
0043D60C  |. 8B00          MOV EAX,DWORD PTR DS:[EAX]
0043D60E  |. E8 39DFFEFF    CALL DirScan.0042B54C
0043D613  |> A1 68074400    MOV EAX,DWORD PTR DS:[440768]
0043D618  |. E8 5BBDFEFF    CALL DirScan.00429378
0043D61D  |. 33C0          XOR EAX,EAX
0043D61F  |. 5A            POP EDX
0043D620  |. 59            POP ECX
0043D621  |. 59            POP ECX
0043D622  |. 64:8910        MOV DWORD PTR FS:[EAX],EDX
0043D625  |. 68 42D64300    PUSH DirScan.0043D642
0043D62A  |> 8D45 F8        LEA EAX,DWORD PTR SS:[EBP-8]
0043D62D  |. E8 DE61FCFF    CALL DirScan.00403810
0043D632  |. 8D45 FC        LEA EAX,DWORD PTR SS:[EBP-4]
0043D635  |. E8 D661FCFF    CALL DirScan.00403810
0043D63A  \. C3            RETN


具体算法:
1、具体循环次数乘预设的数75BCD15,再乘逐位取得的注册名的ASCII值,值放入eax,溢出值放入edx,最后加上ebx的值,ebx初始值为0,第二次循环的值由第一次循环所得值决定,之后累加;
2、edx双字扩展(清零)之后,(eax*edx)-edx,得出的值放入 ebx,供下次循环使用;
3、循环完成之后,eax中存放的值即注册码的16进制数,转换为10进制即为注册码。

一组可用的注册码:
Name: lovefire
S/N: 1870109538

注册成功后,注册信息写入 windows 安装目录下的 dirscan.ini 文件中。

最后特别感谢小楼兄!