题    目:注册宇宙图象创作大师Universe Image Creator v1.6
软件介绍:经过试用,发现这个美国人开发的软件可以使用各种现成的模板创作出令人目眩的宇宙空间图象,不用3分钟,一个

神秘的宇宙美景就出现在您的眼前了,太令人惊奇了。未注册版本无法使用一些太空物体图象,比如旋涡,行星,镜头眩光效

果,银河系等等。还有许多太空现象可以用来创建一个适当的完美的太空景象,比如星云,各种颜色的星星,星际气团,球状

星团等等。非常棒的软件。

破解目的:分析注册码算法逻辑,找出注册码。
破解工具:SoftICE,PEID。

引子:今天安装了这个软件试用一下,发现软件虽小,功能强大。可是没有注册的版本无法使用好几个比较关键的图象模板,

比如银河系等,如果没有这些关键素材,制作的图象效果就差远了。所以,我们还是把它注册了吧。否则无法使用这些漂亮的

模板元素,真是一个不小的遗憾呢!!下面开始。拿出PEID查看是否加壳。发现没有加壳,用VC++开发。运行软件,点击help

,然后点击Register,输入UserName是wanggang,UserKey是654321。调出SOFTICE,下断点bpx getwindowtexta, 按一次F11来

到主程序。

00462C8B  |. FF15 A8854700  CALL DWORD PTR DS:[<&USER32.GetWindowTextA>]
00462C91  |. 8D45 18        LEA EAX,DWORD PTR SS:[EBP+18]     //我们来到这里
00462C94  |. 50             PUSH EAX
00462C95  |. 8D45 E0        LEA EAX,DWORD PTR SS:[EBP-20]
00462C98  |. FF75 10        PUSH DWORD PTR SS:[EBP+10]
00462C9B  |. 50             PUSH EAX
00462C9C  |. E8 22FFFFFF    CALL UNIVERSE.00462BC3            //我们看看这个函数干什么。
00462CA1  |. 85C0           TEST EAX,EAX
00462CA3  |. 75 2F          JNZ SHORT UNIVERSE.00462CD4
============================================================
00462BC3  /$ 55             PUSH EBP
00462BC4  |. 8BEC           MOV EBP,ESP
*省去多行
00462C01  |. E8 C602FEFF    CALL UNIVERSE.00442ECC           //F8跟入这个函数
00462C06  |. EB 11          JMP SHORT UNIVERSE.00462C19
00462C08  |> 80FB 2D        CMP BL,2D
00462C0B  |. 74 3D          JE SHORT UNIVERSE.00462C4A
00462C0D  |. 8D45 08        LEA EAX,DWORD PTR SS:[EBP+8]
============================================================
00442ECC  /$ 6A 00          PUSH 0
00442ECE  |. FF7424 10      PUSH DWORD PTR SS:[ESP+10]
00442ED2  |. FF7424 10      PUSH DWORD PTR SS:[ESP+10]
00442ED6  |. FF7424 10      PUSH DWORD PTR SS:[ESP+10]
00442EDA  |. E8 04000000    CALL UNIVERSE.00442EE3           //F8跟入这个函数
00442EDF  |. 83C4 10        ADD ESP,10
00442EE2  \. C3             RETN
============================================================
00442ECC  /$ 6A 00          PUSH 0
*省去多行
00442EF3  |. 8A1F           MOV BL,BYTE PTR DS:[EDI]         //第一位注册码送BL。
00442EF5  |. 8D77 01        LEA ESI,DWORD PTR DS:[EDI+1]     //第二位假码地址送ESI。
00442EF8  |. 8975 FC        MOV DWORD PTR SS:[EBP-4],ESI
00442EFB  |> 833D 60154900 >/CMP DWORD PTR DS:[491560],1
*省去几行
00442F13  |> 8B0D 54134900  |MOV ECX,DWORD PTR DS:[491354]
00442F19  |. 0FB6C3         |MOVZX EAX,BL                    //第一位假码扩展后送EAX。
00442F1C  |. 8A0441         |MOV AL,BYTE PTR DS:[ECX+EAX*2]  //参与地址计算,找到一个值84h送AL。
00442F1F  |. 83E0 08        |AND EAX,8                       //与8相与。
00442F22  |> 85C0           |TEST EAX,EAX
00442F24  |. 74 05          |JE SHORT UNIVERSE.00442F2B      //此处顺其自然跳。
00442F26  |. 8A1E           |MOV BL,BYTE PTR DS:[ESI]
00442F28  |. 46             |INC ESI
00442F29  |.^EB D0          \JMP SHORT UNIVERSE.00442EFB
00442F2B  |> 80FB 2D        CMP BL,2D                         //第一位假码与2D比较。
00442F2E  |. 8975 FC        MOV DWORD PTR SS:[EBP-4],ESI
00442F31  |. 75 06          JNZ SHORT UNIVERSE.00442F39       //此处顺其自然跳。
00442F33  |. 834D 14 02     OR DWORD PTR SS:[EBP+14],2
00442F37  |. EB 05          JMP SHORT UNIVERSE.00442F3E
00442F39  |> 80FB 2B        CMP BL,2B                         //第一位假码与2B比较。
00442F3C  |. 75 06          JNZ SHORT UNIVERSE.00442F44       //此处顺其自然跳。
00442F3E  |> 8A1E           MOV BL,BYTE PTR DS:[ESI]
00442F40  |. 46             INC ESI
00442F41  |. 8975 FC        MOV DWORD PTR SS:[EBP-4],ESI
00442F44  |> 8B45 10        MOV EAX,DWORD PTR SS:[EBP+10]    //把一个常量'A' 送EAX
00442F47  |. 85C0           TEST EAX,EAX
00442F49  |. 0F8C 89010000  JL UNIVERSE.004430D8
00442F4F  |. 83F8 01        CMP EAX,1
00442F52  |. 0F84 80010000  JE UNIVERSE.004430D8
00442F58  |. 83F8 24        CMP EAX,24   
00442F5B  |. 0F8F 77010000  JG UNIVERSE.004430D8             //如果EAX大于24H则跳。
00442F61  |. 6A 10          PUSH 10
00442F63  |. 85C0           TEST EAX,EAX
00442F65  |. 59             POP ECX
00442F66  |. 75 24          JNZ SHORT UNIVERSE.00442F8C       //此处跳。
*省略几行
00442F8C  |> 394D 10        CMP DWORD PTR SS:[EBP+10],ECX     //常量'A'与16h比较。
00442F8F  |. 75 17          JNZ SHORT UNIVERSE.00442FA8       //不等则跳走。
*省略几行
00442FA8  |> 83C8 FF        OR EAX,FFFFFFFF                   //'A' 与常量-1或运算。
00442FAB  |. 33D2           XOR EDX,EDX
00442FAD  |. F775 10        DIV DWORD PTR SS:[EBP+10]         // EAX=EAX/A
00442FB0  |. BF 03010000    MOV EDI,103
00442FB5  |. 8945 F4        MOV DWORD PTR SS:[EBP-C],EAX      //EAX=19999999h
00442FB8  |> 833D 60154900 >/CMP DWORD PTR DS:[491560],1 
00442FBF  |. 0FB6F3         |MOVZX ESI,BL
00442FC2  |. 7E 0C          |JLE SHORT UNIVERSE.00442FD0      //自然跳走。
*****
00442FD0  |> A1 54134900    |MOV EAX,DWORD PTR DS:[491354]    // 一地址送EAX。
00442FD5  |. 8A0470         |MOV AL,BYTE PTR DS:[EAX+ESI*2]    //取出一个84h送AL。
00442FD8  |. 83E0 04        |AND EAX,4
00442FDB  |> 85C0           |TEST EAX,EAX
00442FDD  |. 74 08          |JE SHORT UNIVERSE.00442FE7
00442FDF  |. 0FBECB         |MOVSX ECX,BL                      //第一位假码符号扩展后送ECX。
00442FE2  |. 83E9 30        |SUB ECX,30                        //减去30h,变成16进制数。
00442FE5  |. EB 32          |JMP SHORT UNIVERSE.00443019      //跳走。
*****
00443019  |> 3B4D 10        |CMP ECX,DWORD PTR SS:[EBP+10]    //ECX与常量'A'比较。ECX=6。
0044301C  |. 73 36          |JNB SHORT UNIVERSE.00443054
0044301E  |. 8B75 F8        |MOV ESI,DWORD PTR SS:[EBP-8]  
00443021  |. 834D 14 08     |OR DWORD PTR SS:[EBP+14],8
00443025  |. 3B75 F4        |CMP ESI,DWORD PTR SS:[EBP-C]    //ESI 与19999999h比较。
00443028  |. 72 14          |JB SHORT UNIVERSE.0044303E      //跳走。
*****
0044303E  |> 0FAF75 10      |IMUL ESI,DWORD PTR SS:[EBP+10]  // ESI与常量'A'相乘,就是扩大10倍。
00443042  |. 03F1           |ADD ESI,ECX                     //把ECX加到ESI
00443044  |. 8975 F8        |MOV DWORD PTR SS:[EBP-8],ESI    //保存累加和
00443047  |> 8B45 FC        |MOV EAX,DWORD PTR SS:[EBP-4]    //下一位假码的地址送EAX。
0044304A  |. FF45 FC        |INC DWORD PTR SS:[EBP-4]        //假码地址增1。
0044304D  |. 8A18           |MOV BL,BYTE PTR DS:[EAX]         //下位假码送BL。
0044304F  |.^E9 64FFFFFF    \JMP UNIVERSE.00442FB8            //循环到上面。
注:上面这个循环就是把你的假码换算为16进制。比如654321被转换为9FBF1h。下面继续;
00443090  |. 3975 F8        CMP DWORD PTR SS:[EBP-8],ESI     //ESI与7FFFFFFF比较。
00443093  |. 76 27          JBE SHORT UNIVERSE.004430BC      //当然ESI不大于7FFFFFFF则跳走。
*****
004430BC  |> 85DB           TEST EBX,EBX
004430BE  |. 74 05          JE SHORT UNIVERSE.004430C5
004430C0  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
004430C3  |. 8903           MOV DWORD PTR DS:[EBX],EAX
004430C5  |> F645 14 02     TEST BYTE PTR SS:[EBP+14],2
004430C9  |. 74 08          JE SHORT UNIVERSE.004430D3
004430CB  |. 8B45 F8        MOV EAX,DWORD PTR SS:[EBP-8]
004430CE  |. F7D8           NEG EAX
004430D0  |. 8945 F8        MOV DWORD PTR SS:[EBP-8],EAX
004430D3  |> 8B45 F8        MOV EAX,DWORD PTR SS:[EBP-8]      //EAX=假码十六进制的结果。
============================================================
下面返回到下面代码处:
0040AC80  |. 8B88 98000000  MOV ECX,DWORD PTR DS:[EAX+98]
0040AC86  |. 51             PUSH ECX
0040AC87  |. 8B55 F4        MOV EDX,DWORD PTR SS:[EBP-C]
0040AC8A  |. 81C2 9C000000  ADD EDX,9C
0040AC90  |. 52             PUSH EDX
0040AC91  |. B9 50794900    MOV ECX,UNIVERSE.00497950
0040AC96  |. E8 F3C00000    CALL UNIVERSE.00416D8E           //F8跟入这个CALL。
******
00416DA5  |> 8B4D FC        MOV ECX,DWORD PTR SS:[EBP-4]
00416DA8  |. 8B51 10        MOV EDX,DWORD PTR DS:[ECX+10]
00416DAB  |. 8955 F8        MOV DWORD PTR SS:[EBP-8],EDX
00416DAE  |> 8B45 08        MOV EAX,DWORD PTR SS:[EBP+8]
00416DB1  |. 50             PUSH EAX
00416DB2  |. E8 8DFAFFFF    CALL UNIVERSE.00416844           //F8跟入这个CALL。
============================================================
我们经过一番周折来到下面:
00416D1F  |. E8 0C9E0200    |CALL UNIVERSE.00440B30          //这个函数处理一个串Qmvtinn!\QD:8^,返回串长E。
00416D24  |. 83C4 04        |ADD ESP,4
00416D27  |. 3945 E8        |CMP DWORD PTR SS:[EBP-18],EAX
00416D2A  |. 7D 25          |JGE SHORT UNIVERSE.00416D51
00416D2C  |. 8B55 0C        |MOV EDX,DWORD PTR SS:[EBP+C]
00416D2F  |. 0355 E8        |ADD EDX,DWORD PTR SS:[EBP-18]
00416D32  |. 0FBE02         |MOVSX EAX,BYTE PTR DS:[EDX]     //依次取上述串每一位送EAX。
00416D35  |. 83E8 01        |SUB EAX,1                       // 把每一位都统统减1。
00416D38  |. 50             |PUSH EAX
00416D39  |. 6A 00          |PUSH 0
00416D3B  |. 8D4D F0        |LEA ECX,DWORD PTR SS:[EBP-10]
00416D3E  |. E8 C8F30300    |CALL UNIVERSE.0045610B          //把减一后的值送指定地址保存。
00416D43  |. 8D4D F0        |LEA ECX,DWORD PTR SS:[EBP-10]
00416D46  |. 51             |PUSH ECX
00416D47  |. 8D4D EC        |LEA ECX,DWORD PTR SS:[EBP-14]
00416D4A  |. E8 A0F20300    |CALL UNIVERSE.00455FEF
00416D4F  |.^EB C1          \JMP SHORT UNIVERSE.00416D12    //如果未完继续循环。最后上述串变为:Plushmm [PC97]
00416D51  |> 8D55 EC        LEA EDX,DWORD PTR SS:[EBP-14]    //取新串地址。
00416D54  |. 52             PUSH EDX
00416D55  |. 8B4D 08        MOV ECX,DWORD PTR SS:[EBP+8]
00416D58  |. E8 7CEC0300    CALL UNIVERSE.004559D9
00416D5D  |. 8B45 E4        MOV EAX,DWORD PTR SS:[EBP-1C]
00416D60  |. 0C 01          OR AL,1
00416D62  |. 8945 E4        MOV DWORD PTR SS:[EBP-1C],EAX
00416D65  |. C645 FC 01     MOV BYTE PTR SS:[EBP-4],1
00416D69  |. 8D4D F0        LEA ECX,DWORD PTR SS:[EBP-10]
00416D6C  |. E8 F3EE0300    CALL UNIVERSE.00455C64
00416D71  |. C645 FC 00     MOV BYTE PTR SS:[EBP-4],0
============================================================
我们经过一番周折来到下面,也是重头戏:
00416880  |. 8B55 C8        MOV EDX,DWORD PTR SS:[EBP-38]   //新串地址送EDX
00416883  |. 52             PUSH EDX
00416884  |. 8B45 08        MOV EAX,DWORD PTR SS:[EBP+8]    //用户名地址送EAX
00416887  |. 50             PUSH EAX
00416888  |. E8 93070000    CALL UNIVERSE.00417020          //大概进行比较上述串。
****
004168B3  |> E8 183E0100    CALL UNIVERSE.0042A6D0          //取用户名串长。
004168B8  |. 8945 DC        MOV DWORD PTR SS:[EBP-24],EAX
004168BB  |. C745 F0 000000>MOV DWORD PTR SS:[EBP-10],0
004168C2  |. C745 E0 010000>MOV DWORD PTR SS:[EBP-20],1
004168C9  |. C745 E4 000000>MOV DWORD PTR SS:[EBP-1C],0
004168D0  |. EB 09          JMP SHORT UNIVERSE.004168DB
****
004168EF  |. E8 0C070000    |CALL UNIVERSE.00417000         //依次取用户名字符,在AL返回。
004168F4  |. 0FBEC8         |MOVSX ECX,AL                   //把字符送ECX。
004168F7  |. 894D D8        |MOV DWORD PTR SS:[EBP-28],ECX  //把ECX送内存保存。
004168FA  |. 8B55 F0        |MOV EDX,DWORD PTR SS:[EBP-10]  //累加和送EDX
004168FD  |. 0355 D8        |ADD EDX,DWORD PTR SS:[EBP-28]  //EDX=EDX+用户名字符
00416900  |. 8955 F0        |MOV DWORD PTR SS:[EBP-10],EDX  //送回保存。
00416903  |. 8B45 E4        |MOV EAX,DWORD PTR SS:[EBP-1C]  //这个值关键,决定后面的运算。
00416906  |. 25 01000080    |AND EAX,80000001
0041690B  |. 79 05          |JNS SHORT UNIVERSE.00416912       //非负数则跳。
0041690D  |. 48             |DEC EAX                        //否则,EAX减1。
0041690E  |. 83C8 FE        |OR EAX,FFFFFFFE                //EAX与此常量或运算。
00416911  |. 40             |INC EAX                        //EAX加1。
00416912  |> 85C0           |TEST EAX,EAX  
00416914  |. 74 09          |JE SHORT UNIVERSE.0041691F      //若为0则跳。
00416916  |. C745 E0 FFFFFF>|MOV DWORD PTR SS:[EBP-20],-1     //根据前面不同情况跳转,设置1或者-1
0041691D  |. EB 07          |JMP SHORT UNIVERSE.00416926
0041691F  |> C745 E0 010000>|MOV DWORD PTR SS:[EBP-20],1       
00416926  |> 8B4D E0        |MOV ECX,DWORD PTR SS:[EBP-20]     //前面设置的1或者-1送ECX。
00416929  |. 0FAF4D D8      |IMUL ECX,DWORD PTR SS:[EBP-28]   // ECX=ECX*每位用户名字符。
0041692D  |. 8B55 F0        |MOV EDX,DWORD PTR SS:[EBP-10]    //累加和取出送EDX。
00416930  |. 03D1           |ADD EDX,ECX             //EDX=EDX+ECX。
00416932  |. 8955 F0        |MOV DWORD PTR SS:[EBP-10],EDX  //累加结果送回保存。
00416935  |.^EB 9B          \JMP SHORT UNIVERSE.004168D2     //没有处理完继续循环。
00416937  |> 8B45 F0        MOV EAX,DWORD PTR SS:[EBP-10]    //用户名累加结果送EAX。
0041693A  |. 8945 E8        MOV DWORD PTR SS:[EBP-18],EAX   //用户名累加结果送[EBP-18]保存。
0041693D  |. 8B4D F0        MOV ECX,DWORD PTR SS:[EBP-10]   //累加和送ECX。
00416940  |. 0FAF4D F0      IMUL ECX,DWORD PTR SS:[EBP-10]  //ECX=ECX*ECX。
00416944  |. 894D F0        MOV DWORD PTR SS:[EBP-10],ECX    //乘方结果送回。
00416947  |. 8B55 F0        MOV EDX,DWORD PTR SS:[EBP-10]   //乘方结果送EDX。
0041694A  |. 0355 E8        ADD EDX,DWORD PTR SS:[EBP-18]   //EDX=EDX+用户名累加和。
0041694D  |. 8955 F0        MOV DWORD PTR SS:[EBP-10],EDX    //EDX结果送回保存。
00416950  |. 8B45 F0        MOV EAX,DWORD PTR SS:[EBP-10]
00416953  |. 50             PUSH EAX
00416954  |. E8 673D0100    CALL UNIVERSE.0042A6C0          //保存EAX到指定单元。
00416959  |. 83C4 04        ADD ESP,4
0041695C  |. C745 E4 000000>MOV DWORD PTR SS:[EBP-1C],0
00416963  |. EB 09          JMP SHORT UNIVERSE.0041696E
00416965  |> 8B4D E4        /MOV ECX,DWORD PTR SS:[EBP-1C]  //下面是处理上述运算结果的循环。
00416968  |. 83C1 01        |ADD ECX,1
0041696B  |. 894D E4        |MOV DWORD PTR SS:[EBP-1C],ECX
0041696E  |> 8B55 E4         MOV EDX,DWORD PTR SS:[EBP-1C]  //循环次数
00416971  |. 3B15 08784900  |CMP EDX,DWORD PTR DS:[497808]  //是否已经到达次数。
00416977  |. 7D 07          |JGE SHORT UNIVERSE.00416980    //如果循环次数已到,跳出循环。
00416979  |. E8 623D0100    |CALL UNIVERSE.0042A6E0         //我们进入这个CALL看看,代码见后面。(*)
0041697E  |.^EB E5          \JMP SHORT UNIVERSE.00416965    //如果没有结束,继续循环。
00416980  |> E8 5B3D0100    CALL UNIVERSE.0042A6E0          //保存计算结果到指定内存单元[48e7f8],这个就是正确

注册码的16进制数。
00416985  |. 8945 EC        MOV DWORD PTR SS:[EBP-14],EAX
00416988  |. 8B45 DC        MOV EAX,DWORD PTR SS:[EBP-24]
0041698B  |. 50             PUSH EAX
0041698C  |. E8 2F3D0100    CALL UNIVERSE.0042A6C0        //保存EAX到指定单元[48e7f8],这个不是正确注册码了。
============================================================
先看(*)处的函数:
0042A6E0  /$ A1 E8E74800    MOV EAX,DWORD PTR DS:[48E7E8]
0042A6E5  |. 68 400CB378    PUSH 78B30C40
0042A6EA  |. 99             CDQ
0042A6EB  |. 6A 00          PUSH 0
0042A6ED  |. 68 0DA4A225    PUSH 25A2A40D
0042A6F2  |. 52             PUSH EDX
0042A6F3  |. 50             PUSH EAX
0042A6F4  |. E8 77710100    CALL UNIVERSE.00441870   //F8跟入这个函数,代码在后面。(**)
0042A6F9  |. 83C0 01        ADD EAX,1                //返回的EAX加1。变成了1CE5C035h。
0042A6FC  |. 83D2 00        ADC EDX,0
0042A6FF  |. 52             PUSH EDX
0042A700  |. 50             PUSH EAX
0042A701  |. E8 5A000000    CALL UNIVERSE.0042A760   //F8跟入这个函数,代码在后面。 (***)
0042A706  |. 83C4 0C        ADD ESP,0C
0042A709  |. A3 E8E74800    MOV DWORD PTR DS:[48E7E8],EAX  //返回的结果保存在:[48E7E8]内。
0042A70E  \. C3             RETN
下面是(**)处的函数:
00441870  /$ 8B4424 08      MOV EAX,DWORD PTR SS:[ESP+8]
00441874  |. 8B4C24 10      MOV ECX,DWORD PTR SS:[ESP+10]
00441878  |. 0BC8           OR ECX,EAX
0044187A  |. 8B4C24 0C      MOV ECX,DWORD PTR SS:[ESP+C]   //ECX为一常数:25A2A40Dh
0044187E  |. 75 09          JNZ SHORT UNIVERSE.00441889
00441880  |. 8B4424 04      MOV EAX,DWORD PTR SS:[ESP+4]  //EAX为前面用户名处理后的结果。比如wanggang处理后为

BF004。
00441884  |. F7E1           MUL ECX                       //EAX=EAX*ECX。例如:EAX=25A2A40Dh*BF004=1CE5C034h。
00441886  |. C2 1000        RETN 10
下面是(***)处的函数:
0042A760  /$ 55             PUSH EBP
0042A761  |. 8BEC           MOV EBP,ESP
0042A763  |. 53             PUSH EBX
0042A764  |. 8B45 08        MOV EAX,DWORD PTR SS:[EBP+8]   //EAX=前面得到的结果1CE5C035h。
0042A767  |. 8B55 0C        MOV EDX,DWORD PTR SS:[EBP+C]   //EDX=一个常数1C146。
0042A76A  |. 8B5D 10        MOV EBX,DWORD PTR SS:[EBP+10]  //EBX=一个常数78B30C40。
0042A76D  |. F7F3           DIV EBX                        //EAX,EDX联合为一个8字节数,除以EBX。
0042A76F  |. 8BC2           MOV EAX,EDX                    //余数送EAX保存。
0042A771  |. 5B             POP EBX
0042A772  |. 5D             POP EBP
0042A773  \. C3             RETN
============================================================
上面用户名进行运算完毕,程序流程来到下面:
00416D8E  /$ 55             PUSH EBP
00416D8F  |. 8BEC           MOV EBP,ESP
00416D91  |. 83EC 08        SUB ESP,8
00416D94  |. 894D FC        MOV DWORD PTR SS:[EBP-4],ECX
00416D97  |. 837D 0C 00     CMP DWORD PTR SS:[EBP+C],0
00416D9B  |. 7E 08          JLE SHORT UNIVERSE.00416DA5
00416D9D  |. 8B45 0C        MOV EAX,DWORD PTR SS:[EBP+C]
00416DA0  |. 8945 F8        MOV DWORD PTR SS:[EBP-8],EAX
00416DA3  |. EB 09          JMP SHORT UNIVERSE.00416DAE
00416DA5  |> 8B4D FC        MOV ECX,DWORD PTR SS:[EBP-4]
00416DA8  |. 8B51 10        MOV EDX,DWORD PTR DS:[ECX+10]
00416DAB  |. 8955 F8        MOV DWORD PTR SS:[EBP-8],EDX
00416DAE  |> 8B45 08        MOV EAX,DWORD PTR SS:[EBP+8]
00416DB1  |. 50             PUSH EAX
00416DB2  |. E8 8DFAFFFF    CALL UNIVERSE.00416844
00416DB7  |. 83C4 04        ADD ESP,4  
00416DBA  |. 33C9           XOR ECX,ECX
00416DBC  |. 3945 F8        CMP DWORD PTR SS:[EBP-8],EAX   //在这里用户名计算结果和EAX内的假注册码计算结果进行

比较。
00416DBF  |. 0F94C1         SETE CL                        //相等则让CL=1。
00416DC2  |. 8BC1           MOV EAX,ECX                    //把ECX送EAX,作为注册成功标志。
00416DC4  |. 8BE5           MOV ESP,EBP
00416DC6  |. 5D             POP EBP
00416DC7  \. C2 0800        RETN 8
============================================================
后记:
这个软件没有想到搞了那么多弯弯绕在里面,特别是在验证那个字符串Plushmm [PC97]时,感到莫名其妙!最后用户名的计算

是用大数进行乘除运算,进行了3遍。最后得到一个结果与前面注册码16进制值比较,现在已经得到了真码,把最后拿来比较的

那个数转换为10进制,输入就OK啦!比如我这里UserName是wanggang,得到的是830350h,转换为10进制数为8586064。现在输

入正确注册码,注册成功!!所有限制解除!我试用了一下提供的银河系图象还有其他气团图象,效果非常棒!!犹如真的来

到天上一样!!

追踪这个软件的过程比较讨厌,真是如同掉进无底深渊一样!没有边际!因为无论哪个CALL都值得怀疑里面做了什么工作,所

以不得不追进去看看。如果一下子掠过去可能就没戏。经过2个小时艰苦奋战,我终于又可以把我的破文与各位分享了!希望我

们共同进步提高!!:)

另附诗一首,献给各位关注我的坛友:

“宇宙”软件无“银河”,功能限制真是多;如今遇到俺菜鸟,眩目银河失又得!

qduwg

qduwg@163.com

完稿于2006年1月19日下午