“易用会员管理”算法分析讨论
【破文标题】“易用会员管理”算法分析讨论【破解工具】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:
005F23CB |.8B45 FC |mov eax,dword ptr ss:
005F23CE |.0FB64418 FF |movzx eax,byte ptr ds: ;读取用户名字第N位的
ASCII值
(从左至右读取)
005F23D3 |.33D2 |xor edx,edx
005F23D5 |.E8 EE7EE1FF |call Member.0040A2C8
005F23DA |.8B55 EC |mov edx,dword ptr ss:
005F23DD |.8D45 F8 |lea eax,dword ptr ss:
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: ;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:
005F23FF |.E8 982AE1FF |call Member.00404E9C
005F2404 |.2BC3 |sub eax,ebx
005F2406 |.8B55 F8 |mov edx,dword ptr ss: ;由低位向高位读取用
户名的ASCII码
005F2409 |.8A1402 |mov dl,byte ptr ds: ;取值的低位
005F240C |.8D45 E8 |lea eax,dword ptr ss:
005F240F |.E8 B029E1FF |call Member.00404DC4
005F2414 |.8B55 E8 |mov edx,dword ptr ss:
005F2417 |.8D45 F4 |lea eax,dword ptr ss:
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: ;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:
005F2434 |.E8 C32CE1FF call Member.004050FC
005F2439 |.8D45 F4 lea eax,dword ptr ss: ;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:
005F244A |.E8 AD2CE1FF call Member.004050FC
005F244F |.8B45 F8 mov eax,dword ptr ss: ;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:
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: *如果数位不够则补充
数值
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: *
005F247D |.8D45 F8 |lea eax,dword ptr ss: *
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:
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:
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: *数位不够则补充数值
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: *
005F24B9 |.8D45 F4 |lea eax,dword ptr ss: *
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: *
//固定值 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:
005F24D7 |.50 push eax
005F24D8 |.B9 04000000 mov ecx,4
005F24DD |.BA 01000000 mov edx,1
005F24E2 |.8B45 F0 mov eax,dword ptr ss:
005F24E5 |.E8 122CE1FF call Member.004050FC
005F24EA |.FF75 DC push dword ptr ss: ;mem4
005F24ED |.68 68255F00 push Member.005F2568
005F24F2 |.FF75 F8 push dword ptr ss: ;用户名转换后的ASCLL
码前四位值
005F24F5 |.8D45 D8 lea eax,dword ptr ss:
005F24F8 |.50 push eax
005F24F9 |.B9 05000000 mov ecx,5
005F24FE |.BA 05000000 mov edx,5
005F2503 |.8B45 F0 mov eax,dword ptr ss:
005F2506 |.E8 F12BE1FF call Member.004050FC
005F250B |.FF75 D8 push dword ptr ss: ;5erpe
005F250E |.68 68255F00 push Member.005F2568
005F2513 |.FF75 F4 push dword ptr ss: ;用户名转换后的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:,edx
005F252A |.68 44255F00 push Member.005F2544
005F252F |>8D45 D8 lea eax,dword ptr ss:
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: ;注册码(可在此下断
做内存注册机)
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”是如何计算出来不清楚,
希望有看懂的朋友解释一下。 晕,贴发出来格式都变了~ 呵呵,现在不是改名叫里诺了吗? 教程中的《里诺》软件和这个软件的算法是一样的,但是也没有分析用户名低于四位时的填充数是如何算出来的,所以发贴问一下大家。 原帖由 wmzy428 于 2008-9-13 01:57 发表 https://www.chinapyg.com/images/common/back.gif
教程中的《里诺》软件和这个软件的算法是一样的,但是也没有分析用户名低于四位时的填充数是如何算出来的,所以发贴问一下大家。
记得好像是根据位数算出来填充的,其实是固定数值C840 学习了,新手多谢你们把经验拿出来分享。
页:
[1]