飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 2582|回复: 2

【yqlxj申请加入PYG】 里诺进销存管理软件(单机版)V3.30算法分析及注册机 (二)

[复制链接]
  • TA的每日心情
    开心
    2018-5-24 12:03
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2009-5-28 14:32:20 | 显示全部楼层 |阅读模式
    【破文标题】【yqlxj申请加入PYG】 里诺进销存管理软件(单机版)V3.30算法分析及注册机 (二)
    【破文作者】yqlxj
    【作者邮箱】[email protected]
    破解工具】PEID OD
    【破解平台】XP SP2
    【软件名称】里诺进销存管理软件(单机版)V3.30
    【软件大小】
    【原版下载】http://www.onlinedown.net/soft/40913.htm
    【保护方式】无
    【软件简介】里诺进销存管理系统是是一个集“进、销、存、财”四位一体的全功能商贸管理软件。软件界面设计简洁,美观。
        其人性化的软件流程,使普通用户不需培训也能很快掌握软件操作使用方法,上手极易。强大报表与集成查询功
        能是本软件的最大特色,所有功能在用户需要的使用地方自然体现,不用打开多个窗口重复查询。
    ------------------------------------------------------------------------
    【算法分析过程 】:
    用PEID查,无壳,Borland Delphi 6.0 - 7.0.
    OD载入,查找到字符串'注册失败,请检查您的注册名和注册码!',双击来到,
    注册开始:
    -----------------------------------------------------------------------------------------------------------------------------------------------------------------------
    0070E2F6  push    ebp
    0070E2F7  push    0070E435
    0070E2FC  push    dword ptr fs:[eax]
    0070E2FF  mov     dword ptr fs:[eax], esp
    0070E302  mov     eax, dword ptr [ebp-4]
    0070E305  call    0070E5B0                  ; 关键CALL
    0070E30A  test    al, al
    0070E30C  je      0070E3ED
    0070E312  xor     eax, eax
    0070E314  push    ebp
    0070E315  push    0070E3D1
    0070E31A  push    dword ptr fs:[eax]
    0070E31D  mov     dword ptr fs:[eax], esp
    0070E320  mov     dl, 1
    0070E322  mov     eax, dword ptr [44F400]
    0070E327  call    0044F624
    0070E32C  mov     ebx, eax
    0070E32E  mov     edx, 80000002
    0070E333  mov     eax, ebx
    0070E335  call    0044F700
    0070E33A  mov     cl, 1
    0070E33C  mov     edx, 0070E44C                    ;  software\zy\jxc
    0070E341  mov     eax, ebx
    0070E343  call    0044F844
    0070E348  lea     edx, dword ptr [ebp-C]
    0070E34B  mov     eax, dword ptr [ebp-4]
    0070E34E  mov     eax, dword ptr [eax+304]
    0070E354  call    00491D84
    0070E359  mov     eax, dword ptr [ebp-C]
    0070E35C  lea     edx, dword ptr [ebp-8]
    0070E35F  call    0040A440
    0070E364  mov     ecx, dword ptr [ebp-8]
    0070E367  mov     edx, 0070E464                    ;  name
    0070E36C  mov     eax, ebx
    0070E36E  call    0044FD94
    0070E373  lea     edx, dword ptr [ebp-14]
    0070E376  mov     eax, dword ptr [ebp-4]
    0070E379  mov     eax, dword ptr [eax+308]
    0070E37F  call    00491D84
    0070E384  mov     eax, dword ptr [ebp-14]
    0070E387  lea     edx, dword ptr [ebp-10]
    0070E38A  call    0040A440
    0070E38F  mov     ecx, dword ptr [ebp-10]
    0070E392  mov     edx, 0070E474                    ;  pass
    0070E397  mov     eax, ebx
    0070E399  call    0044FD94
    0070E39E  mov     eax, ebx
    0070E3A0  call    00403FA0
    0070E3A5  push    40
    0070E3A7  push    0070E47C                         ;  软件注册
    0070E3AC  push    0070E488                         ;  注册成功,本程序所有功能限制下次启动时将被自动解除,欢迎您成为我们正式版本用户!
    0070E3B1  mov     eax, dword ptr [ebp-4]
    0070E3B4  call    00498834
    0070E3B9  push    eax                              ; |hOwner
    0070E3BA  call    <jmp.&user32.MessageBoxA>        ; \MessageBoxA
    0070E3BF  mov     eax, dword ptr [ebp-4]
    0070E3C2  call    004AFBBC
    0070E3C7  xor     eax, eax
    0070E3C9  pop     edx
    0070E3CA  pop     ecx
    0070E3CB  pop     ecx
    0070E3CC  mov     dword ptr fs:[eax], edx
    0070E3CF  jmp     short 0070E407
    0070E3D1  jmp     00404480
    0070E3D6  mov     eax, dword ptr [ebp-4]
    0070E3D9  call    004AFBBC
    0070E3DE  mov     eax, dword ptr [ebp-4]
    0070E3E1  call    0070E4FC
    0070E3E6  call    004048AC
    0070E3EB  jmp     short 0070E407
    0070E3ED  push    40
    0070E3EF  push    0070E47C                         ;  软件注册
    0070E3F4  push    0070E4D8                         ;  注册失败,请检查您的注册名和注册码!
    0070E3F9  mov     eax, dword ptr [ebp-4]
    0070E3FC  call    00498834
    0070E401  push    eax                              ; |hOwner
    0070E402  call    <jmp.&user32.MessageBoxA>        ; \MessageBoxA


    -----------------------------------------------------------------------------------------------------------------------------------------------------------------------

    关键CALL:
    0070E5B0  push    ebp
    0070E5B1  mov     ebp, esp
    0070E5B3  mov     ecx, 4
    0070E5B8  /push    0
    0070E5BA  |push    0
    0070E5BC  |dec     ecx
    0070E5BD  \jnz     short 0070E5B8
    0070E5BF  push    ecx
    0070E5C0  push    ebx
    0070E5C1  push    esi
    0070E5C2  mov     esi, eax
    0070E5C4  xor     eax, eax
    0070E5C6  push    ebp
    0070E5C7  push    0070E6C5
    0070E5CC  push    dword ptr fs:[eax]
    0070E5CF  mov     dword ptr fs:[eax], esp
    0070E5D2  lea     edx, dword ptr [ebp-8]
    0070E5D5  mov     eax, dword ptr [esi+308]
    0070E5DB  call    00491D84                         ;  得到假码的长度
    0070E5E0  mov     eax, dword ptr [ebp-8]           ;  ebx-8存放着假注册码
    0070E5E3  lea     edx, dword ptr [ebp-4]
    0070E5E6  call    0040A440
    0070E5EB  mov     eax, dword ptr [ebp-4]
    0070E5EE  push    eax
    0070E5EF  lea     edx, dword ptr [ebp-14]
    0070E5F2  mov     eax, dword ptr [esi+304]
    0070E5F8  call    00491D84                         ;  得到序列号的长度
    0070E5FD  mov     eax, dword ptr [ebp-14]          ;  把序列号放到EAX中
    0070E600  lea     edx, dword ptr [ebp-10]
    0070E603  call    0040A440
    0070E608  mov     edx, dword ptr [ebp-10]
    0070E60B  lea     ecx, dword ptr [ebp-C]
    0070E60E  mov     eax, esi
    0070E610  call    0070E714                         ;  关键算法CALL
    0070E615  mov     edx, dword ptr [ebp-C]
    0070E618  pop     eax
    0070E619  call    004052D0                         ;  ?




    ------------------------------------------------------------------------------------------------------------------------------------------------------
    关键算法CALL:
    0070E714  push    ebp
    0070E715  mov     ebp, esp
    0070E717  push    ecx
    0070E718  mov     ecx, 4
    0070E71D  /push    0
    0070E71F  |push    0
    0070E721  |dec     ecx
    0070E722  \jnz     short 0070E71D
    0070E724  push    ecx
    0070E725  xchg    dword ptr [ebp-4], ecx
    0070E728  push    ebx
    0070E729  push    esi
    0070E72A  push    edi
    0070E72B  mov     edi, ecx
    0070E72D  mov     dword ptr [ebp-4], edx
    0070E730  mov     eax, dword ptr [ebp-4]           ;  EDX的值给EAX 机器码放到EAX中
    0070E733  call    00405374                         ;  EDX=2
    0070E738  xor     eax, eax
    0070E73A  push    ebp
    0070E73B  push    0070E8D5
    0070E740  push    dword ptr fs:[eax]
    0070E743  mov     dword ptr fs:[eax], esp
    0070E746  mov     eax, edi
    0070E748  call    00404EB4
    0070E74D  mov     eax, dword ptr [ebp-4]
    0070E750  call    00405184                         ;  机器码位数EAX中 是取字符串长度的函数
    0070E755  mov     esi, eax                         ;  ESI=EAX
    0070E757  test    esi, esi
    0070E759  jle     short 0070E781
    0070E75B  mov     ebx, 1
    0070E760  /lea     ecx, dword ptr [ebp-14]
    0070E763  |mov     eax, dword ptr [ebp-4]          ;  机器码放到EAX中
    0070E766  |movzx   eax, byte ptr [eax+ebx-1]       ;  按位取各自的ASCII码值放到EAX中
    0070E76B  |xor     edx, edx                        ;  EDX清零
    0070E76D  |call    0040AD5C
    0070E772  |mov     edx, dword ptr [ebp-14]         ;  机器码放到EDX中
    0070E775  |lea     eax, dword ptr [ebp-8]
    0070E778  |call    0040518C
    0070E77D  |inc     ebx                             ;  +1
    0070E77E  |dec     esi                             ;  -1
    0070E77F  \jnz     short 0070E760                  ;  循环取每一位的ASCII码值
    0070E781  mov     eax, dword ptr [ebp-8]           ;  把所有得到ASCII值连接在一起放到EAX中
    0070E784  call    00405184                         ;  eax=10  取连接在一起的字符串长度
    0070E789  mov     esi, eax
    0070E78B  test    esi, esi
    0070E78D  jle     short 0070E7BB
    0070E78F  mov     ebx, 1
    0070E794  /mov     eax, dword ptr [ebp-8]
    0070E797  |call    00405184                        ;  eax=10  取连接在一起的字符串长度
    0070E79C  |sub     eax, ebx                        ;  eax-1
    0070E79E  |mov     edx, dword ptr [ebp-8]          ;  把所有得到ASCII值连接在一起放到EdX中
    0070E7A1  |mov     dl, byte ptr [edx+eax]          ;  可以认为地址从后往前指 把取得的值放到DL中去
    0070E7A4  |lea     eax, dword ptr [ebp-18]
    0070E7A7  |call    0040509C
    0070E7AC  |mov     edx, dword ptr [ebp-18]
    0070E7AF  |lea     eax, dword ptr [ebp-C]
    0070E7B2  |call    0040518C
    0070E7B7  |inc     ebx                             ;  +1
    0070E7B8  |dec     esi
    0070E7B9  \jnz     short 0070E794
    0070E7BB  lea     eax, dword ptr [ebp-8]
    0070E7BE  push    eax
    0070E7BF  mov     ecx, 4
    0070E7C4  mov     edx, 1
    0070E7C9  mov     eax, dword ptr [ebp-C]
    0070E7CC  call    004053E4
    0070E7D1  lea     eax, dword ptr [ebp-C]
    0070E7D4  push    eax
    0070E7D5  mov     ecx, 4
    0070E7DA  mov     edx, 5
    0070E7DF  mov     eax, dword ptr [ebp-C]
    0070E7E2  call    004053E4                         ;  取前4位字符
    0070E7E7  mov     eax, dword ptr [ebp-8]           ;  放到EAX中去
    0070E7EA  call    00405184                         ;  得到长度
    0070E7EF  cmp     eax, 4                           ;  和4比较 相等跳
    0070E7F2  jge     short 0070E823
    0070E7F4  mov     eax, dword ptr [ebp-8]
    0070E7F7  call    00405184
    0070E7FC  mov     ebx, eax
    0070E7FE  cmp     ebx, 3
    0070E801  jg      short 0070E823
    0070E803  /lea     ecx, dword ptr [ebp-1C]
    0070E806  |mov     eax, ebx
    0070E808  |shl     eax, 2
    0070E80B  |xor     edx, edx
    0070E80D  |call    0040AD5C
    0070E812  |mov     edx, dword ptr [ebp-1C]
    0070E815  |lea     eax, dword ptr [ebp-8]
    0070E818  |call    0040518C
    0070E81D  |inc     ebx
    0070E81E  |cmp     ebx, 4
    0070E821  \jnz     short 0070E803
    0070E823  mov     eax, dword ptr [ebp-C]           ;  把次四位放到EAX中
    0070E826  call    00405184                         ;  取长度
    0070E82B  cmp     eax, 4                           ;  比较
    0070E82E  jge     short 0070E85F
    0070E830  mov     eax, dword ptr [ebp-C]
    0070E833  call    00405184
    0070E838  mov     ebx, eax
    0070E83A  cmp     ebx, 3
    0070E83D  jg      short 0070E85F
    0070E83F  /lea     ecx, dword ptr [ebp-20]
    0070E842  |mov     eax, ebx
    0070E844  |shl     eax, 2
    0070E847  |xor     edx, edx
    0070E849  |call    0040AD5C
    0070E84E  |mov     edx, dword ptr [ebp-20]
    0070E851  |lea     eax, dword ptr [ebp-C]
    0070E854  |call    0040518C
    0070E859  |inc     ebx
    0070E85A  |cmp     ebx, 4
    0070E85D  \jnz     short 0070E83F
    0070E85F  lea     eax, dword ptr [ebp-10]
    0070E862  mov     edx, 0070E8EC                    ;  jxcw268d58k   固定字符
    0070E867  call    00404F4C
    0070E86C  lea     eax, dword ptr [ebp-24]
    0070E86F  push    eax
    0070E870  mov     ecx, 4
    0070E875  mov     edx, 1
    0070E87A  mov     eax, dword ptr [ebp-10]
    0070E87D  call    004053E4                         ;  取固定字符的前四位
    0070E882  push    dword ptr [ebp-24]
    0070E885  push    0070E900                         ;  -
    0070E88A  push    dword ptr [ebp-8]                ;  倒序后字符的前四位
    0070E88D  lea     eax, dword ptr [ebp-28]
    0070E890  push    eax
    0070E891  mov     ecx, 5
    0070E896  mov     edx, 5
    0070E89B  mov     eax, dword ptr [ebp-10]
    0070E89E  call    004053E4
    0070E8A3  push    dword ptr [ebp-28]               ;  取固定268d5
    0070E8A6  push    0070E900                         ;  -
    0070E8AB  push    dword ptr [ebp-C]                ;  倒序后的次四位
    0070E8AE  mov     eax, edi
    0070E8B0  mov     edx, 6
    0070E8B5  call    00405244
    0070E8BA  xor     eax, eax
    0070E8BC  pop     edx
    0070E8BD  pop     ecx
    0070E8BE  pop     ecx
    0070E8BF  mov     dword ptr fs:[eax], edx
    0070E8C2  push    0070E8DC
    0070E8C7  lea     eax, dword ptr [ebp-28]
    0070E8CA  mov     edx, 0A
    0070E8CF  call    00404ED8
    0070E8D4  retn
    ------------------------------------------------------------------------------------------------------------------------------------------------------
    ------------------------------------------------------------------------
    【算法总结】:
    1).序列号取按位取每个字符16进制ASCII码,排列起来.
    2).然后进行颠倒顺序,。
    3).取前8个字符,组成两个字符串前四个字符a,后四个字符b
    4).然后和JXCw268d58k进行有序连接   JXCw-a268d5-b
    5).最后输出
    ------------------------------------------------------------------------
    【注册机源码(c语言)】:

    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
    void main(void)
    {
            int i=0,j=0,k=0,g=0,h=0,l=0;
            char *p,a[10]={0},*p2,*p3,c;
            char sernumber[10]={0};
            printf("请输入机器码:");
            scanf("%s",sernumber);
            int length,length2;
            length=strlen(sernumber);
            for(i=0;i<8;i++)
            {
                    p=hex10to16((int)sernumber[length-1]);
                    a=*p;
                    a[i+1]=*(p+1);
                    i++;
                    length--;
            }
            printf("注册码:JXCw-");
            for(i=0;i<8;i++)
            {
                    if((int)a>58)
                    {
                            printf("%c",a);       
                    }
                    else
                    {
                            printf("%d",a);       
                    }
                    h++;
                    if(h==4)
                    {
                            printf("268d5-");
                    }
            }
            printf("\n");
            printf("手动输入得到的注册码,直接关掉黑色界面\n");
            scanf("%s",sernumber);        //输入用户名
    }
    char *hex10to16(int n)
    {
           
            char s[10]={0};
            char v,*p;
            int div;
            int rev;
            int i=0;
            div = n;
            if(div<16)
                    s[0] = div;
            else
            {       
                    do{
                            rev = div%16;
                            s[1] = change1(rev);
                            div = div/16;
                    }
                    while(div >= 16);
                    s[0] = change1(div);
            }
            v=s[0];
            s[0]=s[1];
            s[1]=v;
            p=&s[0];
            return (p);
    }
    change1(int m)
    {
            char s;
            switch(m)
            {
            case 10: s = 'A';
                    break;
            case 11: s = 'B';
                    break;
            case 12: s = 'C';
                    break;
            case 13: s = 'D';
                    break;
            case 14: s = 'E';
                    break;
            case 15: s = 'F';
                    break;
            default: s = m;
                    break;
            }
            return(s);
    }

    ----------------------------------------------------------------------

    【版权声明】本文原创于PYG论坛,转载请注明作者并保持文章的完整, 谢谢!
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2018-5-6 16:27
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    发表于 2009-9-28 16:28:57 | 显示全部楼层
    yqlxj兄弟,继续努力,相信会成功的!
    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2024-7-18 13:59
  • 签到天数: 65 天

    [LV.6]常住居民II

    发表于 2009-11-14 21:49:05 | 显示全部楼层
    多谢,终于找到相关追码资料了啊
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表