wmzy428 发表于 2008-9-10 05:45:54

“易用会员管理”算法分析讨论

【破文标题】“易用会员管理”算法分析讨论
【破解工具】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-10 05:47:27

晕,贴发出来格式都变了~

walili 发表于 2008-9-10 13:25:06

呵呵,现在不是改名叫里诺了吗?

wmzy428 发表于 2008-9-13 01:57:01

教程中的《里诺》软件和这个软件的算法是一样的,但是也没有分析用户名低于四位时的填充数是如何算出来的,所以发贴问一下大家。

tianxj 发表于 2008-9-13 21:43:54

原帖由 wmzy428 于 2008-9-13 01:57 发表 https://www.chinapyg.com/images/common/back.gif
教程中的《里诺》软件和这个软件的算法是一样的,但是也没有分析用户名低于四位时的填充数是如何算出来的,所以发贴问一下大家。

记得好像是根据位数算出来填充的,其实是固定数值C840

zsl01 发表于 2008-9-23 08:10:45

学习了,新手多谢你们把经验拿出来分享。
页: [1]
查看完整版本: “易用会员管理”算法分析讨论