《飞天餐饮娱乐管理系统》的暴力破解法:
1)在004A2A48处
改:0F 85 8A 00 00 00 C7 05 74 2C 52 00 01 00 00 00
^^ ^^ ^^ ^^ ^^ ^^
为:90 90 90 90 90 90
2)在004A1B29处
改:74 04 33 C0 EB 0A 42 40 49 75 F1
^^
为:EB
然后,随便用你的姓名和足够长的Code注册,注册完以后关闭程序,重新运行你就可以看到结果了。
【算法代码分析】
此软件的注册码算法很复杂(真的不知道有没有弄懂的必要,呵呵)。
假设姓名为Name 简称 N 字符串;注册码为Code 简称 C 字符串;另外此算法还根据C得到了一个 KEY 简称 K 字符串。
令C' = Fc(C) —— 其中 Fc()为函数其意义为:将字符串 C 去掉 '-'后两两合并,例如:1234-56789012-3456
合
并成 12 34 56 78 90 12 34 56(16进制)共八个字节。又如:1a2b-3c4d5e6f-7g8h 合并成:1a 2b 3c 4d
5e 6f 7g 8h 。
这个函数是004A1AE3处的call 004A187C 。
:004A1AD0 55
push ebp
:004A1AD1 8BEC
mov ebp, esp
:004A1AD3 83C4F0
add esp, FFFFFFF0
:004A1AD6 53
push ebx
:004A1AD7 56
push esi
:004A1AD8 57
push edi
:004A1AD9 8BD9
mov ebx, ecx
:004A1ADB 8BF8
mov edi, eax
:004A1ADD 8B7508
mov esi, dword ptr [ebp+08]
:004A1AE0 8D45F0
lea eax, dword ptr [ebp-10]
:004A1AE3 E894FDFFFF call 004A187C
<-- Fc()函数,在这里下中断,用do "d eax; p;"可以看到C'字符串
:004A1AE8 85C0
test eax, eax
:004A1AEA 7504
jne 004A1AF0
:004A1AEC 33C0
xor eax, eax
:004A1AEE EB49
jmp 004A1B39
令K = Fk(C') = Fk(Fc(C)) —— 其中Fk()的定义如下面代码段:
:004A1AF0 8BC6
mov eax, esi
:004A1AF2 8D55F0
lea edx, dword ptr [ebp-10]
:004A1AF5 E806FDFFFF call 004A1800
<-- 这个Call是根据C'得到一个Key,简称K字符串
<-- 具体的定义为:将Fc(C)后面的4个字节的值分别*4+xxxx(xxxx表示0x0004, 0x0404, 0x0804,
0x0C04),将得到的值
从一个长度为1000H的表中查找出值进行加和xor运算,得到的值作为入口参数再进行运算,共循环0x10次。代码如:
:004A14A6 C645F7F0
mov [ebp-09], F0
:004A14AA 8D75F0
lea esi, dword ptr [ebp-10]
:004A14AD 331E
xor ebx, dword ptr [esi]
:004A14AF 8D95ACEFFFFF
lea edx, dword ptr [ebp+FFFFEFAC]
:004A14B5 8BC3
mov eax, ebx
:004A14B7 E8D4FEFFFF
call 004A1390 <-- 运算在这个Call中运行
:004A14BC 33F8
xor edi, eax
:004A14BE 8BC3
mov eax, ebx
:004A14C0 8BDF
mov ebx, edi
:004A14C2 8BF8
mov edi, eax
:004A14C4 83EE04
sub esi, 00000004
:004A14C7 FE45F7
inc [ebp-09]
:004A14CA 75E1
jne 004A14AD
<-- Call 004A1390的代码为:
:004A1390 56
push esi
:004A1391 57
push edi
:004A1392 81C404F0FFFF
add esp, FFFFF004
:004A1398 50
push eax
:004A1399 83C4FC
add esp, FFFFFFFC
:004A139C 8BF2
mov esi, edx
:004A139E 8D7C2404
lea edi, dword ptr [esp+04]
:004A13A2 B900040000
mov ecx, 00000400
:004A13A7 F3
repz
:004A13A8 A5
movsd
:004A13A9 890424
mov dword ptr [esp], eax
:004A13AC 8BC4
mov eax, esp
:004A13AE 33D2
xor edx, edx
:004A13B0 8A5003
mov dl, byte ptr [eax+03]
:004A13B3 8B549404
mov edx, dword ptr [esp+4*edx+04]
:004A13B7 33C9
xor ecx, ecx
:004A13B9 8A4802
mov cl, byte ptr [eax+02]
:004A13BC 03948C04040000
add edx, dword ptr [esp+4*ecx+00000404]
:004A13C3 33C9
xor ecx, ecx
:004A13C5 8A4801
mov cl, byte ptr [eax+01]
:004A13C8 33948C04080000
xor edx, dword ptr [esp+4*ecx+00000804]
:004A13CF 0FB600
movzx eax, byte ptr [eax]
:004A13D2 039484040C0000
add edx, dword ptr [esp+4*eax+00000C04]
:004A13D9 8BC2
mov eax, edx
:004A13DB 81C404100000
add esp, 00001004
:004A13E1 5F
pop edi
:004A13E2 5E
pop esi
:004A13E3 C3
ret
<--------------------------------------------------------------------------------------------
:004A1AFA 8903
mov dword ptr [ebx], eax
:004A1AFC 8B06
mov eax, dword ptr [esi]
下面的一个Call是计算另一个字符串的,假定为C'',共分三步走:第一步:计算出N'=Fn(N);第二步:然后将N'的前3个字符
用K字符串的前三个字符代替,假定为N''=F3(K, N')=F3(Fk(C'), N')=F3(Fk(Fc(C)), Fn(N));第三步:将得到的N''字符串按照
Fk()类似的方法通过一定量的Add和xor运算后(也是调用了Call 004A1390,只是不同的输入参数,哪怕是1bit的不同也会得到一个
完全不同的新字符串,痛苦),得到C'',可以令C''=F(N''),那么如果C'==C'',那么,一切就是OK。嘿嘿
:004A1AFE 50
push eax
:004A1AFF 8B0B
mov ecx, dword ptr [ebx]
:004A1B01 8D45F8
lea eax, dword ptr [ebp-08]
:004A1B04 8BD7
mov edx, edi
:004A1B06 E845FBFFFF call 004A1650
<-- 这个Call是根据N和K字符串得到一个新的字符串C''=F0(N, K)
:004A1B0B 85C0
test eax, eax
:004A1B0D 7504
jne 004A1B13
:004A1B0F 33C0
xor eax, eax
:004A1B11 EB26
jmp 004A1B39
:004A1B13 8B0DC0F15100 mov ecx, dword
ptr [0051F1C0]
:004A1B19 49
dec ecx
:004A1B1A 85C9
test ecx, ecx
:004A1B1C 7C16
jl 004A1B34
:004A1B1E 41
inc ecx
:004A1B1F 8D45F8
lea eax, dword ptr [ebp-08]
:004A1B22 8D55F0
lea edx, dword ptr [ebp-10]
:004A1B25 8A18
mov bl, byte ptr [eax] |
:004A1B27 3A1A
cmp bl, byte ptr [edx] |
:004A1B29 EB04
jmp 004A1B2F |不用看就知道是在比较两个运算好的
:004A1B2B 33C0
xor eax, eax |新的字符串,其实就是我上面提到的
:004A1B2D EB0A
jmp 004A1B39 |那个C' 和
C''。相等就是了
:004A1B2F 42
inc edx
|
:004A1B30 40
inc eax
|
:004A1B31 49
dec ecx
|
:004A1B32 75F1
jne 004A1B25 |
:004A1B34 B801000000 mov eax,
00000001 <--关键就是要得到这个Eax=1;
:004A1B39 5F
pop edi
:004A1B3A 5E
pop esi
:004A1B3B 5B
pop ebx
:004A1B3C 8BE5
mov esp, ebp
:004A1B3E 5D
pop ebp
:004A1B3F C20400
ret 0004
最终你会得到一个表达式 C'==C'' 即 Fc(C)=F(N'')=F(F3(K, N'))=F(F3(Fk(Fc(C)), Fn(N))),那么谁能告诉我如何根据这个表达式
用N求出C来?
- 标 题:《飞天餐饮娱乐管理系统》注册码算法分析以及暴力破解
- 作 者:chn-boy
- 时 间:2000-12-10 3:58:56
- 链 接:http://bbs.pediy.com