rdsnow 发表于 2005-6-3 17:16:40

驱动程序备份专家 V2.7 的注册

【破文作者】   rdsnow

【 E-mail 】   [email protected]

【 作者QQ 】   83757177

【文章题目】   驱动程序备份专家 V2.7 的注册

【软件名称】   驱动程序备份专家 V2.7

【下载地址】   http://www2.skycn.com/soft/8101.html

-------------------------------------------------------------------------------------------
【加密方式】   序列号

【破解工具】   FLYOD V1.10

【软件限制】   功能限制

【破解平台】   Microsoft Windows XP SP2

-------------------------------------------------------------------------------------------
【软件简介】

您经常重装电脑吗?您是否有过重装电脑时却找不到原版驱动程序的烦恼?现在,有了这款“驱动程序备份工具”您可以远离电脑重装时找不到驱动的厄梦了。

“驱动程序备份工具”是系统支持和管理人员的得力助手,它为用户提供了备份电脑中目前已安装的最新驱动程序的功能。在重装电脑系统前,您可以先使用这款工具软件将电脑中的驱动程序备份到您指定的位置,待系统重装执行到硬件安装这一步骤时,您可以将Windows安装程序搜索驱动的路径指向您备份的驱动程序所在路径,即可快速完成各种硬件设备的驱动安装工作,这样,可以为您节省许多程序安装的时间,同时也为您省去了四处找驱动盘、频繁更换驱动光盘的麻烦,达到快速“克隆”驱动程序的目的。“驱动程序备份工具”还可以通过插件技术备份收藏夹、注册表、Cookies等相关信息,是您重装系统时的得力助手。

-------------------------------------------------------------------------------------------
【文章简介】

程序无壳,Borland Delphi 6.0 - 7.0编写,程序采用非明码比较,有少量的浮点运算,有检查程序是否被调试的代码,有SEH的知识。正好让偶等菜鸟学习一下。

-------------------------------------------------------------------------------------------
【破解过程】

输入假注册码一"9B7654321abcd",注意不是"987654321abcd",因为根据以下代码会将其中某些位置的字符转化为日期,有些数字会导致转为不成功,导致产生SEH异常,异常后直接跳到不成功的地方。偶看过代码,事先对假注册码做了一点调整。(详见0049DA69处)

OD载入后,来到这儿:

0049D87B   .33C0         XOR EAX,EAX
0049D87D   .55             PUSH EBP
0049D87E   .68 68DB4900    PUSH DriverSt.0049DB68
0049D883   .64:FF30      PUSH DWORD PTR FS:
0049D886   .64:8920      MOV DWORD PTR FS:,ESP
0049D889   >E8 5292F6FF    CALL <JMP.&kernel32.GetTickCount>               ; [GetTickCount
0049D88E   .8BF0         MOV ESI,EAX
0049D890   .68 D0070000    PUSH 7D0                                        ; /Timeout = 2000. ms
0049D895   .E8 BA06F7FF    CALL <JMP.&kernel32.Sleep>                      ; \Sleep
0049D89A   .8B43 54      MOV EAX,DWORD PTR DS:
0049D89D   .8078 04 00   CMP BYTE PTR DS:,0
0049D8A1   .74 0A          JE SHORT DriverSt.0049D8AD
0049D8A3   .8D55 FC      LEA EDX,DWORD PTR SS:
0049D8A6   .8BC3         MOV EAX,EBX
0049D8A8   .E8 27F9FFFF    CALL DriverSt.0049D1D4
0049D8AD   >E8 2E92F6FF    CALL <JMP.&kernel32.GetTickCount>               ; [GetTickCount
0049D8B2   .81C6 CF070000ADD ESI,7CF
0049D8B8   .3BC6         CMP EAX,ESI
0049D8BA   .^ 72 CD          JB SHORT DriverSt.0049D889

连续出现两个GetTickCount,应该是检查程序有没有被调试

0049D8BC   .8B45 FC      MOV EAX,DWORD PTR SS:
0049D8BF   .E8 E06FF6FF    CALL DriverSt.004048A4                        ;取得机器码的长度
0049D8C4   .3B43 58      CMP EAX,DWORD PTR DS:                   ;机器码长度不大于50
0049D8C7   .7F 19          JG SHORT DriverSt.0049D8E2
0049D8C9   .8B45 FC      MOV EAX,DWORD PTR SS:
0049D8CC   .E8 D36FF6FF    CALL DriverSt.004048A4                        ;取得机器码的长度
0049D8D1   .3B43 5C      CMP EAX,DWORD PTR DS:
0049D8D4   .7C 0C          JL SHORT DriverSt.0049D8E2                      ;机器码的长度不小于5
0049D8D6   .8B45 0C      MOV EAX,DWORD PTR SS:
0049D8D9   .E8 C66FF6FF    CALL DriverSt.004048A4                        ;取注册码的长度
0049D8DE   .85C0         TEST EAX,EAX
0049D8E0   .75 09          JNZ SHORT DriverSt.0049D8EB                     ;注册码不为空
0049D8E2   >C645 F7 00   MOV BYTE PTR SS:,0
0049D8E6   .E9 33020000    JMP DriverSt.0049DB1E
0049D8EB   >8D55 DC      LEA EDX,DWORD PTR SS:
0049D8EE   .8B45 0C      MOV EAX,DWORD PTR SS:
0049D8F1   .E8 D6ADF6FF    CALL DriverSt.004086CC                        ;注册码小写转大写
0049D8F6   .8B55 DC      MOV EDX,DWORD PTR SS:
0049D8F9   .8D45 0C      LEA EAX,DWORD PTR SS:
0049D8FC   .E8 7B6DF6FF    CALL DriverSt.0040467C
0049D901   .C645 F7 00   MOV BYTE PTR SS:,0
0049D905   .B1 01          MOV CL,1
0049D907   .8B55 0C      MOV EDX,DWORD PTR SS:
0049D90A   .8BC3         MOV EAX,EBX
0049D90C   .E8 83FAFFFF    CALL DriverSt.0049D394                        ;取得注册码的第二个字符,得到"B"
0049D911   .84C0         TEST AL,AL
0049D913   .0F85 05020000JNZ DriverSt.0049DB1E
0049D919   .33C9         XOR ECX,ECX
0049D91B   .55             PUSH EBP
0049D91C   .68 A4DA4900    PUSH DriverSt.0049DAA4                        ;压入SEH句柄
0049D921   .64:FF31      PUSH DWORD PTR FS:
0049D924   .64:8921      MOV DWORD PTR FS:,ESP
0049D927   .8D45 F0      LEA EAX,DWORD PTR SS:
0049D92A   .8B55 0C      MOV EDX,DWORD PTR SS:
0049D92D   .8A52 01      MOV DL,BYTE PTR DS:
0049D930   .E8 976EF6FF    CALL DriverSt.004047CC
0049D935   .8D45 D8      LEA EAX,DWORD PTR SS:
0049D938   .8B55 0C      MOV EDX,DWORD PTR SS:
0049D93B   .8A52 09      MOV DL,BYTE PTR DS:                      ;注册码的第十个字符
0049D93E   .8850 01      MOV BYTE PTR DS:,DL
0049D941   .C600 01      MOV BYTE PTR DS:,1
0049D944   .8D55 D8      LEA EDX,DWORD PTR SS:
0049D947   .8D45 D4      LEA EAX,DWORD PTR SS:
0049D94A   .E8 BD57F6FF    CALL DriverSt.0040310C
0049D94F   .8D45 D0      LEA EAX,DWORD PTR SS:
0049D952   .8B55 0C      MOV EDX,DWORD PTR SS:
0049D955   .8A52 07      MOV DL,BYTE PTR DS:                      ;注册码的第八个字符
0049D958   .8850 01      MOV BYTE PTR DS:,DL
0049D95B   .C600 01      MOV BYTE PTR DS:,1
0049D95E   .8D55 D0      LEA EDX,DWORD PTR SS:
0049D961   .8D45 D4      LEA EAX,DWORD PTR SS:
0049D964   .B1 02          MOV CL,2
0049D966   .E8 7157F6FF    CALL DriverSt.004030DC                        ;连接上面的两个字符
0049D96B   .8D55 D4      LEA EDX,DWORD PTR SS:
0049D96E   .8D45 EC      LEA EAX,DWORD PTR SS:
0049D971   .E8 D26EF6FF    CALL DriverSt.00404848                        ;得到字符串"A2"
0049D976   .8D45 D8      LEA EAX,DWORD PTR SS:
0049D979   .8B55 0C      MOV EDX,DWORD PTR SS:
0049D97C   .8A52 03      MOV DL,BYTE PTR DS:                      ;注册码的第四个字符
0049D97F   .8850 01      MOV BYTE PTR DS:,DL
0049D982   .C600 01      MOV BYTE PTR DS:,1
0049D985   .8D55 D8      LEA EDX,DWORD PTR SS:
0049D988   .8D45 D4      LEA EAX,DWORD PTR SS:
0049D98B   .E8 7C57F6FF    CALL DriverSt.0040310C
0049D990   .8D45 D0      LEA EAX,DWORD PTR SS:
0049D993   .8B55 0C      MOV EDX,DWORD PTR SS:
0049D996   .8A52 05      MOV DL,BYTE PTR DS:                      ;注册码的第六个字符
0049D999   .8850 01      MOV BYTE PTR DS:,DL
0049D99C   .C600 01      MOV BYTE PTR DS:,1
0049D99F   .8D55 D0      LEA EDX,DWORD PTR SS:
0049D9A2   .8D45 D4      LEA EAX,DWORD PTR SS:
0049D9A5   .B1 02          MOV CL,2
0049D9A7   .E8 3057F6FF    CALL DriverSt.004030DC
0049D9AC   .8D55 D4      LEA EDX,DWORD PTR SS:
0049D9AF   .8D45 CC      LEA EAX,DWORD PTR SS:
0049D9B2   .E8 5557F6FF    CALL DriverSt.0040310C
0049D9B7   .8D45 D0      LEA EAX,DWORD PTR SS:
0049D9BA   .8B55 0C      MOV EDX,DWORD PTR SS:
0049D9BD   .8A52 0B      MOV DL,BYTE PTR DS:                      ;注册码的第十二个字符
0049D9C0   .8850 01      MOV BYTE PTR DS:,DL
0049D9C3   .C600 01      MOV BYTE PTR DS:,1
0049D9C6   .8D55 D0      LEA EDX,DWORD PTR SS:
0049D9C9   .8D45 CC      LEA EAX,DWORD PTR SS:
0049D9CC   .B1 03          MOV CL,3
0049D9CE   .E8 0957F6FF    CALL DriverSt.004030DC                        ;连接上面的三个字符
0049D9D3   .8D55 CC      LEA EDX,DWORD PTR SS:
0049D9D6   .8D45 E8      LEA EAX,DWORD PTR SS:
0049D9D9   .E8 6A6EF6FF    CALL DriverSt.00404848                        ;得到字符串"64C"
0049D9DE   .8D45 C8      LEA EAX,DWORD PTR SS:
0049D9E1   .8B4D F0      MOV ECX,DWORD PTR SS:
0049D9E4   .BA 84DB4900    MOV EDX,DriverSt.0049DB84
0049D9E9   .E8 026FF6FF    CALL DriverSt.004048F0
0049D9EE   .8B45 C8      MOV EAX,DWORD PTR SS:
0049D9F1   .BA FFFF0000    MOV EDX,0FFFF
0049D9F6   .E8 69B3F6FF    CALL DriverSt.00408D64                        ;"B"转为整数得到0xB
0049D9FB   .8BF0         MOV ESI,EAX
0049D9FD   .8D45 C4      LEA EAX,DWORD PTR SS:
0049DA00   .8B4D EC      MOV ECX,DWORD PTR SS:
0049DA03   .BA 84DB4900    MOV EDX,DriverSt.0049DB84
0049DA08   .E8 E36EF6FF    CALL DriverSt.004048F0
0049DA0D   .8B45 C4      MOV EAX,DWORD PTR SS:
0049DA10   .BA FFFF0000    MOV EDX,0FFFF
0049DA15   .E8 4AB3F6FF    CALL DriverSt.00408D64                        ;"A2"转为整数得到0xA2
0049DA1A   .8BF8         MOV EDI,EAX
0049DA1C   .8D45 C0      LEA EAX,DWORD PTR SS:
0049DA1F   .8B4D E8      MOV ECX,DWORD PTR SS:
0049DA22   .BA 84DB4900    MOV EDX,DriverSt.0049DB84
0049DA27   .E8 C46EF6FF    CALL DriverSt.004048F0
0049DA2C   .8B45 C0      MOV EAX,DWORD PTR SS:
0049DA2F   .BA FFFF0000    MOV EDX,0FFFF
0049DA34   .E8 2BB3F6FF    CALL DriverSt.00408D64                        ;"64C"转为整数得到0x64C
0049DA39   .8BD7         MOV EDX,EDI
0049DA3B   .0BD6         OR EDX,ESI
0049DA3D   .0BD0         OR EDX,EAX
0049DA3F   .81FA FFFF0000CMP EDX,0FFFF
0049DA45   .75 0F          JNZ SHORT DriverSt.0049DA56
0049DA47   .64:8F05 000000>POP DWORD PTR FS:
0049DA4E   .83C4 08      ADD ESP,8
0049DA51   .E9 C8000000    JMP DriverSt.0049DB1E
0049DA56   >8BD6         MOV EDX,ESI
0049DA58   .66:83F2 07   XOR DX,7                                        ;0xB ^ 0x7 = 0xC ,作月份,得到12月
0049DA5C   .8BF7         MOV ESI,EDI
0049DA5E   .66:81F6 B700   XOR SI,0B7                                    ;0xA2 ^ 0xB7 = 0x15 ,作日期,得到15日
0049DA63   .66:35 B705   XOR AX,5B7                                    ;0x64C ^ 0x5B7 = 0x3FB,作年份,得到1018年,

连接上面的日期也就是得到了1018年12月15日

0049DA67   .8BCE         MOV ECX,ESI
0049DA69   .E8 A6CDF6FF    CALL DriverSt.0040A814                        ;计算到某一天的天数,得到 -321423

上面已经压入了SEH句柄,如果将选定字符转换位年月日不成功,在上面的Call里面会被程序检查,然后产生SEH,直接跳到后面0049DAA4处执行,如:本来我的第一个试探注册码是"987654321abcd",取第二个字符"8",0x8^0x7=0xF,但一年只有12个月,所以转化不成功,跳到不成功的地方去了。

0049DA6E   .DD5D E0      FSTP QWORD PTR SS:
0049DA71   .9B             WAIT
0049DA72   .E8 65CFF6FF    CALL DriverSt.0040A9DC                        ;得到38503,进入看看

       {0040A9DC/$83C4 E8      ADD ESP,-18
      0040A9DF|.8D4424 08      LEA EAX,DWORD PTR SS:
      0040A9E3|.50             PUSH EAX                                        ; /pLocaltime
      0040A9E4|.E8 8FC0FFFF    CALL <JMP.&kernel32.GetLocalTime>               ; \GetLocalTime
      0040A9E9|.66:8B4C24 0E   MOV CX,WORD PTR SS:                      ;当前日期
      0040A9EE|.66:8B5424 0A   MOV DX,WORD PTR SS:                      ;当前月份
      0040A9F3|.66:8B4424 08   MOV AX,WORD PTR SS:                      ;当前年份
      0040A9F8|.E8 17FEFFFF    CALL DriverSt.0040A814                        ;计算到某一天的天数,得到 38503
      0040A9FD|.DD1C24         FSTP QWORD PTR SS:
      0040AA00|.9B             WAIT
      0040AA01|.DD0424         FLD QWORD PTR SS:
      0040AA04|.83C4 18      ADD ESP,18
      0040AA07\.C3             RETN
       }

0049DA77   .DC5D E0      FCOMP QWORD PTR SS:                     ;以上两个天数进行比较
0049DA7A   .DFE0         FSTSW AX
0049DA7C   .9E             SAHF
0049DA7D   .76 1B          JBE SHORT DriverSt.0049DA9A                     ;大于等于就跳走,继续验证

以上连续两次计算到某一天的天数,我也跟进去看过,具体到哪一天,没有看出来,还涉及到闰年,好在不影响继续调试,只要转化得到的日期,大于等于当前日期就可以继续校验。不过试探注册码要改了。用2099年吧,2099^0x5B7=0xD84,所以注册码第4、6、12的字符分别改为"D"、"8"、"4",试探注册码也改为"9B7D58321AB4D",(假注册码二),修改后果然跳走继续验证了。^_^

0049DA7F   .DD45 E0      FLD QWORD PTR SS:
0049DA82   .D81D 88DB4900FCOMP DWORD PTR DS:
0049DA88   .DFE0         FSTSW AX
0049DA8A   .9E             SAHF
0049DA8B   .74 0D          JE SHORT DriverSt.0049DA9A
0049DA8D   .33C0         XOR EAX,EAX
0049DA8F   .5A             POP EDX
0049DA90   .59             POP ECX
0049DA91   .59             POP ECX
0049DA92   .64:8910      MOV DWORD PTR FS:,EDX
0049DA95   .E9 84000000    JMP DriverSt.0049DB1E                           ;跳向不成功
0049DA9A   >33C0         XOR EAX,EAX
0049DA9C   .5A             POP EDX
0049DA9D   .59             POP ECX
0049DA9E   .59             POP ECX
0049DA9F   .64:8910      MOV DWORD PTR FS:,EDX
0049DAA2   .EB 11          JMP SHORT DriverSt.0049DAB5
0049DAA4   .^ E9 6362F6FF    JMP DriverSt.00403D0C                           ;如果转换为日期时出错,会产生异常,异常后,到这里继续执行,从这里走向不成功
0049DAA9   .E8 C665F6FF    CALL DriverSt.00404074
0049DAAE   .EB 6E          JMP SHORT DriverSt.0049DB1E
0049DAB0   .E8 BF65F6FF    CALL DriverSt.00404074
0049DAB5   >8D45 BC      LEA EAX,DWORD PTR SS:
0049DAB8   .50             PUSH EAX
0049DAB9   .8B4D 0C      MOV ECX,DWORD PTR SS:                  ;取修改后的假注册码"9B7D58321AB4D"
0049DABC   .8B55 FC      MOV EDX,DWORD PTR SS:                  ;取机器码
0049DABF   .8BC3         MOV EAX,EBX
0049DAC1   .E8 76F0FFFF    CALL DriverSt.0049CB3C                        ;继续校验,校验不成功会得到"542264156124568746123",成功得到"645364631365423154824"
0049DAC6   .8B45 BC      MOV EAX,DWORD PTR SS:
0049DAC9   .BA 94DB4900    MOV EDX,DriverSt.0049DB94                     ;ASCII "645364631365423154824"
0049DACE   .E8 99ACF6FF    CALL DriverSt.0040876C                        ;以上CALL的返回值是不是"645364631365423154824"
0049DAD3   .85C0         TEST EAX,EAX
0049DAD5   .75 06          JNZ SHORT DriverSt.0049DADD                     ;不相等,就跳向不成功
0049DAD7   .C645 F7 01   MOV BYTE PTR SS:,1
0049DADB   .EB 04          JMP SHORT DriverSt.0049DAE1
0049DADD   >C645 F7 00   MOV BYTE PTR SS:,0
0049DAE1   >807D F7 01   CMP BYTE PTR SS:,1
0049DAE5   .75 37          JNZ SHORT DriverSt.0049DB1E
0049DAE7   .8D43 50      LEA EAX,DWORD PTR DS:
0049DAEA   .8B55 FC      MOV EDX,DWORD PTR SS:
0049DAED   .E8 466BF6FF    CALL DriverSt.00404638
0049DAF2   .8D43 60      LEA EAX,DWORD PTR DS:
0049DAF5   .8B55 F8      MOV EDX,DWORD PTR SS:
0049DAF8   .E8 3B6BF6FF    CALL DriverSt.00404638
0049DAFD   .8D43 68      LEA EAX,DWORD PTR DS:
0049DB00   .8B55 0C      MOV EDX,DWORD PTR SS:
0049DB03   .E8 306BF6FF    CALL DriverSt.00404638
0049DB08   .8D43 44      LEA EAX,DWORD PTR DS:
0049DB0B   .8B55 08      MOV EDX,DWORD PTR SS:
0049DB0E   .E8 256BF6FF    CALL DriverSt.00404638
0049DB13   .8BC3         MOV EAX,EBX
0049DB15   .E8 C2020000    CALL DriverSt.0049DDDC
0049DB1A   .C645 F7 01   MOV BYTE PTR SS:,1                     ;注册标记置1
0049DB1E   >33C0         XOR EAX,EAX
0049DB20   .5A             POP EDX
0049DB21   .59             POP ECX
0049DB22   .59             POP ECX
0049DB23   .64:8910      MOV DWORD PTR FS:,EDX

-------------------------------------------------------------------------------------------
049DAC1    CALL DriverSt.0049CB3C 校验不成功会得到"542264156124568746123",成功会得到"645364631365423154824"
进入这个CALL看看(此时的假注册码已经改为"9B7D58321AB4D"):

0049CB3C   $55             PUSH EBP
0049CB3D   .8BEC         MOV EBP,ESP
0049CB3F   .83C4 C4      ADD ESP,-3C
0049CB42   .53             PUSH EBX
0049CB43   .56             PUSH ESI
0049CB44   .57             PUSH EDI
0049CB45   .33DB         XOR EBX,EBX
0049CB47   .895D C4      MOV DWORD PTR SS:,EBX
0049CB4A   .895D C8      MOV DWORD PTR SS:,EBX
0049CB4D   .895D CC      MOV DWORD PTR SS:,EBX
0049CB50   .895D D0      MOV DWORD PTR SS:,EBX
0049CB53   .895D F0      MOV DWORD PTR SS:,EBX
0049CB56   .895D EC      MOV DWORD PTR SS:,EBX
0049CB59   .894D F4      MOV DWORD PTR SS:,ECX
0049CB5C   .8955 F8      MOV DWORD PTR SS:,EDX
0049CB5F   .8945 FC      MOV DWORD PTR SS:,EAX
0049CB62   .8B45 F8      MOV EAX,DWORD PTR SS:
0049CB65   .E8 2A7FF6FF    CALL DriverSt.00404A94
0049CB6A   .8B45 F4      MOV EAX,DWORD PTR SS:
0049CB6D   .E8 227FF6FF    CALL DriverSt.00404A94
0049CB72   .33C0         XOR EAX,EAX
0049CB74   .55             PUSH EBP
0049CB75   .68 E0CE4900    PUSH DriverSt.0049CEE0
0049CB7A   .64:FF30      PUSH DWORD PTR FS:
0049CB7D   .64:8920      MOV DWORD PTR FS:,ESP
0049CB80   .8B45 08      MOV EAX,DWORD PTR SS:
0049CB83   .BA F8CE4900    MOV EDX,DriverSt.0049CEF8                     ;ASCII "542264156124568746123",这是校验不成功得到的返回值
0049CB88   .E8 AB7AF6FF    CALL DriverSt.00404638
0049CB8D   .8B45 F8      MOV EAX,DWORD PTR SS:
0049CB90   .E8 0F7DF6FF    CALL DriverSt.004048A4                        ;取机器码的长度
0049CB95   .8B55 FC      MOV EDX,DWORD PTR SS:
0049CB98   .3B42 58      CMP EAX,DWORD PTR DS:
0049CB9B   .0F8F 17030000JG DriverSt.0049CEB8                            ;机器码长度不大于50
0049CBA1   .8B45 F8      MOV EAX,DWORD PTR SS:
0049CBA4   .E8 FB7CF6FF    CALL DriverSt.004048A4
0049CBA9   .8B55 FC      MOV EDX,DWORD PTR SS:
0049CBAC   .3B42 5C      CMP EAX,DWORD PTR DS:
0049CBAF   .0F8C 03030000JL DriverSt.0049CEB8                            ;机器码的长度不小于5
0049CBB5   .8D45 E0      LEA EAX,DWORD PTR SS:
0049CBB8   .8B55 F4      MOV EDX,DWORD PTR SS:
0049CBBB   .8A12         MOV DL,BYTE PTR DS:                        ;注册码的第一位
0049CBBD   .8850 01      MOV BYTE PTR DS:,DL
0049CBC0   .C600 01      MOV BYTE PTR DS:,1
0049CBC3   .8D55 E0      LEA EDX,DWORD PTR SS:
0049CBC6   .8D45 DC      LEA EAX,DWORD PTR SS:
0049CBC9   .E8 3E65F6FF    CALL DriverSt.0040310C
0049CBCE   .8D45 D8      LEA EAX,DWORD PTR SS:
0049CBD1   .8B55 F4      MOV EDX,DWORD PTR SS:
0049CBD4   .8A52 02      MOV DL,BYTE PTR DS:                      ;注册码的第三位
0049CBD7   .8850 01      MOV BYTE PTR DS:,DL
0049CBDA   .C600 01      MOV BYTE PTR DS:,1
0049CBDD   .8D55 D8      LEA EDX,DWORD PTR SS:
0049CBE0   .8D45 DC      LEA EAX,DWORD PTR SS:
0049CBE3   .B1 02          MOV CL,2
0049CBE5   .E8 F264F6FF    CALL DriverSt.004030DC
0049CBEA   .8D55 DC      LEA EDX,DWORD PTR SS:
0049CBED   .8D45 F0      LEA EAX,DWORD PTR SS:
0049CBF0   .E8 537CF6FF    CALL DriverSt.00404848                        ;连接成字符串"97"
0049CBF5   .8D45 EC      LEA EAX,DWORD PTR SS:
0049CBF8   .8B55 F4      MOV EDX,DWORD PTR SS:
0049CBFB   .8A52 04      MOV DL,BYTE PTR DS:                      ;注册码的第5位
0049CBFE   .E8 C97BF6FF    CALL DriverSt.004047CC
0049CC03   .8B45 F8      MOV EAX,DWORD PTR SS:
0049CC06   .E8 997CF6FF    CALL DriverSt.004048A4                        ;取机器码的长度,我的机器码长度是23
0049CC0B   .8BF0         MOV ESI,EAX
0049CC0D   .8975 D4      MOV DWORD PTR SS:,ESI
0049CC10   .DB45 D4      FILD DWORD PTR SS:
0049CC13   .D835 10CF4900FDIV DWORD PTR DS:                      ;机器码的长度除以2
0049CC19   .E8 D263F6FF    CALL DriverSt.00402FF0                        ;结果取整数,得到11
0049CC1E   .8B55 F8      MOV EDX,DWORD PTR SS:
0049CC21   .0FB64402 FF    MOVZX EAX,BYTE PTR DS:               ;机器码的第11位
0049CC26   .8B55 F8      MOV EDX,DWORD PTR SS:
0049CC29   .0FB612         MOVZX EDX,BYTE PTR DS:                     ;机器码的第1位
0049CC2C   .8B4D F8      MOV ECX,DWORD PTR SS:
0049CC2F   .0FB649 01      MOVZX ECX,BYTE PTR DS:                   ;机器码的第2位
0049CC33   .03D1         ADD EDX,ECX
0049CC35   .03C2         ADD EAX,EDX
0049CC37   .8B55 F8      MOV EDX,DWORD PTR SS:
0049CC3A   .0FB65432 FF    MOVZX EDX,BYTE PTR DS:               ;机器码的最后一位
0049CC3F   .03C2         ADD EAX,EDX
0049CC41   .8B55 F8      MOV EDX,DWORD PTR SS:
0049CC44   .0FB65432 FE    MOVZX EDX,BYTE PTR DS:               ;机器码的倒数第二位
0049CC49   .03C2         ADD EAX,EDX                                     ;以上5位的ASC相加,得到0x100
0049CC4B   .8945 E8      MOV DWORD PTR SS:,EAX
0049CC4E   .8D45 D0      LEA EAX,DWORD PTR SS:
0049CC51   .8B4D F0      MOV ECX,DWORD PTR SS:                   ;注册码得到的"97"
0049CC54   .BA 1CCF4900    MOV EDX,DriverSt.0049CF1C
0049CC59   .E8 927CF6FF    CALL DriverSt.004048F0
0049CC5E   .8B45 D0      MOV EAX,DWORD PTR SS:
0049CC61   .BA FFFF0000    MOV EDX,0FFFF
0049CC66   .E8 F9C0F6FF    CALL DriverSt.00408D64                        ;转换位数值0x97
0049CC6B   .8BF0         MOV ESI,EAX
0049CC6D   .81FE FFFF0000CMP ESI,0FFFF
0049CC73   .0F84 3F020000JE DriverSt.0049CEB8
0049CC79   .8B45 FC      MOV EAX,DWORD PTR SS:
0049CC7C   .8B40 70      MOV EAX,DWORD PTR DS:
0049CC7F   .99             CDQ
0049CC80   .F77D E8      IDIV DWORD PTR SS:                      ;0x14387B3 mod 0x100 0xB3
0049CC83   .81E2 FF000000AND EDX,0FF
0049CC89   .3BF2         CMP ESI,EDX                                     ;余数跟0x97比
0049CC8B   .0F85 27020000JNZ DriverSt.0049CEB8
0049CC91   .8D45 CC      LEA EAX,DWORD PTR SS:
0049CC94   .8B4D EC      MOV ECX,DWORD PTR SS:
0049CC97   .BA 1CCF4900    MOV EDX,DriverSt.0049CF1C
0049CC9C   .E8 4F7CF6FF    CALL DriverSt.004048F0
0049CCA1   .8B45 CC      MOV EAX,DWORD PTR SS:
0049CCA4   .BA FFFF0000    MOV EDX,0FFFF
0049CCA9   .E8 B6C0F6FF    CALL DriverSt.00408D64                        ;注册码第五个字符"5"转为数值0x5
0049CCAE   .8BF0         MOV ESI,EAX
0049CCB0   .81FE FFFF0000CMP ESI,0FFFF
0049CCB6   .0F84 FC010000JE DriverSt.0049CEB8                            ;转化不成功就跳走
0049CCBC   .8B45 F8      MOV EAX,DWORD PTR SS:
0049CCBF   .E8 E07BF6FF    CALL DriverSt.004048A4                        ;机器码的长度
0049CCC4   .3BF0         CMP ESI,EAX                                     ;奇怪,我得机器码长度23,不可能相等啊!
0049CCC6   .EB 15          JE SHORT DriverSt.0049CCDD                      ;相等跳下去继续验证,这里暴力改为JMP 0049CCC6

高手帮看一下,因为我得机器码长度为23,但一个字符转为整数最多是15,不用暴力好像不行,不知道大家有没有遇到这种情况。

0049CCC8   .8B45 F8      MOV EAX,DWORD PTR SS:
0049CCCB   .E8 D47BF6FF    CALL DriverSt.004048A4
0049CCD0   .83F8 10      CMP EAX,10
0049CCD3   .7E 08          JLE SHORT DriverSt.0049CCDD
0049CCD5   .85F6         TEST ESI,ESI
0049CCD7   .0F85 DB010000JNZ DriverSt.0049CEB8
0049CCDD   >8D45 E0      LEA EAX,DWORD PTR SS:
0049CCE0   .8B55 F4      MOV EDX,DWORD PTR SS:
0049CCE3   .8A52 06      MOV DL,BYTE PTR DS:                      ;注册码的第7位
0049CCE6   .8850 01      MOV BYTE PTR DS:,DL
0049CCE9   .C600 01      MOV BYTE PTR DS:,1
0049CCEC   .8D55 E0      LEA EDX,DWORD PTR SS:
0049CCEF   .8D45 DC      LEA EAX,DWORD PTR SS:
0049CCF2   .E8 1564F6FF    CALL DriverSt.0040310C
0049CCF7   .8D45 D8      LEA EAX,DWORD PTR SS:
0049CCFA   .8B55 F4      MOV EDX,DWORD PTR SS:
0049CCFD   .8A52 08      MOV DL,BYTE PTR DS:                      ;注册码的第9位
0049CD00   .8850 01      MOV BYTE PTR DS:,DL
0049CD03   .C600 01      MOV BYTE PTR DS:,1
0049CD06   .8D55 D8      LEA EDX,DWORD PTR SS:
0049CD09   .8D45 DC      LEA EAX,DWORD PTR SS:
0049CD0C   .B1 02          MOV CL,2
0049CD0E   .E8 C963F6FF    CALL DriverSt.004030DC
0049CD13   .8D55 DC      LEA EDX,DWORD PTR SS:
0049CD16   .8D45 D4      LEA EAX,DWORD PTR SS:
0049CD19   .E8 EE63F6FF    CALL DriverSt.0040310C
0049CD1E   .8D45 D8      LEA EAX,DWORD PTR SS:
0049CD21   .8B55 F4      MOV EDX,DWORD PTR SS:
0049CD24   .8A52 0A      MOV DL,BYTE PTR DS:                      ;注册码的第11位
0049CD27   .8850 01      MOV BYTE PTR DS:,DL
0049CD2A   .C600 01      MOV BYTE PTR DS:,1
0049CD2D   .8D55 D8      LEA EDX,DWORD PTR SS:
0049CD30   .8D45 D4      LEA EAX,DWORD PTR SS:
0049CD33   .B1 03          MOV CL,3
0049CD35   .E8 A263F6FF    CALL DriverSt.004030DC
0049CD3A   .8D55 D4      LEA EDX,DWORD PTR SS:
0049CD3D   .8D45 F0      LEA EAX,DWORD PTR SS:
0049CD40   .E8 037BF6FF    CALL DriverSt.00404848                        ;连接得到字符串"31B"
0049CD45   .8D45 C8      LEA EAX,DWORD PTR SS:
0049CD48   .8B4D F0      MOV ECX,DWORD PTR SS:
0049CD4B   .BA 1CCF4900    MOV EDX,DriverSt.0049CF1C
0049CD50   .E8 9B7BF6FF    CALL DriverSt.004048F0
0049CD55   .8B45 C8      MOV EAX,DWORD PTR SS:
0049CD58   .BA FFFF0000    MOV EDX,0FFFF
0049CD5D   .E8 02C0F6FF    CALL DriverSt.00408D64                        ;字符串"31B"转化成整数0x31B
0049CD62   .8945 E8      MOV DWORD PTR SS:,EAX
0049CD65   .817D E8 FFFF00>CMP DWORD PTR SS:,0FFFF
0049CD6C   .0F84 46010000JE DriverSt.0049CEB8                            ;转化失败就跳向死亡
0049CD72   .33F6         XOR ESI,ESI
0049CD74   .8B45 F8      MOV EAX,DWORD PTR SS:
0049CD77   .E8 287BF6FF    CALL DriverSt.004048A4                        ;机器码的长度,准备循环
0049CD7C   .85C0         TEST EAX,EAX
0049CD7E   .7E 13          JLE SHORT DriverSt.0049CD93
0049CD80   .BB 01000000    MOV EBX,1
0049CD85   >8B55 F8      MOV EDX,DWORD PTR SS:
0049CD88   .0FB6541A FF    MOVZX EDX,BYTE PTR DS:               ;机器码的每一个字符
0049CD8D   .03F2         ADD ESI,EDX                                     ;循环求机器码的每一个字符的ASC的总和,得到0x48E
0049CD8F   .43             INC EBX
0049CD90   .48             DEC EAX
0049CD91   .^ 75 F2          JNZ SHORT DriverSt.0049CD85
0049CD93   >C1E6 04      SHL ESI,4                                       ;求得的和,左移4位,得到0x48E0
0049CD96   .8B45 FC      MOV EAX,DWORD PTR SS:
0049CD99   .3370 74      XOR ESI,DWORD PTR DS:                   ;0x48E0^0x2357417=0x2353CF7
0049CD9C   .81E6 FF0F0000AND ESI,0FFF                                    ;0x2353CF7&0xFFF=0xCF7
0049CDA2   .8975 E4      MOV DWORD PTR SS:,ESI
0049CDA5   .8B45 E4      MOV EAX,DWORD PTR SS:
0049CDA8   .3B45 E8      CMP EAX,DWORD PTR SS:                   ;0xCF7和0xB13比较
0049CDAB   .0F85 07010000JNZ DriverSt.0049CEB8                           ;不相等就跳向死亡
0049CDB1   .8B45 F4      MOV EAX,DWORD PTR SS:
0049CDB4   .E8 EB7AF6FF    CALL DriverSt.004048A4                        ;注册码的长度
0049CDB9   .83F8 0C      CMP EAX,0C                                    ;长度应该是12
0049CDBC   .0F8E E9000000JLE DriverSt.0049CEAB                           ;长度是12跳向成功
0049CDC2   .8D45 EC      LEA EAX,DWORD PTR SS:
0049CDC5   .E8 1A78F6FF    CALL DriverSt.004045E4
0049CDCA   .33C0         XOR EAX,EAX
0049CDCC   .8945 E4      MOV DWORD PTR SS:,EAX
0049CDCF   .8B45 F8      MOV EAX,DWORD PTR SS:
0049CDD2   .E8 CD7AF6FF    CALL DriverSt.004048A4
0049CDD7   .85C0         TEST EAX,EAX
0049CDD9   .7E 14          JLE SHORT DriverSt.0049CDEF
0049CDDB   .BB 01000000    MOV EBX,1
0049CDE0   >8B55 F8      MOV EDX,DWORD PTR SS:
0049CDE3   .0FB6541A FF    MOVZX EDX,BYTE PTR DS:
0049CDE8   .0155 E4      ADD DWORD PTR SS:,EDX
0049CDEB   .43             INC EBX
0049CDEC   .48             DEC EAX
0049CDED   .^ 75 F1          JNZ SHORT DriverSt.0049CDE0
0049CDEF   >B8 FFFFFF07    MOV EAX,7FFFFFF
0049CDF4   .99             CDQ
0049CDF5   .F77D E4      IDIV DWORD PTR SS:
0049CDF8   .F76D E4      IMUL DWORD PTR SS:
0049CDFB   .8945 E4      MOV DWORD PTR SS:,EAX
0049CDFE   .8B45 F4      MOV EAX,DWORD PTR SS:
0049CE01   .E8 9E7AF6FF    CALL DriverSt.004048A4
0049CE06   .83E8 0C      SUB EAX,0C
0049CE09   .8945 E8      MOV DWORD PTR SS:,EAX
0049CE0C   .8D45 F0      LEA EAX,DWORD PTR SS:
0049CE0F   .50             PUSH EAX
0049CE10   .8B4D E8      MOV ECX,DWORD PTR SS:
0049CE13   .BA 0D000000    MOV EDX,0D
0049CE18   .8B45 F4      MOV EAX,DWORD PTR SS:
0049CE1B   .E8 E47CF6FF    CALL DriverSt.00404B04
0049CE20   .BF 1F000000    MOV EDI,1F
0049CE25   .BB 01000000    MOV EBX,1
0049CE2A   >8BCB         MOV ECX,EBX
0049CE2C   .8B45 FC      MOV EAX,DWORD PTR SS:
0049CE2F   .8B40 78      MOV EAX,DWORD PTR DS:
0049CE32   .8BF0         MOV ESI,EAX
0049CE34   .D3E6         SHL ESI,CL
0049CE36   .8BCF         MOV ECX,EDI
0049CE38   .D3E8         SHR EAX,CL
0049CE3A   .0BF0         OR ESI,EAX
0049CE3C   .8BC6         MOV EAX,ESI
0049CE3E   .99             CDQ
0049CE3F   .33C2         XOR EAX,EDX
0049CE41   .2BC2         SUB EAX,EDX
0049CE43   .8BF0         MOV ESI,EAX
0049CE45   .3B75 E4      CMP ESI,DWORD PTR SS:
0049CE48   .7E 0A          JLE SHORT DriverSt.0049CE54
0049CE4A   .8BC6         MOV EAX,ESI
0049CE4C   .99             CDQ
0049CE4D   .F77D E4      IDIV DWORD PTR SS:
0049CE50   .8BF2         MOV ESI,EDX
0049CE52   .EB 08          JMP SHORT DriverSt.0049CE5C
0049CE54   >8B45 E4      MOV EAX,DWORD PTR SS:
0049CE57   .99             CDQ
0049CE58   .F7FE         IDIV ESI
0049CE5A   .8BF2         MOV ESI,EDX
0049CE5C   >8D4D C4      LEA ECX,DWORD PTR SS:
0049CE5F   .8BC6         MOV EAX,ESI
0049CE61   .25 FF0F0000    AND EAX,0FFF
0049CE66   .BA 03000000    MOV EDX,3
0049CE6B   .E8 90BEF6FF    CALL DriverSt.00408D00
0049CE70   .8B55 C4      MOV EDX,DWORD PTR SS:
0049CE73   .8D45 EC      LEA EAX,DWORD PTR SS:
0049CE76   .E8 317AF6FF    CALL DriverSt.004048AC
0049CE7B   .4F             DEC EDI
0049CE7C   .43             INC EBX
0049CE7D   .83FB 21      CMP EBX,21
0049CE80   .^ 75 A8          JNZ SHORT DriverSt.0049CE2A
0049CE82   .8D45 EC      LEA EAX,DWORD PTR SS:
0049CE85   .50             PUSH EAX
0049CE86   .8B45 FC      MOV EAX,DWORD PTR SS:
0049CE89   .8B48 6C      MOV ECX,DWORD PTR DS:
0049CE8C   .83E9 0C      SUB ECX,0C
0049CE8F   .BA 01000000    MOV EDX,1
0049CE94   .8B45 EC      MOV EAX,DWORD PTR SS:
0049CE97   .E8 687CF6FF    CALL DriverSt.00404B04
0049CE9C   .8B55 EC      MOV EDX,DWORD PTR SS:
0049CE9F   .8B45 F0      MOV EAX,DWORD PTR SS:
0049CEA2   .E8 15B9F6FF    CALL DriverSt.004087BC
0049CEA7   .85C0         TEST EAX,EAX
0049CEA9   .75 0D          JNZ SHORT DriverSt.0049CEB8
0049CEAB   >8B45 08      MOV EAX,DWORD PTR SS:
0049CEAE   .BA 28CF4900    MOV EDX,DriverSt.0049CF28                     ;ASCII "645364631365423154824"这是校验成功的返回字符串,如果程序走到这儿就成功了。
0049CEB3   .E8 8077F6FF    CALL DriverSt.00404638
0049CEB8   >33C0         XOR EAX,EAX
0049CEBA   .5A             POP EDX
0049CEBB   .59             POP ECX
0049CEBC   .59             POP ECX
0049CEBD   .64:8910      MOV DWORD PTR FS:,EDX
0049CEC0   .68 E7CE4900    PUSH DriverSt.0049CEE7
0049CEC5   >8D45 C4      LEA EAX,DWORD PTR SS:
0049CEC8   .BA 04000000    MOV EDX,4
0049CECD   .E8 3677F6FF    CALL DriverSt.00404608
0049CED2   .8D45 EC      LEA EAX,DWORD PTR SS:
0049CED5   .BA 04000000    MOV EDX,4
0049CEDA   .E8 2977F6FF    CALL DriverSt.00404608
0049CEDF   .C3             RETN

最终得到我电脑上的注册码:"BB3D58C2FA74D"

-------------------------------------------------------------------------------------------
【破解心得】

注册码由12个字符组成,对各个字符的校验如下:

第偶数个字符满足:

注册码的第2个字符转化为整数,然后跟0x7异或,结果作为日期
注册码的第10、8个字符连接后,字符串转为整数,跟0xB7异或,结果作为月份
注册码的第4、6、12个字符连接,字符串转为整数,跟0x5B7异或,结果作为年份
以上日期、月份、年份组成的日期要在当前日期之后

第奇数个字符满足:

机器码的前两个字符,机器码的最后两个字符,机器码的中间的一个字符(机器码长度为偶数,如22个字符就取第11个字符,机器码长度为奇数,如23个字符也取第11个字符),以上五个字符的ASC求和,然后用0x14387B3对以上的结果取余,余数的最后两位分别填充注册码的第1、3个字符。
注册码的第五个字符要等于机器码的长度。(这一点好像很难做的,第五个字符最多是"F",转为整数15,而我得机器码是23位,这个地方我用了暴力破解,高手帮我看看这个程序,难道非强暴不可,"我想做个好人"。)
机器码的所有字符的ASC求和,结果左移4位,在跟0x2353CF7位与运算,结果的最后三位分别填充注册码的第7.9.11个字符。

-------------------------------------------------------------------------------------------
【破解声明】   我是一只小菜鸟,偶得一点心得,愿与大家分享:)

【版权声明】   本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!
-------------------------------------------------------------------------------------------
                                                                     文章写于2005-6-7 11:26:02

lovexy 发表于 2005-6-4 19:44:59

强啊~~
我也看过这个的算法麻烦就算了
页: [1]
查看完整版本: 驱动程序备份专家 V2.7 的注册