题目:注册“新狐电脑传真” FOR 菜鸟[易]
功能:通过电脑收发传真,实现无纸化办公。《新狐电脑传真》为绿色软件,无需安装即可使用。将下载后的程序文件自解压到硬

盘某一目录下即可。

工具:Softice

引子:今天安装了这个软件,软件解压到一个目录下,双击即可运行。拿PEID查看不带壳,是DELPHI写的。在主界面上有“登记注

册”按钮。单击此按钮,弹出对话框,输入假码87654321。调出SOFTICE,下断点bpx hmemcpy。F5退出,单击“确定”按钮,被

拦住。11次F12来到主程序内,然后F10跟踪来到如下代码处。

004DBF90  /. 55                  PUSH EBP
004DBF91  |. 8BEC                MOV EBP,ESP
004DBF93  |. 83C4 E0             ADD ESP,-20
004DBF96  |. 53                  PUSH EBX
004DBF97  |. 33C9                XOR ECX,ECX
004DBF99  |. 894D E0             MOV DWORD PTR SS:[EBP-20],ECX
004DBF9C  |. 894D F4             MOV DWORD PTR SS:[EBP-C],ECX
004DBF9F  |. 8BD8                MOV EBX,EAX
004DBFA1  |. 33C0                XOR EAX,EAX
004DBFA3  |. 55                  PUSH EBP
004DBFA4  |. 68 AFC04D00         PUSH FAXNOW.004DC0AF
004DBFA9  |. 64:FF30             PUSH DWORD PTR FS:[EAX]
004DBFAC  |. 64:8920             MOV DWORD PTR FS:[EAX],ESP
004DBFAF  |. 8D45 F4             LEA EAX,DWORD PTR SS:[EBP-C]
004DBFB2  |. BA C4C04D00         MOV EDX,FAXNOW.004DC0C4
004DBFB7  |. E8 C48EF2FF         CALL FAXNOW.00404E80
004DBFBC  |. 8D4D F4             LEA ECX,DWORD PTR SS:[EBP-C]
004DBFBF  |. BA D8C04D00         MOV EDX,FAXNOW.004DC0D8
004DBFC4  |. B8 F8C04D00         MOV EAX,FAXNOW.004DC0F8
004DBFC9  |. E8 E637F6FF         CALL FAXNOW.0043F7B4
004DBFCE  |. 3C 01               CMP AL,1
004DBFD0  |. 0F85 BB000000       JNZ FAXNOW.004DC091                //此处未跳。
004DBFD6  |. 8D55 E0             LEA EDX,DWORD PTR SS:[EBP-20]
004DBFD9  |. 8B45 F4             MOV EAX,DWORD PTR SS:[EBP-C]
004DBFDC  |. E8 C3D4F2FF         CALL FAXNOW.004094A4               //复制假码到另一地址。
004DBFE1  |. 8B45 E0             MOV EAX,DWORD PTR SS:[EBP-20]      //假码地址送EAX。
004DBFE4  |. E8 0BD8F2FF         CALL FAXNOW.004097F4               //这个函数把假码转换为十六进制数。(1)
004DBFE9  |. 8945 F8             MOV DWORD PTR SS:[EBP-8],EAX       //得到的低4字节在EAX内。
004DBFEC  |. 8955 FC             MOV DWORD PTR SS:[EBP-4],EDX       //得到的高4字节在EDX内。
004DBFEF  |. 6A 00               PUSH 0
004DBFF1  |. 68 D2010000         PUSH 1D2                           //被除数常量进栈。
004DBFF6  |. 8B45 F8             MOV EAX,DWORD PTR SS:[EBP-8]
004DBFF9  |. 8B55 FC             MOV EDX,DWORD PTR SS:[EBP-4]
004DBFFC  |. E8 DF9DF2FF         CALL FAXNOW.00405DE0               //转换后的假码除以1D2h。
004DC001  |. 8945 F8             MOV DWORD PTR SS:[EBP-8],EAX       //商在EAX内。
004DC004  |. 8955 FC             MOV DWORD PTR SS:[EBP-4],EDX       //余数在EAX内。
004DC007  |. 8B45 F8             MOV EAX,DWORD PTR SS:[EBP-8]
004DC00A  |. 8B55 FC             MOV EDX,DWORD PTR SS:[EBP-4]
004DC00D  |. 2D B3730700         SUB EAX,773B3                      //商减去773B3h。
004DC012  |. 83DA 00             SBB EDX,0                          //带借位,EDX减去0。
004DC015  |. 8945 F8             MOV DWORD PTR SS:[EBP-8],EAX       //结果送回保存。
004DC018  |. 8955 FC             MOV DWORD PTR SS:[EBP-4],EDX
004DC01B  |. 8D45 E4             LEA EAX,DWORD PTR SS:[EBP-1C]
004DC01E  |. E8 E1F4FFFF         CALL FAXNOW.004DB504               //CPU型号入栈。比如686。          (2)
004DC023  |. 8B4D E4             MOV ECX,DWORD PTR SS:[EBP-1C]      //把CPU型号送ECX。比如ECX=686h。
004DC026  |. 8BC1                MOV EAX,ECX                        //ECX送EAX。
004DC028  |. 99                  CDQ                                //EAX扩充到EDX。
004DC029  |. 3B55 FC             CMP EDX,DWORD PTR SS:[EBP-4]       //EDX与与前面得到的[EBP-4]内的结果比较。
004DC02C  |. 75 4E               JNZ SHORT FAXNOW.004DC07C          //不等则OVER。
004DC02E  |. 3B45 F8             CMP EAX,DWORD PTR SS:[EBP-8]       //EAX与前面得到的[EBP-8]内的结果比较。
004DC031  |. 75 49               JNZ SHORT FAXNOW.004DC07C          //不等则OVER。
004DC033  |. 33D2                XOR EDX,EDX                        //否则EDX清0。
004DC035  |. 8B83 78030000       MOV EAX,DWORD PTR DS:[EBX+378]
004DC03B  |. 8B08                MOV ECX,DWORD PTR DS:[EAX]
004DC03D  |. FF51 64             CALL DWORD PTR DS:[ECX+64]
004DC040  |. B2 01               MOV DL,1                           
004DC042  |. 8B83 08030000       MOV EAX,DWORD PTR DS:[EBX+308]
004DC048  |. 8B08                MOV ECX,DWORD PTR DS:[EAX]
004DC04A  |. FF51 64             CALL DWORD PTR DS:[ECX+64]
004DC04D  |. 33D2                XOR EDX,EDX
004DC04F  |. 8B83 84030000       MOV EAX,DWORD PTR DS:[EBX+384]
004DC055  |. E8 BAA2F6FF         CALL FAXNOW.00446314
004DC05A  |. 8B83 94030000       MOV EAX,DWORD PTR DS:[EBX+394]
004DC060  |. E8 D7C0FEFF         CALL FAXNOW.004C813C
004DC065  |. 6A 00               PUSH 0
004DC067  |. 66:8B0D 04C14D00    MOV CX,WORD PTR DS:[4DC104]
004DC06E  |. B2 02               MOV DL,2
004DC070  |. B8 10C14D00         MOV EAX,FAXNOW.004DC110
004DC075  |. E8 1E36F6FF         CALL FAXNOW.0043F698               //里面调用显示成功的函数。
004DC07A  |. EB 15               JMP SHORT FAXNOW.004DC091          //然后跳走。
004DC07C  |> 6A 00               PUSH 0
004DC07E  |. 66:8B0D 04C14D00    MOV CX,WORD PTR DS:[4DC104]
004DC085  |. B2 01               MOV DL,1
004DC087  |. B8 2CC14D00         MOV EAX,FAXNOW.004DC12C
004DC08C  |. E8 0736F6FF         CALL FAXNOW.0043F698
004DC091  |> 33C0                XOR EAX,EAX
004DC093  |. 5A                  POP EDX
004DC094  |. 59                  POP ECX
004DC095  |. 59                  POP ECX
004DC096  |. 64:8910             MOV DWORD PTR FS:[EAX],EDX
004DC099  |. 68 B6C04D00         PUSH FAXNOW.004DC0B6
004DC09E  |> 8D45 E0             LEA EAX,DWORD PTR SS:[EBP-20]
004DC0A1  |. E8 428DF2FF         CALL FAXNOW.00404DE8
004DC0A6  |. 8D45 F4             LEA EAX,DWORD PTR SS:[EBP-C]
004DC0A9  |. E8 3A8DF2FF         CALL FAXNOW.00404DE8
004DC0AE  \. C3                  RETN
=============================================================================
下面看看(1)处的函数:
004097F4  /$ 53                  PUSH EBX
004097F5  |. 83C4 EC             ADD ESP,-14
004097F8  |. 8BD8                MOV EBX,EAX
004097FA  |. 8D5424 08           LEA EDX,DWORD PTR SS:[ESP+8]
004097FE  |. 8BC3                MOV EAX,EBX
00409800  |. E8 AFC7FFFF         CALL FAXNOW.00405FB4               //在此函数内实现注册码转换。        (3)
00409805  |. 890424              MOV DWORD PTR SS:[ESP],EAX
00409808  |. 895424 04           MOV DWORD PTR SS:[ESP+4],EDX
0040980C  |. 837C24 08 00        CMP DWORD PTR SS:[ESP+8],0
00409811  |. 74 19               JE SHORT FAXNOW.0040982C
00409813  |. 895C24 0C           MOV DWORD PTR SS:[ESP+C],EBX
00409817  |. C64424 10 0B        MOV BYTE PTR SS:[ESP+10],0B
0040981C  |. 8D5424 0C           LEA EDX,DWORD PTR SS:[ESP+C]
00409820  |. A1 700B4E00         MOV EAX,DWORD PTR DS:[4E0B70]
00409825  |. 33C9                XOR ECX,ECX
00409827  |. E8 6CF9FFFF         CALL FAXNOW.00409198
0040982C  |> 8B0424              MOV EAX,DWORD PTR SS:[ESP]
0040982F  |. 8B5424 04           MOV EDX,DWORD PTR SS:[ESP+4]
00409833  |. 83C4 14             ADD ESP,14
00409836  |. 5B                  POP EBX
00409837  \. C3                  RETN
=============================================================================
下面看看(2)处的函数:
004DB504  /$ 53                  PUSH EBX
004DB505  |. 57                  PUSH EDI
004DB506  |. 89C7                MOV EDI,EAX
004DB508  |. B8 01000000         MOV EAX,1
004DB50D  |. 0FA2                CPUID                              //得到CPU型号。
004DB50F  |. AB                  STOS DWORD PTR ES:[EDI]            //入栈。
004DB510  |. 89D8                MOV EAX,EBX
004DB512  |. AB                  STOS DWORD PTR ES:[EDI]
004DB513  |. 89C8                MOV EAX,ECX
004DB515  |. AB                  STOS DWORD PTR ES:[EDI]
004DB516  |. 89D0                MOV EAX,EDX
004DB518  |. AB                  STOS DWORD PTR ES:[EDI]
004DB519  |. 5F                  POP EDI
004DB51A  |. 5B                  POP EBX
004DB51B  \. C3                  RETN
=============================================================================
下面看看(3)处的函数:
00405FB4  /$ 53                    PUSH EBX
*省略多行*
004060F5  |> 8A442E FF             /MOV AL,BYTE PTR DS:[ESI+EBP-1]  //下面循环把注册码变换为16进制数。
004060F9  |. 8BD0                  |MOV EDX,EAX                     //EAX内是注册码字符,依次送EDX。
004060FB  |. 80C2 D0               |ADD DL,0D0                      //加D0修正EDX,变为3位16进制数,最低位是

对应10进制数。
004060FE  |. 80EA 0A               |SUB DL,0A                       //测试是否大于10。
00406101  |. 73 62                 |JNB SHORT FAXNOW.00406165       //如果大于等于则跳。
00406103  |. 8BF8                  |MOV EDI,EAX                     //再次把EAX内的注册码字符送EDI。
00406105  |. 81E7 FF000000         |AND EDI,0FF                     //跟FF相与,得到低字节。
0040610B  |. 83EF 30               |SUB EDI,30                      //减去30h即为十进制数了。
0040610E  |. 837C24 0C 00          |CMP DWORD PTR SS:[ESP+C],0      //[ESP+C]内保存结果的高4字节。
00406113  |. 75 09                 |JNZ SHORT FAXNOW.0040611E       //不为0则跳。
00406115  |. 837C24 08 00          |CMP DWORD PTR SS:[ESP+8],0      //[ESP+8]内保存结果的低4字节。
0040611A  |. 72 49                 |JB SHORT FAXNOW.00406165        //高4字节小于0跳。
0040611C  |. EB 02                 |JMP SHORT FAXNOW.00406120       //否则直接跳406120。
0040611E  |> 7C 45                 |JL SHORT FAXNOW.00406165        //小于0则跳。
00406120  |> 817C24 0C CCCCCC0C    |CMP DWORD PTR SS:[ESP+C],0CCCCCCC  //否则高4字节与该常数比较。
00406128  |. 75 0C                 |JNZ SHORT FAXNOW.00406136          //不为0跳。
0040612A  |. 817C24 08 CCCCCCCC    |CMP DWORD PTR SS:[ESP+8],CCCCCCCC  //低4字节与该常数比较。
00406132  |. 76 04                 |JBE SHORT FAXNOW.00406138          //小于则跳406138。
00406134  |. EB 2F                 |JMP SHORT FAXNOW.00406165
00406136  |> 7F 2D                 |JG SHORT FAXNOW.00406165
00406138  |> 6A 00                 |PUSH 0
0040613A  |. 6A 0A                 |PUSH 0A
0040613C  |. 8B4424 10             |MOV EAX,DWORD PTR SS:[ESP+10]
00406140  |. 8B5424 14             |MOV EDX,DWORD PTR SS:[ESP+14]
00406144  |. E8 73FCFFFF           |CALL FAXNOW.00405DBC            //此函数把得到的十进制数乘以10。   
00406149  |. 52                    |PUSH EDX                        //高4字节值进栈。
0040614A  |. 50                    |PUSH EAX                        //低4字节值进栈。
0040614B  |. 8BC7                  |MOV EAX,EDI                     //变换为十进制数的注册码字符送EAX。。
0040614D  |. 99                    |CDQ
0040614E  |. 030424                |ADD EAX,DWORD PTR SS:[ESP]      //前面进栈的低4字节数累加到EAX。
00406151  |. 135424 04             |ADC EDX,DWORD PTR SS:[ESP+4]    //前面进栈的高4字节数累加到EDX。
00406155  |. 83C4 08               |ADD ESP,8
00406158  |. 894424 08             |MOV DWORD PTR SS:[ESP+8],EAX    //保存。
0040615C  |. 895424 0C             |MOV DWORD PTR SS:[ESP+C],EDX    //保存。
00406160  |. 45                    |INC EBP
00406161  |. 33DB                  |XOR EBX,EBX
00406163  |.^EB 90                 \JMP SHORT FAXNOW.004060F5       //循环。
00406165  |> 807C24 10 00          CMP BYTE PTR SS:[ESP+10],0
0040616A  |. 74 17                 JE SHORT FAXNOW.00406183
*略去无用行*
004061BF  |> 8B0424                MOV EAX,DWORD PTR SS:[ESP]
004061C2  |. 33D2                  XOR EDX,EDX
004061C4  |. 8910                  MOV DWORD PTR DS:[EAX],EDX
004061C6  |> 8B4424 08             MOV EAX,DWORD PTR SS:[ESP+8]
004061CA  |. 8B5424 0C             MOV EDX,DWORD PTR SS:[ESP+C]
004061CE  |. 83C4 14               ADD ESP,14
004061D1  |. 5D                    POP EBP
004061D2  |. 5F                    POP EDI
004061D3  |. 5E                    POP ESI
004061D4  |. 5B                    POP EBX
004061D5  \. C3                    RETN
=============================================================================
后记:通过30分钟跟踪,发现这个小软件的保护几乎相当于无,但我还是把过程随便写了一下。这个注册码的产生方法特别简单:

就是你输入的注册码变换为十六进制后除以一个常数1D2h,然后用得到的商减去另一个常数773B3h,然后余数跟686h比较,如果相

等,则注册成功!!所以反推一下即可。文章没有技术含量,让你浪费宝贵时间了!非常抱歉!
注册码=(773B3h+686h)*1D2h=228359106(十进制数)

结论:
注册码:
228359106

注册成功后,注册按钮为灰色,如果想再次注册,注意这个软件在注册表内写入如下键,删除这个键后又可以注册了。
HKLM\Software\CLASSES\CLSID\{1AE69D60-73D0-11D4-BD52-38A480C50000}\233131136



qduwg
qduwg@163.com

2006年2月16日