题目:注册相片装饰大师FrameMaster
软件功能:美国人开发的这个照片装饰大师软件,可以给数码相片添加各种眼花缭乱的边框效果。从数码相机和扫描仪获取数码相片后,可以很快地毫

不费力地直接应用华丽的相框,蒙版,叠加效果,阴影及各种边框效果。除此之外,你还可以添加各种小图片(橡皮图章)到相片上,起到画龙点睛的

效果。可以对相片大小进行修改,完全自己定制各种特性。未注册版试用期30天,过后必须注册。
软件来源:电脑爱好者2002光盘
破解工具:Softice, PEID, OD
破解目的:找出注册码(因为这个软件是明码比较,没有注册算法)

引子:今天又从光盘随便安装了这个相框大师,实验了一下效果不错。可惜只有30天试用期限。现在就一起来动手把它注册了吧。完整完毕,先用PEID

查看是否加壳,结果没有。是BC++写的。运行程序,打开HELP菜单,点击里面的Register命令,弹出注册窗口,在里面输入用户名和假注册码。比如

wanggang, 7878787878,调出SOFTICE,下断点bpx hmemcpy,F5退出,点击OK,被拦下。我们按7次F12即可回到主程序空间,然后再按F10跟踪,我们来

到如下代码处:
00446277  |. 8B4D 98        MOV ECX,DWORD PTR SS:[EBP-68]
0044627A  |. 8B81 E0020000  MOV EAX,DWORD PTR DS:[ECX+2E0]
00446280  |. E8 8BEC0700    CALL FRMMSTR.004C4F10
00446285  |. 8D45 F4        LEA EAX,DWORD PTR SS:[EBP-C]   //用户名地址送EAX。
00446288  |. E8 7F6BFFFF    CALL FRMMSTR.0043CE0C          //取用户名长度。
0044628D  |. 85C0           TEST EAX,EAX                
0044628F  |. 0F94C2         SETE DL
00446292  |. 83E2 01        AND EDX,1
00446295  |. 52             PUSH EDX                              
00446296  |. FF4D B8        DEC DWORD PTR SS:[EBP-48]      
00446299  |. 8D45 F4        LEA EAX,DWORD PTR SS:[EBP-C]        
0044629C  |. BA 02000000    MOV EDX,2                             
004462A1  |. E8 8E1D0E00    CALL FRMMSTR.00528034         //测试用户名是否为空。
004462A6  |. 59             POP ECX                            
004462A7  |. 84C9           TEST CL,CL
004462A9  |. 74 74          JE SHORT FRMMSTR.0044631F     //如果用户名名为空,则OK,否则走到下面提示框。
004462AB  |. 6A 00          PUSH 0
004462AD  |. 8D45 92        LEA EAX,DWORD PTR SS:[EBP-6E]
004462B0  |. E8 2331FFFF    CALL FRMMSTR.004393D8
004462B5  |. B2 02          MOV DL,2
004462B7  |. E8 5031FFFF    CALL FRMMSTR.0043940C
004462BC  |. 66:8B08        MOV CX,WORD PTR DS:[EAX]
004462BF  |. 51             PUSH ECX
004462C0  |. 66:C745 AC 380>MOV WORD PTR SS:[EBP-54],38
004462C6  |. BA 786D5400    MOV EDX,FRMMSTR.00546D78      ;  ASCII "Please enter your name"
004462CB  |. 8D45 F0        LEA EAX,DWORD PTR SS:[EBP-10]
004462CE  |. E8 4D1C0E00    CALL FRMMSTR.00527F20
*省略多行
0044631F  |> 66:C745 AC 440>MOV WORD PTR SS:[EBP-54],44   //用户名不为空则跳到这里来。
00446325  |. 8D45 EC        LEA EAX,DWORD PTR SS:[EBP-14]
00446328  |. E8 CF1EFFFF    CALL FRMMSTR.004381FC
0044632D  |. 8BD0           MOV EDX,EAX                   
0044632F  |. FF45 B8        INC DWORD PTR SS:[EBP-48]
00446332  |. 8B4D 98        MOV ECX,DWORD PTR SS:[EBP-68]
00446335  |. 8B81 D0020000  MOV EAX,DWORD PTR DS:[ECX+2D0]   
0044633B  |. E8 D0EB0700    CALL FRMMSTR.004C4F10         
00446340  |. 8D55 EC        LEA EDX,DWORD PTR SS:[EBP-14]
00446343  |. 8B12           MOV EDX,DWORD PTR DS:[EDX]
00446345  |. A1 905D5500    MOV EAX,DWORD PTR DS:[555D90]
0044634A  |. 8B00           MOV EAX,DWORD PTR DS:[EAX]
0044634C  |. E8 03A0FFFF    CALL FRMMSTR.00440354         //这是关键函数,F8跟入,代码在后面分析。
00446351  |. 50             PUSH EAX                      
00446352  |. FF4D B8        DEC DWORD PTR SS:[EBP-48]            
00446355  |. 8D45 EC        LEA EAX,DWORD PTR SS:[EBP-14]           
00446358  |. BA 02000000    MOV EDX,2                              
0044635D  |. E8 D21C0E00    CALL FRMMSTR.00528034                   
00446362  |. 59             POP ECX                                 
00446363  |. 84C9           TEST CL,CL                   //这是注册码正确与否的标志
00446365  |. 0F84 25020000  JE FRMMSTR.00446590          // CL为0则跳走,当然是死路一条啦。
0044636B  |. B2 01          MOV DL,1                     //下面这一大堆都是在注册成功后向注册表写内容的过程。
0044636D  |. A1 3C444800    MOV EAX,DWORD PTR DS:[48443C]
00446372  |. E8 1DE20300    CALL FRMMSTR.00484594
00446377  |. 8945 8C        MOV DWORD PTR SS:[EBP-74],EAX   
0044637A  |. 66:C745 AC 140>MOV WORD PTR SS:[EBP-54],14
00446380  |. BA 02000080    MOV EDX,80000002
00446385  |. 8B45 8C        MOV EAX,DWORD PTR SS:[EBP-74]
00446388  |. E8 8B1B0E00    CALL FRMMSTR.00527F18
0044638D  |. 66:C745 AC 500>MOV WORD PTR SS:[EBP-54],50
00446393  |. BA 8F6D5400    MOV EDX,FRMMSTR.00546D8F   ;  ASCII "\SOFTWARE\Microsoft\CORBA Specs\Key" //这个是在HKEY_Local_Machine下

面创建的。注册成功后,你输入的注册码就那里可以看到,是明码。
00446398  |. 8D45 E8        LEA EAX,DWORD PTR SS:[EBP-18]
0044639B  |. E8 801B0E00    CALL FRMMSTR.00527F20
*省去很多行
0044643F  |. 66:C745 AC 680>MOV WORD PTR SS:[EBP-54],68
00446445  |. BA B76D5400    MOV EDX,FRMMSTR.00546DB7   ;ASCII "Thank you for ordering FrameMaster!
Your support is much appreciated.
Please store the registration key in case you need it later.
"
0044644A  |. 8D45 DC        LEA EAX,DWORD PTR SS:[EBP-24]
0044644D  |. E8 CE1A0E00    CALL FRMMSTR.00527F20
00446452  |. FF45 B8        INC DWORD PTR SS:[EBP-48]               
00446455  |. 8B00           MOV EAX,DWORD PTR DS:[EAX]               
00446457  |. B2 02          MOV DL,2                                
00446459  |. 59             POP ECX                                 
0044645A  |. E8 1D8B0700    CALL FRMMSTR.004BEF7C                   
0044645F  |. FF4D B8        DEC DWORD PTR SS:[EBP-48]
00446462  |. 8D45 DC        LEA EAX,DWORD PTR SS:[EBP-24]
00446465  |. BA 02000000    MOV EDX,2
0044646A  |. E8 C51B0E00    CALL FRMMSTR.00528034
0044646F  |> 66:C745 AC 740>MOV WORD PTR SS:[EBP-54],74
00446475  |. BA 3B6E5400    MOV EDX,FRMMSTR.00546E3B   ;ASCII "\SOFTWARE\Galleria Software\FrameMaster\Registrant"          //这个是

在HKEY_LOCAL_MACHINE下面建立的。用户名在里面。
0044647A  |. 8D45 D8        LEA EAX,DWORD PTR SS:[EBP-28]
*省去多行
004464C2  |. 8D55 D0        LEA EDX,DWORD PTR SS:[EBP-30]   //用户名地址送EDX
004464C5  |. FF32           PUSH DWORD PTR DS:[EDX]
004464C7  |. 66:C745 AC 800>MOV WORD PTR SS:[EBP-54],80
004464CD  |. BA 6E6E5400    MOV EDX,FRMMSTR.00546E6E      ;ASCII "Registrant"
004464D2  |. 8D45 D4        LEA EAX,DWORD PTR SS:[EBP-2C]
004464D5  |. E8 461A0E00    CALL FRMMSTR.00527F20
004464DA  |. FF45 B8        INC DWORD PTR SS:[EBP-48]
004464DD  |. 8B10           MOV EDX,DWORD PTR DS:[EAX]
*省去多行
00446584  |> A1 987D5500    MOV EAX,DWORD PTR DS:[_frmRegister]
00446589  |. E8 36950600    CALL FRMMSTR.004AFAC4
0044658E  |. EB 59          JMP SHORT FRMMSTR.004465E9     //如果注册成功,则走到这里,然后跳到下面。
00446590  |> 68 D0070000    PUSH 7D0                     ; /Timeout = 2000. ms//如果注册码不正确,则直接来到这里,打个2000MS的盹,然

后显示一个不成功对话框。
00446595  |. E8 EA8C0F00    CALL <JMP.&KERNEL32.Sleep>    ; \Sleep
0044659A  |. 6A 00          PUSH 0
0044659C  |. 8D45 88        LEA EAX,DWORD PTR SS:[EBP-78]
0044659F  |. E8 342EFFFF    CALL FRMMSTR.004393D8
004465A4  |. B2 02          MOV DL,2
004465A6  |. E8 612EFFFF    CALL FRMMSTR.0043940C
004465AB  |. 66:8B08        MOV CX,WORD PTR DS:[EAX]
004465AE  |. 51             PUSH ECX
004465AF  |. 66:C745 AC B00>MOV WORD PTR SS:[EBP-54],0B0
004465B5  |. BA 7A6E5400    MOV EDX,FRMMSTR.00546E7A      ;  ASCII "Failed Registration"
004465BA  |. 8D45 C0        LEA EAX,DWORD PTR SS:[EBP-40]
004465BD  |. E8 5E190E00    CALL FRMMSTR.00527F20
004465C2  |. FF45 B8        INC DWORD PTR SS:[EBP-48]              
004465C5  |. 8B00           MOV EAX,DWORD PTR DS:[EAX]               
004465C7  |. B2 01          MOV DL,1                                
004465C9  |. 59             POP ECX                                 
004465CA  |. E8 AD890700    CALL FRMMSTR.004BEF7C          //这个CALL出现错误提示。
004465CF  |. FF4D B8        DEC DWORD PTR SS:[EBP-48]
004465D2  |. 8D45 C0        LEA EAX,DWORD PTR SS:[EBP-40]
*略去多行。
================================================================================
下面我们看0044634C处的函数调用 CALL FRMMSTR.00440354 ,代码如下:
*函数前面部分代码省去,下面是黑名单比较。  
004404AB  |. FF85 18FFFFFF     INC DWORD PTR SS:[EBP-E8]
004404B1  |. BA C5285400       MOV EDX,FRMMSTR.005428C5                 ;  ASCII "KD8383VMDKKAAAL-LLF4VVIII34AAAAA-LLF4VVIII34AAAAA"
004404B6  |. 8D45 84           LEA EAX,DWORD PTR SS:[EBP-7C]
004404B9  |. E8 627A0E00       CALL FRMMSTR.00527F20
004404BE  |. FF85 18FFFFFF     INC DWORD PTR SS:[EBP-E8]
004404C4  |. BA F7285400       MOV EDX,FRMMSTR.005428F7                 ;  ASCII "344DDDDAAKKAAAB-VVIII34AAAAABBF4-LLF4VVIII34AAAAA"
004404C9  |. 8D45 88           LEA EAX,DWORD PTR SS:[EBP-78]
004404CC  |. E8 4F7A0E00       CALL FRMMSTR.00527F20
004404D1  |. FF85 18FFFFFF     INC DWORD PTR SS:[EBP-E8]
004404D7  |. BA 29295400       MOV EDX,FRMMSTR.00542929                 ;  ASCII "344DDDDAAKVVIII-34AAAAAKAAABBBF4-LLF4VVIII34AAAAA"
004404DC  |. 8D45 8C           LEA EAX,DWORD PTR SS:[EBP-74]
004404DF  |. E8 3C7A0E00       CALL FRMMSTR.00527F20
004404E4  |. FF85 18FFFFFF     INC DWORD PTR SS:[EBP-E8]
004404EA  |. BA 5B295400       MOV EDX,FRMMSTR.0054295B                 ;  ASCII "344DDVVIII34AAA-AADDAAKKAAABBBF4-LLF4VVIII34AAAAA"
004404EF  |. 8D45 90           LEA EAX,DWORD PTR SS:[EBP-70]
004404F2  |. E8 297A0E00       CALL FRMMSTR.00527F20
004404F7  |. FF85 18FFFFFF     INC DWORD PTR SS:[EBP-E8]
004404FD  |. BA 8D295400       MOV EDX,FRMMSTR.0054298D                 ;  ASCII "344DDDDAAKVVIII-34AAAAAKAAABBBF4-LLF4VVIII34AAAAA"
00440502  |. 8D45 94           LEA EAX,DWORD PTR SS:[EBP-6C]
00440505  |. E8 167A0E00       CALL FRMMSTR.00527F20
0044050A  |. FF85 18FFFFFF     INC DWORD PTR SS:[EBP-E8]
00440510  |. BA BF295400       MOV EDX,FRMMSTR.005429BF                 ;  ASCII "VVIII34AAAAA344-DDDDAAKKAAABBBF4-LLF4VVIII34AAAAA"
00440515  |. 8D45 98           LEA EAX,DWORD PTR SS:[EBP-68]
00440518  |. E8 037A0E00       CALL FRMMSTR.00527F20
0044051D  |. FF85 18FFFFFF     INC DWORD PTR SS:[EBP-E8]
00440523  |. BA F1295400       MOV EDX,FRMMSTR.005429F1                 ;  ASCII "344DDDDVVIII34A-AAAAAAKKAAABBBF4-LLF4VVIII34AAAAA"
00440528  |. 8D45 9C           LEA EAX,DWORD PTR SS:[EBP-64]
0044052B  |. E8 F0790E00       CALL FRMMSTR.00527F20
00440530  |. FF85 18FFFFFF     INC DWORD PTR SS:[EBP-E8]
00440536  |. BA 232A5400       MOV EDX,FRMMSTR.00542A23                 ;  ASCII "344DDDDAAVVIII3-4AAAAAKKAAABBBF4-LLF4VVIII34AAAAA"
0044053B  |. 8D45 A0           LEA EAX,DWORD PTR SS:[EBP-60]
0044053E  |. E8 DD790E00       CALL FRMMSTR.00527F20
00440543  |. FF85 18FFFFFF     INC DWORD PTR SS:[EBP-E8]
00440549  |. BA 552A5400       MOV EDX,FRMMSTR.00542A55                 ;  ASCII "344DDDDAVVIII34-AAAAAAKKAAABBBF4-LLF4VVIII34AAAAA"
0044054E  |. 8D45 A4           LEA EAX,DWORD PTR SS:[EBP-5C]
00440551  |. E8 CA790E00       CALL FRMMSTR.00527F20
00440556  |. FF85 18FFFFFF     INC DWORD PTR SS:[EBP-E8]
0044055C  |. BA 872A5400       MOV EDX,FRMMSTR.00542A87                 ;  ASCII "344DDDDAAKKAVVI-II34AAAAAAABBBF4-LLF4VVIII34AAAAA"
00440561  |. 8D45 A8           LEA EAX,DWORD PTR SS:[EBP-58]
00440564  |. E8 B7790E00       CALL FRMMSTR.00527F20
00440569  |. FF85 18FFFFFF     INC DWORD PTR SS:[EBP-E8]
0044056F  |. BA B92A5400       MOV EDX,FRMMSTR.00542AB9                 ;  ASCII "344DDDDAAKKVVII-I34AAAAAAAABBBF4-LLF4VVIII34AAAAA"
00440574  |. 8D45 AC           LEA EAX,DWORD PTR SS:[EBP-54]
00440577  |. E8 A4790E00       CALL FRMMSTR.00527F20
0044057C  |. FF85 18FFFFFF     INC DWORD PTR SS:[EBP-E8]
00440582  |. BA EB2A5400       MOV EDX,FRMMSTR.00542AEB                 ;  ASCII "5666DDDAAKKAVVI-II34AAAAAAABBBF4-LLF4VVIII34AAAAA"
00440587  |. 8D45 B0           LEA EAX,DWORD PTR SS:[EBP-50]
0044058A  |. E8 91790E00       CALL FRMMSTR.00527F20
0044058F  |. FF85 18FFFFFF     INC DWORD PTR SS:[EBP-E8]
00440595  |. BA 1D2B5400       MOV EDX,FRMMSTR.00542B1D                 ;  ASCII "KJ4DDDDAAKKAAVV-III34AAAAAABBBF4-LLF4VVIII34AAAAA"
0044059A  |. 8D45 B4           LEA EAX,DWORD PTR SS:[EBP-4C]
0044059D  |. E8 7E790E00       CALL FRMMSTR.00527F20
004405A2  |. FF85 18FFFFFF     INC DWORD PTR SS:[EBP-E8]
004405A8  |. BA 4F2B5400       MOV EDX,FRMMSTR.00542B4F                 ;  ASCII "3447777AVVIII34-AAAAAAKKAAABBBF4-LLF4VVIII34AAAAA"
004405AD  |. 8D45 B8           LEA EAX,DWORD PTR SS:[EBP-48]
004405B0  |. E8 6B790E00       CALL FRMMSTR.00527F20
004405B5  |. FF85 18FFFFFF     INC DWORD PTR SS:[EBP-E8]
004405BB  |. BA 812B5400       MOV EDX,FRMMSTR.00542B81                 ;  ASCII "344DDDDAAKKVVII-I34AAAAAAAABBBF4-LLF4VVIII34AAAAA"
*省去很多行
004408E0  |. 8D95 30FFFFFF     ||LEA EDX,DWORD PTR SS:[EBP-D0]
004408E6  |. 8D45 FC           ||LEA EAX,DWORD PTR SS:[EBP-4]
004408E9  |. E8 16780E00       ||CALL FRMMSTR.00528104         //这个CALL和下面构成经典结构。所以F8跟入。
004408EE  |. 84C0              ||TEST AL,AL
004408F0  |. 0F84 BD000000     ||JE FRMMSTR.004409B3           //测试AL标志,如果为不为0则不跳,不跳则OK。
004408F6  |. B0 01             ||MOV AL,1
004408F8  |. 50                ||PUSH EAX                       
004408F9  |. FF8D 18FFFFFF     ||DEC DWORD PTR SS:[EBP-E8]
004408FF  |. 8D85 30FFFFFF     ||LEA EAX,DWORD PTR SS:[EBP-D0]
*省去若干行
0044098A  |. 83C4 14           ||ADD ESP,14
0044098D  |. FF8D 18FFFFFF     ||DEC DWORD PTR SS:[EBP-E8]
00440993  |. 8D45 FC           ||LEA EAX,DWORD PTR SS:[EBP-4]
00440996  |. BA 02000000       ||MOV EDX,2
0044099B  |. E8 94760E00       ||CALL FRMMSTR.00528034
004409A0  |. 58                ||POP EAX                               
004409A1  |. 8B95 FCFEFFFF     ||MOV EDX,DWORD PTR SS:[EBP-104]         
004409A7  |. 64:8915 00000000  ||MOV DWORD PTR FS:[0],EDX
004409AE  |. E9 E7000000       ||JMP FRMMSTR.00440A9A     //程序到这里就直接跳到下面(*)代码处。
*省去若干行
00440A87  |. E8 A8750E00       CALL FRMMSTR.00528034
00440A8C  |. 58                POP EAX                                  
00440A8D  |. 8B95 FCFEFFFF     MOV EDX,DWORD PTR SS:[EBP-104]           
00440A93  |. 64:8915 00000000  MOV DWORD PTR FS:[0],EDX
00440A9A  |> 8BE5              MOV ESP,EBP               //跳到这里则成功。--------------(*)
00440A9C  |. 5D                POP EBP                                
00440A9D  \. C3                RETN
=============================================================================
下面继续分析004408E9 CALL FRMMSTR.00528104代码:
00528104  /$ 55                PUSH EBP
00528105  |. 8BEC              MOV EBP,ESP
00528107  |. 53                PUSH EBX
00528108  |. 8B00              MOV EAX,DWORD PTR DS:[EAX]
0052810A  |. 8B12              MOV EDX,DWORD PTR DS:[EDX]
0052810C  |. E8 1BF9FDFF       CALL FRMMSTR.00507A2C        //这个函数内就这一个关键函数调用,F8跟入。
00528111  |. 0F94C0            SETE AL
00528114  |. 83E0 01           AND EAX,1
00528117  |. 5B                POP EBX                  
00528118  |. 5D                POP EBP                                 
00528119  \. C3                RETN
=============================================================================
下面是0052810C CALL FRMMSTR.00507A2C函数的代码,这里就是关键地方了 。
00507A43  |. 8B46 FC           MOV EAX,DWORD PTR DS:[ESI-4]    //假码长度送EAX。
00507A46  |. 8B57 FC           MOV EDX,DWORD PTR DS:[EDI-4]    //真码长度送EAX。
00507A49  |. 29D0              SUB EAX,EDX                     //假码长度减去真码长度。这里假码是10位,真码是48位。结果是-38。
00507A4B  |. 77 02             JA SHORT FRMMSTR.00507A4F       //假码长度大于真码则跳。
00507A4D  |. 01C2              ADD EDX,EAX                     // 上面差值-38加到EDX上,就是EDX=48-38=10位。也就是下面只比较你这十位

是否相同了。
00507A4F  |> 52                PUSH EDX  
00507A50  |. C1EA 02           SHR EDX,2        //计数器初始化。
00507A53  |. 74 26             JE SHORT FRMMSTR.00507A7B
00507A55  |> 8B0E              /MOV ECX,DWORD PTR DS:[ESI]     //假码前4个字节送ECX。
00507A57  |. 8B1F              |MOV EBX,DWORD PTR DS:[EDI]     //真码前4个字节送EBX。
00507A59  |. 39D9              |CMP ECX,EBX         //比较真假。
00507A5B  |. 75 58             |JNZ SHORT FRMMSTR.00507AB5     //不同则OVER。
00507A5D  |. 4A                |DEC EDX      //计数器减1。
00507A5E  |. 74 15             |JE SHORT FRMMSTR.00507A75      //为0则跳走。
00507A60  |. 8B4E 04           |MOV ECX,DWORD PTR DS:[ESI+4]   //假码下4个字节送ECX。
00507A63  |. 8B5F 04           |MOV EBX,DWORD PTR DS:[EDI+4]   //真码下4个字节送EBX。
00507A66  |. 39D9              |CMP ECX,EBX  //比较真假。
00507A68  |. 75 4B             |JNZ SHORT FRMMSTR.00507AB5     //不同则OVER。
00507A6A  |. 83C6 08           |ADD ESI,8       //地址增量
00507A6D  |. 83C7 08           |ADD EDI,8      //地址增量
00507A70  |. 4A                |DEC EDX         //计数器减量
00507A71  |.^75 E2             \JNZ SHORT FRMMSTR.00507A55    //不为0则往上循环。
00507A73  |. EB 06             JMP SHORT FRMMSTR.00507A7B     //如果上面循环结束,直接跳转。
00507A75  |> 83C6 04           ADD ESI,4
00507A78  |. 83C7 04           ADD EDI,4
00507A7B  |> 5A                POP EDX                        //计数器重新赋值
00507A7C  |. 83E2 03           AND EDX,3
00507A7F  |. 74 22             JE SHORT FRMMSTR.00507AA3
00507A81  |. 8B0E              MOV ECX,DWORD PTR DS:[ESI]     //剩余假码送ECX,因为可能注册码长度并非4的倍数。
00507A83  |. 8B1F              MOV EBX,DWORD PTR DS:[EDI]     //剩余真码送EBX。
00507A85  |. 38D9              CMP CL,BL         //比较真假。
00507A87  |. 75 41             JNZ SHORT FRMMSTR.00507ACA     //不同则OVER。
00507A89  |. 4A                DEC EDX          //计数器减量
00507A8A  |. 74 17             JE SHORT FRMMSTR.00507AA3       //为0则跳走。
00507A8C  |. 38FD              CMP CH,BH  
00507A8E  |. 75 3A             JNZ SHORT FRMMSTR.00507ACA
00507A90  |. 4A                DEC EDX   //计数器减量
00507A91  |. 74 10             JE SHORT FRMMSTR.00507AA3      //为0则跳走。
00507A93  |. 81E3 0000FF00     AND EBX,0FF0000                //如果还有第三个字节,则用与运算取出。
00507A99  |. 81E1 0000FF00     AND ECX,0FF0000                //同上。
00507A9F  |. 39D9              CMP ECX,EBX                    //比较真假。
00507AA1  |. 75 27             JNZ SHORT FRMMSTR.00507ACA     //不同则OVER。
00507AA3  |> 01C0              ADD EAX,EAX                              ;  FRMMSTR.<ModuleEntryPoint>
00507AA5  |. EB 23             JMP SHORT FRMMSTR.00507ACA     //从这里跳走才算成功的。
*省去多行
00507ACA  |> 5F                POP EDI                                 
00507ACB  |. 5E                POP ESI                                  
00507ACC  |. 5B                POP EBX                                 
00507ACD  \. C3                RETN
=============================================================================
后记:

经过1个小时的跟踪,1个小时写出破文来,虽然这个软件最后是明码比较,我还没有发现这个真码怎么计算出来的,好象不明显。进入前面那个比较真

假的函数,你立即就可以看到真码了。当然还有10几个假码在那里列出来了,不要被它所迷惑哟。只有用它自动取的那个注册码才可以成功(废话,假

码跟它也不相等啊。)

虽然没有困难找出注册码,但如何分析出注册码的算法是关键。我还需要继续分析。先把这个笔记POST出来再说吧。

浪费您时间阅读此文,十分感谢!再次向关注我的破文的各位表示感谢!!


结果:
UserName:     wanggang
RegisterCode: D8383VMDKKAAAL-LLF4VVIII34AAAAA-LLF4VVIII34AA1-1


2006年1月17日晚完稿