驱动程序备份专家 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 强啊~~
我也看过这个的算法麻烦就算了
页:
[1]