- UID
- 48119
注册时间2008-3-4
阅读权限10
最后登录1970-1-1
周游历练
TA的每日心情 | 开心 2018-5-24 12:03 |
---|
签到天数: 5 天 [LV.2]偶尔看看I
|
【破文标题】【yqlxj申请加入PYG】 佳宜销售管理软件 V2.24 (企业版) 分析及注册机 (三)
【破文作者】yqlxj
【作者邮箱】[email protected]
【破解工具】PEID OD
【破解平台】XP SP2
【软件名称】 佳宜销售管理软件 V2.24 (企业版)
【软件大小】
【原版下载】http://www.onlinedown.net/soft/39873.htm
【保护方式】无
【软件简介】本软件提供了完备的销售业务管理功能,包括销售管理(销售订单、销售出货、销售退货、收款登记)、基本信息(公司基本资料、客户资料、货品资料、员工档案、其他基础设置)、单据查询(订货单查询、收货单查询、付款单查询)、系统维护(操作权限、数据备份及恢复、数据压缩、数据清理)等功能。
------------------------------------------------------------------------
【算法分析过程 】:
用PEID查,无壳,Borland Delphi 6.0 - 7.0.
OD载入,查找到字符串'系统注册成功,欢迎你使用本软件!,双击来到,
注册开始:
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
005E591C push ebp
005E591D mov ebp, esp
005E591F mov ecx, 6
005E5924 push 0
005E5926 push 0
005E5928 dec ecx
005E5929 jnz short 005E5924
005E592B push ecx
005E592C push ebx
005E592D push esi
005E592E push edi
005E592F mov dword ptr [ebp-4], eax
005E5932 xor eax, eax
005E5934 push ebp
005E5935 push 005E5B9A
005E593A push dword ptr fs:[eax]
005E593D mov dword ptr fs:[eax], esp
005E5940 lea edx, dword ptr [ebp-10]
005E5943 mov eax, dword ptr [ebp-4]
005E5946 mov eax, dword ptr [eax+304]
005E594C call 0044E9E8
005E5951 mov eax, dword ptr [ebp-10]
005E5954 lea edx, dword ptr [ebp-C]
005E5957 call 004096E8
005E595C cmp dword ptr [ebp-C], 0 ; 判断用户名称是否为空
005E5960 jnz short 005E5984
005E5962 push 0
005E5964 push 005E5BA8 ; 请填写用户名称!
005E5969 call <jmp.&PunUnitLib.ShowMess>
005E596E mov eax, dword ptr [ebp-4]
005E5971 mov eax, dword ptr [eax+304]
005E5977 mov edx, dword ptr [eax]
005E5979 call dword ptr [edx+C0]
005E597F jmp 005E5B35
005E5984 lea edx, dword ptr [ebp-18]
005E5987 mov eax, dword ptr [ebp-4]
005E598A mov eax, dword ptr [eax+2FC]
005E5990 call 0044E9E8
005E5995 mov eax, dword ptr [ebp-18]
005E5998 lea edx, dword ptr [ebp-14]
005E599B call 004096E8
005E59A0 cmp dword ptr [ebp-14], 0 ; 授权号是否为空
005E59A4 jnz short 005E59C8
005E59A6 push 0
005E59A8 push 005E5BBC ; 授权号不能为空,请填写授权号!
005E59AD call <jmp.&PunUnitLib.ShowMess>
005E59B2 mov eax, dword ptr [ebp-4]
005E59B5 mov eax, dword ptr [eax+2FC]
005E59BB mov edx, dword ptr [eax]
005E59BD call dword ptr [edx+C0]
005E59C3 jmp 005E5B35
005E59C8 mov eax, dword ptr [6505F0]
005E59CD mov eax, dword ptr [eax]
005E59CF call 00404F3C
005E59D4 push eax ; 固定码 C26D-Q638
005E59D5 lea edx, dword ptr [ebp-1C]
005E59D8 mov eax, dword ptr [ebp-4]
005E59DB mov eax, dword ptr [eax+2F4]
005E59E1 call 0044E9E8
005E59E6 mov eax, dword ptr [ebp-1C] ; 机器码放到EAX中
005E59E9 call 00404F3C
005E59EE push eax
005E59EF call <jmp.&PunUnitLib.GetRegPass> ; 算法CALL
------------------------------------------------------------------------------------------------------------------------------------------------------
关键算法CALL:
00829024 >push ebp
00829025 mov ebp, esp
00829027 mov ecx, 6
0082902C push 0
0082902E push 0
00829030 dec ecx
00829031 jnz short 0082902C
00829033 push ebx
00829034 push esi
00829035 xor eax, eax
00829037 push ebp
00829038 push 008291F2
0082903D push dword ptr fs:[eax]
00829040 mov dword ptr fs:[eax], esp
00829043 lea eax, dword ptr [ebp-14]
00829046 call 007B45B0
0082904B lea eax, dword ptr [ebp-10]
0082904E mov edx, dword ptr [ebp+8]
00829051 call 007B47A0
00829056 mov eax, dword ptr [ebp-10]
00829059 call 007B4868 ; 去机器码的长度
0082905E mov esi, eax
00829060 test esi, esi
00829062 jle short 0082908A
00829064 mov ebx, 1
00829069 lea ecx, dword ptr [ebp-18]
0082906C mov eax, dword ptr [ebp-10]
0082906F movzx eax, byte ptr [eax+ebx-1] ; 依次取字符的ASCII码值
00829074 xor edx, edx ; 清零EDX
00829076 call 007B9674
0082907B mov edx, dword ptr [ebp-18]
0082907E lea eax, dword ptr [ebp-4]
00829081 call 007B4870
00829086 inc ebx
00829087 dec esi
00829088 jnz short 00829069
0082908A mov eax, dword ptr [ebp-4] ; 连接所有字符的ASCII码值放到EAX中去
0082908D call 007B4868
00829092 mov esi, eax
00829094 test esi, esi
00829096 jle short 008290C4
00829098 mov ebx, 1
0082909D mov eax, dword ptr [ebp-4]
008290A0 call 007B4868 ; 取EAX中数值的长度
008290A5 sub eax, ebx
008290A7 mov edx, dword ptr [ebp-4]
008290AA mov dl, byte ptr [edx+eax] ; 从后往前取字符放到DL中
008290AD lea eax, dword ptr [ebp-1C]
008290B0 call 007B4790
008290B5 mov edx, dword ptr [ebp-1C]
008290B8 lea eax, dword ptr [ebp-8]
008290BB call 007B4870
008290C0 inc ebx
008290C1 dec esi
008290C2 jnz short 0082909D
008290C4 lea eax, dword ptr [ebp-4]
008290C7 push eax
008290C8 mov ecx, 4
008290CD mov edx, 1
008290D2 mov eax, dword ptr [ebp-8] ; 把所有字符连接起来放到EAX中去
008290D5 call 007B4AC0
008290DA lea eax, dword ptr [ebp-8]
008290DD push eax
008290DE mov ecx, 4
008290E3 mov edx, 5
008290E8 mov eax, dword ptr [ebp-8]
008290EB call 007B4AC0
008290F0 mov eax, dword ptr [ebp-4] ; 取前四位,放到EAX中
008290F3 call 007B4868
008290F8 cmp eax, 4 ; 和4进行比较 相等跳
008290FB jge short 0082912C
008290FD mov eax, dword ptr [ebp-4]
00829100 call 007B4868
00829105 mov ebx, eax
00829107 cmp ebx, 3
0082910A jg short 0082912C
0082910C lea ecx, dword ptr [ebp-20]
0082910F mov eax, ebx
00829111 shl eax, 2
00829114 xor edx, edx
00829116 call 007B9674
0082911B mov edx, dword ptr [ebp-20]
0082911E lea eax, dword ptr [ebp-4]
00829121 call 007B4870
00829126 inc ebx
00829127 cmp ebx, 4
0082912A jnz short 0082910C
0082912C mov eax, dword ptr [ebp-8] ; 取次四位 放到EAX中
0082912F call 007B4868
00829134 cmp eax, 4
00829137 jge short 00829168
00829139 mov eax, dword ptr [ebp-8]
0082913C call 007B4868
00829141 mov ebx, eax
00829143 cmp ebx, 3
00829146 jg short 00829168
00829148 lea ecx, dword ptr [ebp-24]
0082914B mov eax, ebx
0082914D shl eax, 2
00829150 xor edx, edx
00829152 call 007B9674
00829157 mov edx, dword ptr [ebp-24]
0082915A lea eax, dword ptr [ebp-8]
0082915D call 007B4870
00829162 inc ebx
00829163 cmp ebx, 4
00829166 jnz short 00829148
00829168 lea eax, dword ptr [ebp-28]
0082916B mov edx, dword ptr [ebp+C] ; 把固定码C26D-Q638放到EDX中
0082916E call 007B47A0
00829173 mov eax, dword ptr [ebp-28]
00829176 lea edx, dword ptr [ebp-C]
00829179 call 007B955C
0082917E lea eax, dword ptr [ebp-2C]
00829181 push eax
00829182 mov ecx, 4
00829187 mov edx, 1
0082918C mov eax, dword ptr [ebp-C]
0082918F call 007B4AC0
00829194 push dword ptr [ebp-2C] ; 取C26D-Q638前四位字符
00829197 push 0082920C
0082919C push dword ptr [ebp-4] ; 取前面得到的连接字符的前四位
0082919F lea eax, dword ptr [ebp-30]
008291A2 push eax
008291A3 mov ecx, 5
008291A8 mov edx, 5
008291AD mov eax, dword ptr [ebp-C]
008291B0 call 007B4AC0
008291B5 push dword ptr [ebp-30] ; 取C26D-Q638中的-Q638
008291B8 push 0082920C
008291BD push dword ptr [ebp-8] ; 取前面得到的连接字符的次四位
008291C0 lea eax, dword ptr [ebp-14]
008291C3 mov edx, 6
008291C8 call 007B4928 ; 把连接起来的值放到EBP-14中去
008291CD mov eax, dword ptr [ebp-14] ; 得到的注册码放到EAX中
008291D0 call 007B4A60
008291D5 mov ebx, eax
008291D7 xor eax, eax
008291D9 pop edx
008291DA pop ecx
008291DB pop ecx
008291DC mov dword ptr fs:[eax], edx
008291DF push 008291F9
008291E4 lea eax, dword ptr [ebp-30]
008291E7 mov edx, 0C
008291EC call 007B45D4
------------------------------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------
【算法总结】:
1).序列号取按位取每个字符16进制ASCII码,排列起来.
2).然后进行颠倒顺序,。
3).取前8个字符,组成两个字符串前四个字符a,后四个字符b
4).然后和C26D-Q638进行有序连接 C26D-a-Q638-b
5).最后输出
------------------------------------------------------------------------
【注册机源码(c语言)】:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
extern char *hex10to16(int n);
extern change1(int m);
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("注册码:C26D-");
for(i=0;i<8;i++)
{
if((int)a>58)
{
printf("%c",a);
}
else
{
printf("%d",a);
}
h++;
if(h==4)
{
printf("-Q638-");
}
}
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论坛,转载请注明作者并保持文章的完整, 谢谢! |
|