【文章标题】: 屏保软件算法分析(MD5)
【文章作者】: ww990
【作者邮箱】: ww990@126.com
【软件名称】: Flash ScreenSaver Maker 1.3
【下载地址】: http://www.screensaver-maker.biz/
【加壳方式】: upx
【保护方式】: 注册码
【编写语言】: delphi
【使用工具】: peid ollyice
【操作平台】: XP
【软件介绍】: Flash ScreenSaver Maker is a screen saver editor
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
前些天到天空看到这个软件就下了,看着喜欢呗。
首先peid一下,upx的壳,简单搞定,运行一下没有校检,狂喜。
再用kanal插件分析一下竟然有ADLER32、CRC32、MD5晕
不管运行注册一下,有注册提示,开心 ^_^ 。
od加载,下断bp MessageBoxA,运行点注册输入注册名WW9900(至少六位),注册码123-4567-890
断在这里
77D504EA > 8BFF MOV EDI,EDI
77D504EC 55 PUSH EBP
77D504ED 8BEC MOV EBP,ESP
77D504EF 833D BC04D777 0>CMP DWORD PTR DS:[77D704BC],0
77D504F6 74 24 JE SHORT USER32.77D5051C
ALT+F9返回看看
004B7A24 . 8D45 F4 LEA EAX,DWORD PTR SS:[EBP-C]
004B7A27 . E8 ECD2F4FF CALL FlashScr.00404D18
004B7A2C . 8B15 3C1D4C00 MOV EDX,DWORD PTR DS:[4C1D3C] ; FlashScr.004C18BC
004B7A32 . 8B12 MOV EDX,DWORD PTR DS:[EDX]
004B7A34 . 8A52 03 MOV DL,BYTE PTR DS:[EDX+3] ;
004B7A37 . 8810 MOV BYTE PTR DS:[EAX],DL
004B7A39 . 8D45 F4 LEA EAX,DWORD PTR SS:[EBP-C]
004B7A3C . E8 D7D2F4FF CALL FlashScr.00404D18
004B7A41 . 8B15 3C1D4C00 MOV EDX,DWORD PTR DS:[4C1D3C] ; FlashScr.004C18BC
004B7A47 . 8B12 MOV EDX,DWORD PTR DS:[EDX]
004B7A49 . 8A52 01 MOV DL,BYTE PTR DS:[EDX+1] ;
004B7A4C . 8850 01 MOV BYTE PTR DS:[EAX+1],DL
004B7A4F . 8D45 F4 LEA EAX,DWORD PTR SS:[EBP-C]
004B7A52 . E8 C1D2F4FF CALL FlashScr.00404D18
004B7A57 . 8B15 3C1D4C00 MOV EDX,DWORD PTR DS:[4C1D3C] ; FlashScr.004C18BC
004B7A5D . 8B12 MOV EDX,DWORD PTR DS:[EDX]
004B7A5F . 8A52 02 MOV DL,BYTE PTR DS:[EDX+2] ;
004B7A62 . 8850 02 MOV BYTE PTR DS:[EAX+2],DL
004B7A65 . 8D45 F4 LEA EAX,DWORD PTR SS:[EBP-C]
004B7A68 . E8 ABD2F4FF CALL FlashScr.00404D18
004B7A6D . 8B15 3C1D4C00 MOV EDX,DWORD PTR DS:[4C1D3C] ; FlashScr.004C18BC
004B7A73 . 8B12 MOV EDX,DWORD PTR DS:[EDX]
004B7A75 . 8A52 05 MOV DL,BYTE PTR DS:[EDX+5] ;
004B7A78 . 8850 03 MOV BYTE PTR DS:[EAX+3],DL
004B7A7B . 8D45 F4 LEA EAX,DWORD PTR SS:[EBP-C]
004B7A7E . E8 95D2F4FF CALL FlashScr.00404D18
004B7A83 . 8B15 3C1D4C00 MOV EDX,DWORD PTR DS:[4C1D3C] ; FlashScr.004C18BC
004B7A89 . 8B12 MOV EDX,DWORD PTR DS:[EDX]
004B7A8B . 8A52 06 MOV DL,BYTE PTR DS:[EDX+6]
004B7A8E . 8850 04 MOV BYTE PTR DS:[EAX+4],DL ;
004B7A91 . 8D45 F4 LEA EAX,DWORD PTR SS:[EBP-C]
004B7A94 . E8 7FD2F4FF CALL FlashScr.00404D18
004B7A99 . 8B15 3C1D4C00 MOV EDX,DWORD PTR DS:[4C1D3C] ; FlashScr.004C18BC
004B7A9F . 8B12 MOV EDX,DWORD PTR DS:[EDX]
004B7AA1 . 8A52 08 MOV DL,BYTE PTR DS:[EDX+8] ;
004B7AA4 . 8850 05 MOV BYTE PTR DS:[EAX+5],DL
004B7AA7 .^ E9 BEFEFFFF JMP FlashScr.004B796A
004B7AAC > BA 02000000 MOV EDX,2 ;
004B7AB1 . 8D45 DC LEA EAX,DWORD PTR SS:[EBP-24] ;
004B7AB4 > 8B4D F4 MOV ECX,DWORD PTR SS:[EBP-C] ;
004B7AB7 . 8A4C11 FF MOV CL,BYTE PTR DS:[ECX+EDX-1] ;
004B7ABB . 8B18 MOV EBX,DWORD PTR DS:[EAX] ;
004B7ABD . 8B75 F8 MOV ESI,DWORD PTR SS:[EBP-8]
004B7AC0 . 3A4C1E FF CMP CL,BYTE PTR DS:[ESI+EBX-1] ;
004B7AC4 74 53 JE SHORT FlashScr.004B7B19
004B7AC6 . 6A 10 PUSH 10
004B7AC8 . 68 4C7C4B00 PUSH FlashScr.004B7C4C ; ASCII "error"
004B7ACD . 68 547C4B00 PUSH FlashScr.004B7C54 ; ASCII "Register FAILED, please check User name and Serial number."
004B7AD2 . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
004B7AD5 . E8 6603FBFF CALL FlashScr.00467E40
004B7ADA . 50 PUSH EAX ; |hOwner
004B7ADB . E8 34F9F4FF CALL <JMP.&user32.MessageBoxA> ; \MessageBoxA
004B7AE0 . A1 B41D4C00 MOV EAX,DWORD PTR DS:[4C1DB4] 停止此处
重新运行程序我们在*处设断
004B791C . 68 3C7C4B00 PUSH FlashScr.004B7C3C * 此处设断
004B7921 . 64:FF30 PUSH DWORD PTR FS:[EAX]
运行,再次输入用户名和注册码,确定后断下
004B791C . 68 3C7C4B00 PUSH FlashScr.004B7C3C
004B7921 . 64:FF30 PUSH DWORD PTR FS:[EAX]
004B7924 . 64:8920 MOV DWORD PTR FS:[EAX],ESP
004B7927 . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
004B792A . 8B80 2C030000 MOV EAX,DWORD PTR DS:[EAX+32C]
004B7930 . 33D2 XOR EDX,EDX
004B7932 . E8 F1F0F7FF CALL FlashScr.00436A28
004B7937 . 8B0D 301F4C00 MOV ECX,DWORD PTR DS:[4C1F30] ; FlashScr.004C13F8
004B793D . 8B09 MOV ECX,DWORD PTR DS:[ECX] ; FlashScr.004B324C
004B793F . 8B15 B41D4C00 MOV EDX,DWORD PTR DS:[4C1DB4] ; FlashScr.004C18B8
004B7945 . 8B12 MOV EDX,DWORD PTR DS:[EDX]
004B7947 . 8D45 C4 LEA EAX,DWORD PTR SS:[EBP-3C]
004B794A . E8 BDD1F4FF CALL FlashScr.00404B0C
004B794F . 8B45 C4 MOV EAX,DWORD PTR SS:[EBP-3C] ; 注册名+Flash ScreenSaver Maker
004B7952 . 8D55 C8 LEA EDX,DWORD PTR SS:[EBP-38]
004B7955 . E8 8AEFFFFF CALL FlashScr.004B68E4
004B795A . 8D45 C8 LEA EAX,DWORD PTR SS:[EBP-38]
004B795D . 8D55 F8 LEA EDX,DWORD PTR SS:[EBP-8]
004B7960 . E8 F3EFFFFF CALL FlashScr.004B6958 : 此处调用是将“WW9900Flash ScreenSaver Maker”字符进行MD5加密
004B7965 . E9 AD000000 JMP FlashScr.004B7A17 生成密文9817c30edd06f75bea902cc508ece106,供伪码对比。高兴的话可进去看看。
向下F8来到
004B7A1A . BA 06000000 MOV EDX,6
004B7A1F . E8 28D4F4FF CALL FlashScr.00404E4C
004B7A24 . 8D45 F4 LEA EAX,DWORD PTR SS:[EBP-C]
004B7A27 . E8 ECD2F4FF CALL FlashScr.00404D18
004B7A2C . 8B15 3C1D4C00 MOV EDX,DWORD PTR DS:[4C1D3C] ; FlashScr.004C18BC
004B7A32 . 8B12 MOV EDX,DWORD PTR DS:[EDX]
004B7A34 . 8A52 03 MOV DL,BYTE PTR DS:[EDX+3] ; 取输入码的第四位
004B7A37 . 8810 MOV BYTE PTR DS:[EAX],DL
004B7A39 . 8D45 F4 LEA EAX,DWORD PTR SS:[EBP-C]
004B7A3C . E8 D7D2F4FF CALL FlashScr.00404D18
004B7A41 . 8B15 3C1D4C00 MOV EDX,DWORD PTR DS:[4C1D3C] ; FlashScr.004C18BC
004B7A47 . 8B12 MOV EDX,DWORD PTR DS:[EDX]
004B7A49 . 8A52 01 MOV DL,BYTE PTR DS:[EDX+1] ; 取输入码的第二位
004B7A4C . 8850 01 MOV BYTE PTR DS:[EAX+1],DL
004B7A4F . 8D45 F4 LEA EAX,DWORD PTR SS:[EBP-C]
004B7A52 . E8 C1D2F4FF CALL FlashScr.00404D18
004B7A57 . 8B15 3C1D4C00 MOV EDX,DWORD PTR DS:[4C1D3C] ; FlashScr.004C18BC
004B7A5D . 8B12 MOV EDX,DWORD PTR DS:[EDX]
004B7A5F . 8A52 02 MOV DL,BYTE PTR DS:[EDX+2] ; 取输入码的第三位
004B7A62 . 8850 02 MOV BYTE PTR DS:[EAX+2],DL
004B7A65 . 8D45 F4 LEA EAX,DWORD PTR SS:[EBP-C]
004B7A68 . E8 ABD2F4FF CALL FlashScr.00404D18
004B7A6D . 8B15 3C1D4C00 MOV EDX,DWORD PTR DS:[4C1D3C] ; FlashScr.004C18BC
004B7A73 . 8B12 MOV EDX,DWORD PTR DS:[EDX]
004B7A75 . 8A52 05 MOV DL,BYTE PTR DS:[EDX+5] ; 取输入码的第六位
004B7A78 . 8850 03 MOV BYTE PTR DS:[EAX+3],DL
004B7A7B . 8D45 F4 LEA EAX,DWORD PTR SS:[EBP-C]
004B7A7E . E8 95D2F4FF CALL FlashScr.00404D18
004B7A83 . 8B15 3C1D4C00 MOV EDX,DWORD PTR DS:[4C1D3C] ; FlashScr.004C18BC
004B7A89 . 8B12 MOV EDX,DWORD PTR DS:[EDX]
004B7A8B . 8A52 06 MOV DL,BYTE PTR DS:[EDX+6]
004B7A8E . 8850 04 MOV BYTE PTR DS:[EAX+4],DL ; 取输入码的第七位
004B7A91 . 8D45 F4 LEA EAX,DWORD PTR SS:[EBP-C]
004B7A94 . E8 7FD2F4FF CALL FlashScr.00404D18
004B7A99 . 8B15 3C1D4C00 MOV EDX,DWORD PTR DS:[4C1D3C] ; FlashScr.004C18BC
004B7A9F . 8B12 MOV EDX,DWORD PTR DS:[EDX]
004B7AA1 . 8A52 08 MOV DL,BYTE PTR DS:[EDX+8] ; 取输入码的第九位
004B7AA4 . 8850 05 MOV BYTE PTR DS:[EAX+5],DL
004B7AA7 .^ E9 BEFEFFFF JMP FlashScr.004B796A 跳到下面
004B7978 . 8D45 C0 LEA EAX,DWORD PTR SS:[EBP-40] ; (初始 cpu 选择)
004B797B . 8B55 F4 MOV EDX,DWORD PTR SS:[EBP-C]
004B797E . 8A12 MOV DL,BYTE PTR DS:[EDX]
004B7980 . E8 63D0F4FF CALL FlashScr.004049E8
004B7985 . 8B45 C0 MOV EAX,DWORD PTR SS:[EBP-40]
004B7988 . E8 5F15F5FF CALL FlashScr.00408EEC
004B798D . 8D0440 LEA EAX,DWORD PTR DS:[EAX+EAX*2]
004B7990 . 8B15 241B4C00 MOV EDX,DWORD PTR DS:[4C1B24] ; FlashScr.004C4854
004B7996 . 8D34C2 LEA ESI,DWORD PTR DS:[EDX+EAX*8]
004B7999 . 8D7D D8 LEA EDI,DWORD PTR SS:[EBP-28]
004B799C . B9 06000000 MOV ECX,6
004B79A1 . F3:A5 REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[>
004B79A3 . 33C0 XOR EAX,EAX
004B79A5 . 5A POP EDX
004B79A6 . 59 POP ECX
004B79A7 . 59 POP ECX
004B79A8 . 64:8910 MOV DWORD PTR FS:[EAX],EDX
004B79AB . /E9 FC000000 JMP FlashScr.004B7AAC : 此时eax显示假码“423679”
不管继续F8来到此处
004B7AAC > \BA 02000000 MOV EDX,2 ; edx=2
004B7AB1 . 8D45 DC LEA EAX,DWORD PTR SS:[EBP-24] ; eax=10
004B7AB4 > 8B4D F4 MOV ECX,DWORD PTR SS:[EBP-C] ; 按规律取的6位假码
004B7AB7 . 8A4C11 FF MOV CL,BYTE PTR DS:[ECX+EDX-1] ; 第一次取假码2,第二次取3,第三次取6,第四次取7,第五次取9
004B7ABB . 8B18 MOV EBX,DWORD PTR DS:[EAX] ; ebx=10
004B7ABD . 8B75 F8 MOV ESI,DWORD PTR SS:[EBP-8]
004B7AC0 . 3A4C1E FF CMP CL,BYTE PTR DS:[ESI+EBX-1] ; 比较所取假码的值与密文的值是否相等,此时可改CL值与DS:[XXXXXXXX]的值相同即
可继续分析
第一次取密文的第16位,第二次取第1位,第三次取第22位,第四次取第9位,第五次取倒数第4位
004B7AC4 74 53 JE SHORT FlashScr.004B7B19 不等就不跳(死),跳则循环(共判断五次)
004B7AC6 . 6A 10 PUSH 10
004B7AC8 . 68 4C7C4B00 PUSH FlashScr.004B7C4C ; error
004B7ACD . 68 547C4B00 PUSH FlashScr.004B7C54 ; register failed, please check user name and serial number.
004B7AD2 . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
004B7AD5 . E8 6603FBFF CALL FlashScr.00467E40
004B7ADA . 50 PUSH EAX ; |hOwner
004B7ADB . E8 34F9F4FF CALL <JMP.&user32.MessageBoxA> ; \MessageBoxA
004B7AE0 . A1 B41D4C00 MOV EAX,DWORD PTR DS:[4C1DB4]
004B7AE5 . E8 16CDF4FF CALL FlashScr.00404800
004B7AEA . A1 3C1D4C00 MOV EAX,DWORD PTR DS:[4C1D3C]
004B7AEF . E8 0CCDF4FF CALL FlashScr.00404800
004B7AF4 . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
004B7AF7 . 8B80 FC020000 MOV EAX,DWORD PTR DS:[EAX+2FC]
004B7AFD . 66:BE B5FF MOV SI,0FFB5
004B7B01 . E8 C2C0F4FF CALL FlashScr.00403BC8
004B7B06 . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
004B7B09 . 8B80 FC020000 MOV EAX,DWORD PTR DS:[EAX+2FC]
004B7B0F . E8 E4E2F9FF CALL FlashScr.00455DF8
004B7B14 . E9 FB000000 JMP FlashScr.004B7C14
004B7B19 > 42 INC EDX ; edx+1
004B7B1A . 83C0 04 ADD EAX,4 ; eax+4
004B7B1D . 83FA 07 CMP EDX,7
004B7B20 .^ 75 92 JNZ SHORT FlashScr.004B7AB4 ; 循环判断
004B7B22 . B2 01 MOV DL,1
004B7B20 .^\75 92 JNZ SHORT FlashScr.004B7AB4 ; 循环判断
004B7B22 . B2 01 MOV DL,1
004B7B24 . A1 A0AD4300 MOV EAX,DWORD PTR DS:[43ADA0]
004B7B29 . E8 7233F8FF CALL FlashScr.0043AEA0
004B7B2E . 8945 F0 MOV DWORD PTR SS:[EBP-10],EAX
004B7B31 . 33C0 XOR EAX,EAX
004B7B33 . 55 PUSH EBP
004B7B34 . 68 AA7B4B00 PUSH FlashScr.004B7BAA
004B7B39 . 64:FF30 PUSH DWORD PTR FS:[EAX]
004B7B3C . 64:8920 MOV DWORD PTR FS:[EAX],ESP
004B7B3F . BA 02000080 MOV EDX,80000002
004B7B44 . 8B45 F0 MOV EAX,DWORD PTR SS:[EBP-10]
004B7B47 . E8 F433F8FF CALL FlashScr.0043AF40
004B7B4C . 8B15 6C1B4C00 MOV EDX,DWORD PTR DS:[4C1B6C] ; FlashScr.004C18B0
004B7B52 . 8B12 MOV EDX,DWORD PTR DS:[EDX]
004B7B54 . B1 01 MOV CL,1
004B7B56 . 8B45 F0 MOV EAX,DWORD PTR SS:[EBP-10]
004B7B59 . E8 2235F8FF CALL FlashScr.0043B080
004B7B5E . 84C0 TEST AL,AL
004B7B60 . 74 32 JE SHORT FlashScr.004B7B94
004B7B62 . 8B0D B41D4C00 MOV ECX,DWORD PTR DS:[4C1DB4] ; FlashScr.004C18B8
004B7B68 . 8B09 MOV ECX,DWORD PTR DS:[ECX]
004B7B6A . BA 987C4B00 MOV EDX,FlashScr.004B7C98 ; username(在注册表中写入注册名)
004B7B6F . 8B45 F0 MOV EAX,DWORD PTR SS:[EBP-10]
004B7B72 . E8 A536F8FF CALL FlashScr.0043B21C
004B7B77 . 8B0D 3C1D4C00 MOV ECX,DWORD PTR DS:[4C1D3C] ; FlashScr.004C18BC
004B7B7D . 8B09 MOV ECX,DWORD PTR DS:[ECX]
004B7B7F . BA AC7C4B00 MOV EDX,FlashScr.004B7CAC ; serialnumber(在注册表中写入注册码)
--------------------------------------------------------------------------------
【经验总结】
注册算法(比较简单):
1、密文=MD5加密(注册名+固定字符“Flash ScreenSaver Maker”)
2、注册码的第2位应等于密文的第16位
3、注册码的第3位应等于密文的第1位
4、注册码的第六位应等于密文的第22位
5、注册码的第7位应等于密文的第9位
6、注册码的第9位应等于密文的倒数第4位
7、注册码的第4位、对应软件的4个的权限,数值不同,算法各异,可自行分析,以上算法是注册码第4位为4的情况。
8、注册机就不写了,用个MD5的计算工具,依次选一下就行了
可用的注册User Name:ww9900 Serial Number:1b9-45cd-8e0
ww990
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2006年05月19日 14:51:45
BWT:放个可用的注册机delhpi源代码