【破文作者】lnn1123
【所属组织】[BCG][DFCG]
【作者主页】http://blog.csdn.net/lnn1123
【文章题目】WebPageMaker 2.2.0 注册算法分析
【加密方式】MD5
【破解工具】ollydbg+IDA
=======================================================================================================
【软件简介】
肯定是用来做WEB 的拉
=======================================================================================================
【解密过程】
预处理注册名,注册码
CODE:00699D4C push ebp
CODE:00699D4D mov ebp, esp
CODE:00699D4F push 0
CODE:00699D51 push 0
CODE:00699D53 push ebx
CODE:00699D54 mov ebx, eax
CODE:00699D56 xor eax, eax
CODE:00699D58 push ebp
CODE:00699D59 push offset loc_699DD5
CODE:00699D5E push dword ptr fs:[eax]
CODE:00699D61 mov fs:[eax], esp
CODE:00699D64 lea edx, [ebp+var_4]
CODE:00699D67 mov eax, [ebx+320h]
CODE:00699D6D call sub_48AD70
CODE:00699D72 lea edx, [ebp+var_8]
CODE:00699D75 mov eax, [ebx+324h]
CODE:00699D7B call sub_48AD70
CODE:00699D80 cmp [ebp+var_4], 0 ; 注册名为空?
CODE:00699D80 ;
CODE:00699D80 ;
CODE:00699D84 jz short loc_699D8C
CODE:00699D86 cmp [ebp+var_8], 0 ; 注册码为空?
CODE:00699D86 ;
CODE:00699D8A jnz short loc_699D96
CODE:00699D8C
CODE:00699D8C loc_699D8C: ; CODE XREF: sub_699D4C+38j
CODE:00699D8C xor eax, eax
CODE:00699D8E mov [ebx+24Ch], eax
CODE:00699D94 jmp short loc_699DBA
CODE:00699D96 ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
CODE:00699D96
CODE:00699D96 loc_699D96: ; CODE XREF: sub_699D4C+3Ej
CODE:00699D96 mov edx, [ebp+var_8] ; 指向注册码
CODE:00699D99 mov eax, [ebp+var_4] ; 指向注册名
CODE:00699D9C call sub_4A16A0 ; 把注册信息写进Config.dat文件
{
CODE:004A16A0 push ebp
CODE:004A16A1 mov ebp, esp
CODE:004A16A3 add esp, 0FFFFFFF8h
CODE:004A16A6 push ebx
CODE:004A16A7 push esi
CODE:004A16A8 xor ecx, ecx
CODE:004A16AA mov [ebp+var_8], ecx
CODE:004A16AD mov [ebp+var_4], edx
CODE:004A16B0 mov esi, eax
CODE:004A16B2 xor eax, eax
CODE:004A16B4 push ebp
CODE:004A16B5 push offset loc_4A172A
CODE:004A16BA push dword ptr fs:[eax]
CODE:004A16BD mov fs:[eax], esp
CODE:004A16C0 mov edx, ds:off_6C5CB8
CODE:004A16C6 mov edx, [edx]
CODE:004A16C8 lea eax, [ebp+var_8]
CODE:004A16CB mov ecx, offset dword_4A1740
CODE:004A16D0 call sub_404EE8
CODE:004A16D5 mov ecx, [ebp+var_8]
CODE:004A16D8 mov dl, 1
CODE:004A16DA mov eax, off_432830
CODE:004A16DF call sub_4328E0
CODE:004A16E4 mov ebx, eax
CODE:004A16E6 push esi
CODE:004A16E7 mov ecx, offset aUser_0 ; "User"
CODE:004A16EC mov edx, offset aRegistration_1 ; "Registration"
CODE:004A16F1 mov eax, ebx
CODE:004A16F3 mov esi, [eax]
CODE:004A16F5 call dword ptr [esi+4] ; 写入注册名
CODE:004A16F8 mov eax, [ebp+var_4]
CODE:004A16FB push eax
CODE:004A16FC mov ecx, offset aLicense_0 ; "License"
CODE:004A1701 mov edx, offset aRegistration_1 ; "Registration"
CODE:004A1706 mov eax, ebx
CODE:004A1708 mov esi, [eax]
CODE:004A170A call dword ptr [esi+4] ; 写入注册码
CODE:004A170D mov eax, ebx
CODE:004A170F call sub_403D50
CODE:004A1714 xor eax, eax
CODE:004A1716 pop edx
CODE:004A1717 pop ecx
CODE:004A1718 pop ecx
CODE:004A1719 mov fs:[eax], edx
CODE:004A171C push offset loc_4A1731
CODE:004A1721
CODE:004A1721 loc_4A1721: ; CODE XREF: CODE:004A172Fj
CODE:004A1721 lea eax, [ebp+var_8]
CODE:004A1724 call sub_404BC0
CODE:004A1729 retn
}
CODE:00699DA1 push 40h ; uType
CODE:00699DA3 push offset aWebPageMake_10 ; "Web Page Maker V2"
CODE:00699DA8 push offset aPleaseCloseWeb ; "Please close Web Page Maker and restart"...
CODE:00699DAD mov eax, ebx
CODE:00699DAF call sub_4916AC
CODE:00699DB4 push eax ; hWnd
CODE:00699DB5 call MessageBoxA_0
CODE:00699DBA
CODE:00699DBA loc_699DBA: ; CODE XREF: sub_699D4C+48j
CODE:00699DBA xor eax, eax
CODE:00699DBC pop edx
CODE:00699DBD pop ecx
CODE:00699DBE pop ecx
CODE:00699DBF mov fs:[eax], edx
CODE:00699DC2 push offset loc_699DDC
CODE:00699DC7
CODE:00699DC7 loc_699DC7: ; CODE XREF: CODE:00699DDAj
CODE:00699DC7 lea eax, [ebp+var_8]
CODE:00699DCA mov edx, 2
CODE:00699DCF call sub_404BE4
CODE:00699DD4 retn
验证函数
CODE:006B818C push ebx
CODE:006B818D mov ebx, eax
CODE:006B818F mov ecx, ebx
CODE:006B8191 mov dl, 1
CODE:006B8193 mov eax, off_69D660
CODE:006B8198 call sub_473E8C
CODE:006B819D mov edx, ds:off_6C5AC4
CODE:006B81A3 mov [edx], eax
CODE:006B81A5 mov eax, ds:off_6C5AC4
CODE:006B81AA mov eax, [eax]
CODE:006B81AC call sub_6A004C ; 注册验证函数
CODE:006B81AC ;
CODE:006B81B1 test al, al
CODE:006B81B3 jz short loc_6B8228
CODE:006B81B5 mov edx, offset aWebPageMake_21 ; "Web Page Maker V2 Unregistered Version"
CODE:006B81BA mov eax, ebx
CODE:006B81BC call sub_48ADA0
CODE:006B81C1 call sub_4A1124
CODE:006B81C6 inc eax
CODE:006B81C7 jnz short loc_6B8234
CODE:006B81C9 push 21h ; uType
CODE:006B81CB push offset aWebPageMake_22 ; "Web Page Maker V2"
CODE:006B81D0 push offset aYour15DayTrial ; "Your 15 day trial period for Web Page M"...
CODE:006B81D5 mov eax, ebx
CODE:006B81D7 call sub_4916AC
CODE:006B81DC push eax ; hWnd
CODE:006B81DD call MessageBoxA_0
CODE:006B81E2 dec eax
CODE:006B81E3 jnz short loc_6B821F
CODE:006B81E5 xor ecx, ecx
CODE:006B81E7 mov dl, 1
CODE:006B81E9 mov eax, off_699A78
CODE:006B81EE call sub_473E8C
CODE:006B81F3 mov edx, ds:off_6C5A5C
CODE:006B81F9 mov [edx], eax
CODE:006B81FB mov eax, ds:off_6C5A5C
CODE:006B8200 mov eax, [eax]
CODE:006B8202 mov edx, [eax]
CODE:006B8204 call dword ptr [edx+0ECh]
CODE:006B820A mov eax, ds:off_6C5A5C
CODE:006B820F mov eax, [eax]
CODE:006B8211 call sub_403D50
CODE:006B8216 mov eax, ebx
CODE:006B8218 call sub_478054
CODE:006B821D pop ebx
CODE:006B821E retn
===========================================call sub_6A004C=========================================
CODE:006A004C var_70 = dword ptr -70h
CODE:006A004C var_6C = dword ptr -6Ch
CODE:006A004C var_68 = dword ptr -68h
CODE:006A004C var_64 = dword ptr -64h
CODE:006A004C var_60 = dword ptr -60h
CODE:006A004C var_5C = dword ptr -5Ch
CODE:006A004C var_58 = dword ptr -58h
CODE:006A004C var_54 = dword ptr -54h
CODE:006A004C var_50 = dword ptr -50h
CODE:006A004C var_4C = dword ptr -4Ch
CODE:006A004C var_48 = dword ptr -48h
CODE:006A004C var_44 = dword ptr -44h
CODE:006A004C var_40 = dword ptr -40h
CODE:006A004C var_3C = dword ptr -3Ch
CODE:006A004C var_38 = dword ptr -38h
CODE:006A004C var_34 = dword ptr -34h
CODE:006A004C var_24 = dword ptr -24h
CODE:006A004C var_20 = dword ptr -20h
CODE:006A004C var_1C = dword ptr -1Ch
CODE:006A004C var_18 = dword ptr -18h
CODE:006A004C var_10 = dword ptr -10h
CODE:006A004C var_C = dword ptr -0Ch
CODE:006A004C var_8 = dword ptr -8
CODE:006A004C var_4 = dword ptr -4
CODE:006A004C
CODE:006A004C push ebp
CODE:006A004D mov ebp, esp
CODE:006A004F mov ecx, 0Eh
CODE:006A0054
CODE:006A0054 loc_6A0054: ; CODE XREF: sub_6A004C+Dj
CODE:006A0054 push 0
CODE:006A0056 push 0
CODE:006A0058 dec ecx
CODE:006A0059 jnz short loc_6A0054
CODE:006A005B push ebx
CODE:006A005C push esi
CODE:006A005D push edi
CODE:006A005E mov esi, eax
CODE:006A0060 xor eax, eax
CODE:006A0062 push ebp
CODE:006A0063 push offset loc_6A0407
CODE:006A0068
CODE:006A0068 loc_6A0068: ; DATA XREF: CODE:off_47CF60o
CODE:006A0068 ; CODE:off_49BD82o ...
CODE:006A0068 push dword ptr fs:[eax]
CODE:006A006B mov fs:[eax], esp
CODE:006A006E mov bl, 1
CODE:006A0070 mov eax, ds:off_6C5A60
CODE:006A0075 cmp dword ptr [eax], 0FFFFFFFFh
CODE:006A0078 jnz short loc_6A00B0
CODE:006A007A mov eax, ds:off_6C5A60
CODE:006A007F cmp dword ptr [eax+4], 0FFFFFFFFh
CODE:006A0083 jnz short loc_6A00B0
CODE:006A0085 mov edi, [esi+520h]
CODE:006A008B mov eax, [esi+48h]
CODE:006A008E sub eax, [edi+2DCh]
CODE:006A0094 sub eax, 32h
CODE:006A0097 lea ecx, [ebp+var_18]
CODE:006A009A mov edx, 64h
CODE:006A009F call sub_41B49C
CODE:006A00A4 lea edx, [ebp+var_18]
CODE:006A00A7 mov eax, edi
CODE:006A00A9 call sub_55D0E0
CODE:006A00AE jmp short loc_6A00C1
CODE:006A00B0 ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
CODE:006A00B0
CODE:006A00B0 loc_6A00B0: ; CODE XREF: sub_6A004C+2Cj
CODE:006A00B0 ; sub_6A004C+37j
CODE:006A00B0 mov edx, ds:off_6C5A60
CODE:006A00B6 mov eax, [esi+520h]
CODE:006A00BC call sub_55D0E0
CODE:006A00C1
CODE:006A00C1 loc_6A00C1: ; CODE XREF: sub_6A004C+62j
CODE:006A00C1 mov eax, ds:off_6C624C
CODE:006A00C6 mov eax, [eax]
CODE:006A00C8 call sub_4792F0
CODE:006A00CD cmp eax, 320h
CODE:006A00D2 jle short loc_6A00DE
CODE:006A00D4 mov eax, ds:off_6C61C8
CODE:006A00D9 cmp byte ptr [eax], 0
CODE:006A00DC jz short loc_6A00F8
CODE:006A00DE
CODE:006A00DE loc_6A00DE: ; CODE XREF: sub_6A004C+86j
CODE:006A00DE mov dl, 1
CODE:006A00E0 mov eax, [esi+520h]
CODE:006A00E6 call sub_55CEC4
CODE:006A00EB mov dl, 1
CODE:006A00ED mov eax, [esi+520h]
CODE:006A00F3 call sub_559708
CODE:006A00F8
CODE:006A00F8 loc_6A00F8: ; CODE XREF: sub_6A004C+90j
CODE:006A00F8 xor edx, edx
CODE:006A00FA mov eax, [esi+780h]
CODE:006A0100 call sub_450F90
CODE:006A0105 mov edx, ds:off_6C5958
CODE:006A010B mov dl, [edx]
CODE:006A010D mov eax, [esi+520h]
CODE:006A0113 call sub_48AC90
CODE:006A0118 mov edx, ds:off_6C5958
CODE:006A011E mov dl, [edx]
CODE:006A0120 mov eax, [esi+664h]
CODE:006A0126 call sub_46E810
CODE:006A012B mov eax, esi
CODE:006A012D call sub_6AF848
CODE:006A0132 lea edx, [ebp+var_4]
CODE:006A0135 lea eax, [ebp+var_10]
CODE:006A0138 call sub_4A1578
CODE:006A013D cmp [ebp+var_10], 0 ; 注册名为空?
CODE:006A0141 jz loc_6A03C0
CODE:006A0147 cmp [ebp+var_4], 0 ; 注册码为空?
CODE:006A014B jz loc_6A03C0
CODE:006A0151 mov eax, [ebp+var_4] ; 指向注册码
CODE:006A0154 call sub_404E9C ; 返回注册码长度
CODE:006A0159 cmp eax, 17h ; 输入的注册码必须为23位
CODE:006A015C jnz loc_6A03C0
CODE:006A0162 mov dl, 1
CODE:006A0164 mov eax, off_41A798
CODE:006A0169 call sub_403D20
CODE:006A016E mov [ebp+var_8], eax
CODE:006A0171 push ebp
CODE:006A0172 call sub_69FF88
CODE:006A0177 pop ecx
CODE:006A0178 mov eax, [ebp+var_8]
CODE:006A017B mov edx, [eax]
CODE:006A017D call dword ptr [edx+14h]
CODE:006A0180 cmp eax, 4
CODE:006A0183 jnz loc_6A03B8
CODE:006A0189 lea ecx, [ebp+var_1C]
CODE:006A018C xor edx, edx ; 要取得的注册码的段索引
CODE:006A018E mov eax, [ebp+var_8]
CODE:006A0191 mov edi, [eax]
CODE:006A0193 call dword ptr [edi+0Ch]
CODE:006A0196 mov eax, [ebp+var_1C] ; eax指向注册码前5位
CODE:006A0199 or edx, 0FFFFFFFFh
CODE:006A019C call sub_409E40 ; 把eax指向的转化为16进制表示
CODE:006A01A1 mov [ebp+var_C], eax ; 保存
CODE:006A01A4 lea ecx, [ebp+var_20]
CODE:006A01A7 mov edx, 3 ; 要取得的注册码的段索引
CODE:006A01AC mov eax, [ebp+var_8]
CODE:006A01AF mov edi, [eax]
CODE:006A01B1 call dword ptr [edi+0Ch]
CODE:006A01B4 mov eax, [ebp+var_20] ; 指向注册码最后5位
CODE:006A01B7 or edx, 0FFFFFFFFh
CODE:006A01BA call sub_409E40 ; 把eax指向的转化为16进制表示
CODE:006A01BF cmp [ebp+var_C], 0FFFFFFFFh ; 返回是-1?
CODE:006A01C3 jz loc_6A03B8
CODE:006A01C9 cmp eax, 0FFFFFFFFh ; 返回是-1?
CODE:006A01CC jz loc_6A03B8
CODE:006A01D2 mov edi, [ebp+var_C] ; a
CODE:006A01D5 add edi, eax ; a+=b
CODE:006A01D7 lea edx, [ebp+var_38]
CODE:006A01DA mov eax, edi
CODE:006A01DC call sub_409C98 ; a转化为10进制
CODE:006A01E1 mov eax, [ebp+var_38] ; a转化为10进制的结果记为c
CODE:006A01E4 lea edx, [ebp+var_34]
CODE:006A01E7 call sub_49F2B4
CODE:006A01EC lea eax, [ebp+var_34]
CODE:006A01EF lea edx, [ebp+var_24]
CODE:006A01F2 call sub_49F240
CODE:006A01F7 mov eax, [ebp+var_24]
CODE:006A01FA mov edx, offset a1c395a8dce13_0 ; "1c395a8dce135849bd73c6dba3b54809"
CODE:006A01FF call sub_4095D4 ; MD5(c)与内置密文比较
CODE:006A0204 test eax, eax
CODE:006A0206 jnz loc_6A03B8 ; 不等就注册失败
CODE:006A020C lea ecx, [ebp+var_3C]
CODE:006A020F mov edx, 1 ; 要取得的注册码的段索引
CODE:006A0214 mov eax, [ebp+var_8]
CODE:006A0217 mov edi, [eax]
CODE:006A0219 call dword ptr [edi+0Ch]
CODE:006A021C mov eax, [ebp+var_3C] ; 指向注册码第2段
CODE:006A021F or edx, 0FFFFFFFFh
CODE:006A0222 call sub_409E40 ; 把eax指向的转化为16进制表示记为d
CODE:006A0227 mov [ebp+var_C], eax ; 保存返回值
CODE:006A022A lea ecx, [ebp+var_40]
CODE:006A022D mov edx, 2 ; 要取得的注册码的段索引
CODE:006A0232 mov eax, [ebp+var_8]
CODE:006A0235 mov edi, [eax]
CODE:006A0237 call dword ptr [edi+0Ch]
CODE:006A023A mov eax, [ebp+var_40] ; 指向注册码的第三段
CODE:006A023D or edx, 0FFFFFFFFh
CODE:006A0240 call sub_409E40 ; 把eax指向的转化为16进制表示记为e
CODE:006A0245 cmp [ebp+var_C], 0FFFFFFFFh
CODE:006A0249 jz loc_6A03B8
CODE:006A024F inc eax
CODE:006A0250 jz loc_6A03B8
CODE:006A0256 lea eax, [ebp+var_44]
CODE:006A0259 push eax
CODE:006A025A lea ecx, [ebp+var_48]
CODE:006A025D mov edx, 1 ; 要取得的注册码的段索引
CODE:006A0262 mov eax, [ebp+var_8]
CODE:006A0265 mov edi, [eax]
CODE:006A0267 call dword ptr [edi+0Ch]
CODE:006A026A mov eax, [ebp+var_48] ; 指向注册码的第2段
CODE:006A026D mov ecx, 7FFFFFFFh
CODE:006A0272 mov edx, 3 ; 在第2段取得后三位
CODE:006A0277 call sub_4050FC
CODE:006A027C mov eax, [ebp+var_44] ; 指向第2段后3位
CODE:006A027F xor edx, edx
CODE:006A0281 call sub_409E40 ; 转化为16进制表示
CODE:006A0286 mov [ebp+var_C], eax ; 保存
CODE:006A0289 lea eax, [ebp+var_4C]
CODE:006A028C push eax
CODE:006A028D lea ecx, [ebp+var_50]
CODE:006A0290 mov edx, 2 ; 要取得的注册码的段索引
CODE:006A0295 mov eax, [ebp+var_8]
CODE:006A0298 mov edi, [eax]
CODE:006A029A call dword ptr [edi+0Ch]
CODE:006A029D mov eax, [ebp+var_50] ; 指向注册玛第3段
CODE:006A02A0 mov ecx, 7FFFFFFFh
CODE:006A02A5 mov edx, 3 ; 指向第3段后3位
CODE:006A02AA call sub_4050FC
CODE:006A02AF mov eax, [ebp+var_4C] ; 指向第3段后3位
CODE:006A02B2 xor edx, edx
CODE:006A02B4 call sub_409E40 ; 转化为16进制表示
CODE:006A02B9 mov edi, [ebp+var_C] ; 第2段注册码后3位的16进制
CODE:006A02BC add edi, eax ; 加上第3段后3位16进制表示
CODE:006A02BE lea edx, [ebp+var_58]
CODE:006A02C1 mov eax, edi
CODE:006A02C3 call sub_409C98 ; 转化为10进制表示记为a1
CODE:006A02C8 mov eax, [ebp+var_58]
CODE:006A02CB lea edx, [ebp+var_34]
CODE:006A02CE call sub_49F2B4 ; MD5(a1)
CODE:006A02D3 lea eax, [ebp+var_34]
CODE:006A02D6 lea edx, [ebp+var_54]
CODE:006A02D9 call sub_49F240 ; MD5(a1)结果字符化
CODE:006A02DE mov eax, [ebp+var_54]
CODE:006A02E1 mov edx, offset a65cc2c8205a0_0 ; "65cc2c8205a05d7379fa3a6386f710e1"
CODE:006A02E6 call sub_4095D4 ; MD5(a1)与内置密文比较
CODE:006A02EB test eax, eax
CODE:006A02ED jnz loc_6A03B8 ; 不等就注册失败
CODE:006A02F3 lea eax, [ebp+var_5C]
CODE:006A02F6 push eax
CODE:006A02F7 lea ecx, [ebp+var_60]
CODE:006A02FA mov edx, 1 ; 要取得的注册码的段索引
CODE:006A02FF mov eax, [ebp+var_8]
CODE:006A0302 mov edi, [eax]
CODE:006A0304 call dword ptr [edi+0Ch]
CODE:006A0307 mov eax, [ebp+var_60] ; 指向注册码第2段
CODE:006A030A mov ecx, 2 ; 取第2段的前2位
CODE:006A030F xor edx, edx
CODE:006A0311 call sub_4050FC
CODE:006A0316 mov eax, [ebp+var_5C] ; 指向第2段的前2位
CODE:006A0319 xor edx, edx
CODE:006A031B call sub_409E40 ; 转化为16进制表示
CODE:006A0320 mov [ebp+var_C], eax ; 保存
CODE:006A0323 lea eax, [ebp+var_64]
CODE:006A0326 push eax
CODE:006A0327 lea ecx, [ebp+var_68]
CODE:006A032A mov edx, 2 ; 要取得的注册码的段索引
CODE:006A032F mov eax, [ebp+var_8]
CODE:006A0332 mov edi, [eax]
CODE:006A0334 call dword ptr [edi+0Ch]
CODE:006A0337 mov eax, [ebp+var_68] ; 指向注册码第3段
CODE:006A033A mov ecx, 2 ; 指向第3段的前2位
CODE:006A033F xor edx, edx
CODE:006A0341 call sub_4050FC
CODE:006A0346 mov eax, [ebp+var_64] ; 指向第3段的前2位
CODE:006A0349 xor edx, edx
CODE:006A034B call sub_409E40 ; 转化为16进制表示
CODE:006A0350 mov edi, [ebp+var_C] ; 转化后的result1
CODE:006A0353 add edi, eax ; result1+=result2
CODE:006A0355 lea edx, [ebp+var_70]
CODE:006A0358 mov eax, edi
CODE:006A035A call sub_409C98 ; 将result1转化为10进表示
CODE:006A035F mov eax, [ebp+var_70]
CODE:006A0362 lea edx, [ebp+var_34]
CODE:006A0365 call sub_49F2B4 ; MD5(result1)
CODE:006A0365 ;
CODE:006A036A lea eax, [ebp+var_34]
CODE:006A036D lea edx, [ebp+var_6C]
CODE:006A0370 call sub_49F240 ; MD5(result)字符化
CODE:006A0375 mov eax, [ebp+var_6C]
CODE:006A0378 mov edx, offset aD1fe173d08e959 ; "d1fe173d08e959397adf34b1d77e88d7"
CODE:006A037D call sub_4095D4 ; Md5(result1)与内置密文比较
CODE:006A0382 test eax, eax
CODE:006A0384 jnz short loc_6A03B8 ; 不等就注册失败
CODE:006A0386 xor ebx, ebx
CODE:006A0388 xor edx, edx
CODE:006A038A mov eax, [esi+764h]
CODE:006A0390 call sub_46EC20 ; 到这里就注册成功了
CODE:006A0395 xor edx, edx
CODE:006A0397 mov eax, [esi+768h]
CODE:006A039D call sub_46EC20
CODE:006A03A2 mov eax, [esi+764h]
CODE:006A03A8 mov al, [eax+86h]
CODE:006A03AE xor al, 1
CODE:006A03B0 mov edx, ds:off_6C6188
CODE:006A03B6 mov [edx], al
CODE:006A03B8
CODE:006A03B8 loc_6A03B8: ; CODE XREF: sub_6A004C+137j
CODE:006A03B8 ; sub_6A004C+177j ...
CODE:006A03B8 mov eax, [ebp+var_8]
CODE:006A03BB call sub_403D50
CODE:006A03C0
CODE:006A03C0 loc_6A03C0: ; CODE XREF: sub_6A004C+F5j
CODE:006A03C0 ; sub_6A004C+FFj ...
CODE:006A03C0 xor eax, eax
CODE:006A03C2 mov al, bl
CODE:006A03C4 add eax, 320h
CODE:006A03C9 mov [esi+88Ch], eax
CODE:006A03CF xor eax, eax
CODE:006A03D1 pop edx
CODE:006A03D2 pop ecx
CODE:006A03D3 pop ecx
CODE:006A03D4 mov fs:[eax], edx
CODE:006A03D7 push offset loc_6A040E
CODE:006A03DC
CODE:006A03DC loc_6A03DC: ; CODE XREF: sub_6A004C+3C0j
CODE:006A03DC lea eax, [ebp+var_70]
CODE:006A03DF mov edx, 0Fh
CODE:006A03E4 call sub_404BE4
CODE:006A03E9 lea eax, [ebp+var_24]
CODE:006A03EC mov edx, 3
CODE:006A03F1 call sub_404BE4
CODE:006A03F6 lea eax, [ebp+var_10]
CODE:006A03F9 call sub_404BC0
CODE:006A03FE lea eax, [ebp+var_4]
CODE:006A0401 call sub_404BC0
CODE:006A0406 retn
分析到这里,有一个很重要的东西就是三个密文
"1c395a8dce135849bd73c6dba3b54809"
"65cc2c8205a05d7379fa3a6386f710e1"
"d1fe173d08e959397adf34b1d77e88d7"
软件注册验证的时候用到了MD5,那我猜这三个密文很可能是MD5 密文,用Md5Crack跑看看,很快解的明文是
88888 MD5(88888)=1c395a8dce135849bd73c6dba3b54809
1020 MD5(1020)=65cc2c8205a05d7379fa3a6386f710e1
79 MD5(79)=d1fe173d08e959397adf34b1d77e88d7
到这里注册算法已经很清楚了
注册码格式是这样的XXXXX-XXXXX-XXXXX-XXXXX
假设a指向注册码,注册成功的条件是
第1段+第4段=88888
第2段后3位+ 第3段后3位=1020
第2段前2位+ 第3段前2位=79
分析到这里,已经发现关键是这段密文的破解,如果是设置的比较复杂的话,那要你会很多时间跑,但是这个软件用的还是比较简单的,
机机好写的很吧 呵呵
【破解声明】我是一个小小菜虫子,文章如有错误,请高手指正!
【版权声明】本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!
=======================================================================================================
文章完成于2006-4-8 欣?网吧 6:02:59
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课