- UID
- 55486
注册时间2008-9-3
阅读权限10
最后登录1970-1-1
周游历练
TA的每日心情 | 慵懒 2017-5-2 11:05 |
---|
签到天数: 8 天 [LV.3]偶尔看看II
|
【破文标题】“易用会员管理”算法分析讨论
【破解工具】OD、DEDE、PEID
【破解声明】http://www.orsoon.com/soft/1555.html
------------------------------------------------------------------------
这段时间在学习算法分析,在硬盘里面找到原来下载的一个软件练习练习。
(这个软件下载下来的时候就提供了注册码。但我目的不是注册,而是分析。)
(在分析的时候有一段代码还没读懂,希望高手可以帮忙讲解一下)
(没读懂的段用*标注了)
【破解过程】
用PEID检测是无壳Borland Delphi 6.0 - 7.0。
用DEDE找到注册码计算开始位置005F23B8
用OD载入断在:005F23B8
//第一段循环读取用户名的ASCLL码
005F23B8 |. E8 DF2AE1FF call Member.00404E9C ; 载入用户名
005F23BD |. 8BF0 mov esi,eax
005F23BF |. 85F6 test esi,esi ; 测试用户名位数是否
大于零
005F23C1 |. 7E 26 jle short Member.005F23E9
005F23C3 |. BB 01000000 mov ebx,1 ; ebx=1,
005F23C8 |> 8D4D EC /lea ecx,dword ptr ss:[ebp-14]
005F23CB |. 8B45 FC |mov eax,dword ptr ss:[ebp-4]
005F23CE |. 0FB64418 FF |movzx eax,byte ptr ds:[eax+ebx-1] ; 读取用户名字第N位的
ASCII值
(从左至右读取)
005F23D3 |. 33D2 |xor edx,edx
005F23D5 |. E8 EE7EE1FF |call Member.0040A2C8
005F23DA |. 8B55 EC |mov edx,dword ptr ss:[ebp-14]
005F23DD |. 8D45 F8 |lea eax,dword ptr ss:[ebp-8]
005F23E0 |. E8 BF2AE1FF |call Member.00404EA4
005F23E5 |. 43 |inc ebx
005F23E6 |. 4E |dec esi
005F23E7 |.^ 75 DF \jnz short Member.005F23C8
005F23E9 |> 8B45 F8 mov eax,dword ptr ss:[ebp-8] ; eax为用户名的ASCII
码值
005F23EC |. E8 AB2AE1FF call Member.00404E9C
005F23F1 |. 8BF0 mov esi,eax
005F23F3 |. 85F6 test esi,esi
005F23F5 |. 7E 2C jle short Member.005F2423
//第二段循环反向读取ASCLL码低位
005F23F7 |. BB 01000000 mov ebx,1
005F23FC |> 8B45 F8 /mov eax,dword ptr ss:[ebp-8]
005F23FF |. E8 982AE1FF |call Member.00404E9C
005F2404 |. 2BC3 |sub eax,ebx
005F2406 |. 8B55 F8 |mov edx,dword ptr ss:[ebp-8] ; 由低位向高位读取用
户名的ASCII码
005F2409 |. 8A1402 |mov dl,byte ptr ds:[edx+eax] ; 取值的低位
005F240C |. 8D45 E8 |lea eax,dword ptr ss:[ebp-18]
005F240F |. E8 B029E1FF |call Member.00404DC4
005F2414 |. 8B55 E8 |mov edx,dword ptr ss:[ebp-18]
005F2417 |. 8D45 F4 |lea eax,dword ptr ss:[ebp-C]
005F241A |. E8 852AE1FF |call Member.00404EA4
005F241F |. 43 |inc ebx
005F2420 |. 4E |dec esi
005F2421 |.^ 75 D9 \jnz short Member.005F23FC
005F2423 |> 8D45 F8 lea eax,dword ptr ss:[ebp-8] ; eax为换位后的用户名
ASCII码值
//ASCII码分段
005F2426 |. 50 push eax
005F2427 |. B9 04000000 mov ecx,4
005F242C |. BA 01000000 mov edx,1
005F2431 |. 8B45 F4 mov eax,dword ptr ss:[ebp-C]
005F2434 |. E8 C32CE1FF call Member.004050FC
005F2439 |. 8D45 F4 lea eax,dword ptr ss:[ebp-C] ; eax为换位后ASCII码
前四位
005F243C |. 50 push eax
005F243D |. B9 04000000 mov ecx,4
005F2442 |. BA 05000000 mov edx,5
005F2447 |. 8B45 F4 mov eax,dword ptr ss:[ebp-C]
005F244A |. E8 AD2CE1FF call Member.004050FC
005F244F |. 8B45 F8 mov eax,dword ptr ss:[ebp-8] ; eax为换位后ASCII码
的 5-8 位
005F2452 |. E8 452AE1FF call Member.00404E9C
005F2457 |. 83F8 04 cmp eax,4 ; eax是否为4(数位)
005F245A |. 7D 2F jge short Member.005F248B
005F245C |. 8B45 F8 mov eax,dword ptr ss:[ebp-8]
005F245F |. E8 382AE1FF call Member.00404E9C
005F2464 |. 8BD8 mov ebx,eax
005F2466 |. 83FB 03 cmp ebx,3
005F2469 |. 7F 20 jg short Member.005F248B
005F246B |> 8D4D E4 /lea ecx,dword ptr ss:[ebp-1C] *如果数位不够则补充
数值
005F246E |. 8BC3 |mov eax,ebx *
005F2470 |. C1E0 02 |shl eax,2 *
005F2473 |. 33D2 |xor edx,edx *
005F2475 |. E8 4E7EE1FF |call Member.0040A2C8 *
005F247A |. 8B55 E4 |mov edx,dword ptr ss:[ebp-1C] *
005F247D |. 8D45 F8 |lea eax,dword ptr ss:[ebp-8] *
005F2480 |. E8 1F2AE1FF |call Member.00404EA4 *
005F2485 |. 43 |inc ebx *
005F2486 |. 83FB 04 |cmp ebx,4 *
005F2489 |.^ 75 E0 \jnz short Member.005F246B *
005F248B |> 8B45 F4 mov eax,dword ptr ss:[ebp-C]
005F248E |. E8 092AE1FF call Member.00404E9C
005F2493 |. 83F8 04 cmp eax,4 // eax是否为4(数位)
005F2496 |. 7D 2F jge short Member.005F24C7
005F2498 |. 8B45 F4 mov eax,dword ptr ss:[ebp-C]
005F249B |. E8 FC29E1FF call Member.00404E9C
005F24A0 |. 8BD8 mov ebx,eax
005F24A2 |. 83FB 03 cmp ebx,3
005F24A5 |. 7F 20 jg short Member.005F24C7
005F24A7 |> 8D4D E0 /lea ecx,dword ptr ss:[ebp-20] *数位不够则补充数值
005F24AA |. 8BC3 |mov eax,ebx *和上一段一样,我没
看懂
005F24AC |. C1E0 02 |shl eax,2 *
005F24AF |. 33D2 |xor edx,edx *
005F24B1 |. E8 127EE1FF |call Member.0040A2C8 *
005F24B6 |. 8B55 E0 |mov edx,dword ptr ss:[ebp-20] *
005F24B9 |. 8D45 F4 |lea eax,dword ptr ss:[ebp-C] *
005F24BC |. E8 E329E1FF |call Member.00404EA4 *
005F24C1 |. 43 |inc ebx *
005F24C2 |. 83FB 04 |cmp ebx,4 *
005F24C5 |.^ 75 E0 \jnz short Member.005F24A7 *
005F24C7 |> 8D45 F0 lea eax,dword ptr ss:[ebp-10] *
//固定值 ASCII "mem45erpe"分段
005F24CA |. BA 54255F00 mov edx,Member.005F2554 ; ASCII "mem45erpe"
005F24CF |. E8 A027E1FF call Member.00404C74
005F24D4 |. 8D45 DC lea eax,dword ptr ss:[ebp-24]
005F24D7 |. 50 push eax
005F24D8 |. B9 04000000 mov ecx,4
005F24DD |. BA 01000000 mov edx,1
005F24E2 |. 8B45 F0 mov eax,dword ptr ss:[ebp-10]
005F24E5 |. E8 122CE1FF call Member.004050FC
005F24EA |. FF75 DC push dword ptr ss:[ebp-24] ; mem4
005F24ED |. 68 68255F00 push Member.005F2568
005F24F2 |. FF75 F8 push dword ptr ss:[ebp-8] ; 用户名转换后的ASCLL
码前四位值
005F24F5 |. 8D45 D8 lea eax,dword ptr ss:[ebp-28]
005F24F8 |. 50 push eax
005F24F9 |. B9 05000000 mov ecx,5
005F24FE |. BA 05000000 mov edx,5
005F2503 |. 8B45 F0 mov eax,dword ptr ss:[ebp-10]
005F2506 |. E8 F12BE1FF call Member.004050FC
005F250B |. FF75 D8 push dword ptr ss:[ebp-28] ; 5erpe
005F250E |. 68 68255F00 push Member.005F2568
005F2513 |. FF75 F4 push dword ptr ss:[ebp-C] ; 用户名转换后的ASCLL
码 5-8 位值
005F2516 |. 8BC7 mov eax,edi
005F2518 |. BA 06000000 mov edx,6
005F251D |. E8 3A2AE1FF call Member.00404F5C
005F2522 |. 33C0 xor eax,eax
005F2524 |. 5A pop edx
005F2525 |. 59 pop ecx
005F2526 |. 59 pop ecx
005F2527 |. 64:8910 mov dword ptr fs:[eax],edx
005F252A |. 68 44255F00 push Member.005F2544
005F252F |> 8D45 D8 lea eax,dword ptr ss:[ebp-28]
005F2532 |. BA 0A000000 mov edx,0A
005F2537 |. E8 C426E1FF call Member.00404C00
005F253C \. C3 retn
005F253D .^ E9 3A1FE1FF jmp Member.0040447C
005F2542 .^ EB EB jmp short Member.005F252F
005F2884 |. E8 F3FAFFFF call Member.005F237C
005F2889 |. 8B55 F8 mov edx,dword ptr ss:[ebp-8] ; 注册码(可在此下断
做内存注册机)
005F288C |. 58 pop eax
005F288D |. E8 5627E1FF call Member.00404FE8
005F2892 |. 75 3A jnz short Member.005F28CE ; 跳向错误窗口
------------------------------------------------------------------------
此软件的注册方式:
1、读取用户名并以ASCLL码形式储存;
2、将储存的值排列顺序从右至左交换;
3、将换好的值取两段出来备用,一段为前四位,二段为第 5-8 位。
(如为数不够时需要补全,缺两位用“8C”补全,缺四位用“048C”补全)
4、将固定值“mem45erpe”分段成“mem4”“5erpe”两段。
5、组合注册码:“mem4”-“前四位”“5erpe”-“第 5-8位”。
注册码:
Y
mem4-978C5erpe-048C
caiy
mem4-97965erpe-1636
由于代码有一段没有读懂,所以对于用户名低于四位时的填充数“8C”“04”是如何计算出来不清楚,
希望有看懂的朋友解释一下。 |
|