- UID
- 2927
注册时间2005-8-29
阅读权限20
最后登录1970-1-1
以武会友
该用户从未签到
|
【破文标题】三江门诊收费系统3.50算法分析
【破文作者】surge[PYG]
【作者邮箱】[email protected]
【作者主页】无
【破解工具】olldbg
【破解平台】win2000
【软件名称】三江门诊收费系统 3.50
【软件大小】1290KB
【原版下载】http://hecz.onlinedown.net/soft/28168.htm
【保护方式】序列号
【软件简介】三江门诊收费系统功能:门诊划价收费、药品进销存管理、医生及科室业绩管理、票据可打印明细,也可只打印大的分类,可以根据用户的要求定制各种发票样式,实现套打功能。本软件可以为用户定制开发多种功能,如优惠收费、欠费管理等。开发者有多年医院工作经验,软件最大的特点为简单实用,欢迎您下载试用并提出宝贵意见!
------------------------------------------------------------------------
【破解过程】
软件无壳Borland Delphi 6.0 - 7.0编译
查找字串参考到这里下断
0058C708 push ebp
0058C709 mov ebp, esp
0058C70B xor ecx, ecx
0058C70D push ecx
0058C70E push ecx
0058C70F push ecx
0058C710 push ecx
0058C711 push ecx
0058C712 push ecx
0058C713 push ebx
0058C714 mov ebx, eax
0058C716 xor eax, eax
0058C718 push ebp
0058C719 push SJMZSF.0058C8B5
0058C71E push dword ptr fs:[eax]
0058C721 mov dword ptr fs:[eax], esp
0058C724 lea edx, dword ptr ss:[ebp-4]
0058C727 mov eax, dword ptr ds:[ebx+304]
0058C72D call SJMZSF.00478510
0058C732 cmp dword ptr ss:[ebp-4], 0
0058C736 jnz short SJMZSF.0058C747
0058C738 mov eax, SJMZSF.0058C8CC ; 注册码不能为空
0058C73D call SJMZSF.0043BBD0
0058C742 jmp SJMZSF.0058C885
0058C747 lea edx, dword ptr ss:[ebp-8]
0058C74A mov eax, dword ptr ds:[ebx+304]
0058C750 call SJMZSF.00478510
0058C755 mov eax, dword ptr ss:[ebp-8]
0058C758 push eax
0058C759 lea eax, dword ptr ss:[ebp-C]
0058C75C push eax
0058C75D lea edx, dword ptr ss:[ebp-10]
0058C760 mov eax, dword ptr ds:[ebx+2FC]
0058C766 call SJMZSF.00478510
0058C76B mov edx, dword ptr ss:[ebp-10] ; 机器码在此出现
0058C76E mov eax, dword ptr ds:[592DA4]
0058C773 mov eax, dword ptr ds:[eax]
0058C775 mov cx, 64
0058C779 call SJMZSF.00585BBC ; 跟进注册算法
0058C77E mov edx, dword ptr ss:[ebp-C]
0058C781 pop eax
0058C782 call SJMZSF.0040481C ;比较
0058C787 jnz SJMZSF.0058C87B ;爆破
跟进算法Call之后到这里
00585BBC push ebp
00585BBD mov ebp, esp
00585BBF add esp, -0C
00585BC2 push ebx
00585BC3 push esi
00585BC4 push edi
00585BC5 xor ebx, ebx
00585BC7 mov dword ptr ss:[ebp-8], ebx
00585BCA mov esi, ecx
00585BCC mov dword ptr ss:[ebp-4], edx
00585BCF xor eax, eax
00585BD1 push ebp
00585BD2 push SJMZSF.00585C5D
00585BD7 push dword ptr fs:[eax]
00585BDA mov dword ptr fs:[eax], esp
00585BDD mov eax, dword ptr ss:[ebp-4]
00585BE0 call SJMZSF.004046D0 ; eax返回机器码长度
00585BE5 mov edx, eax
00585BE7 lea eax, dword ptr ss:[ebp-8]
00585BEA call SJMZSF.00404A5C
00585BEF mov eax, dword ptr ss:[ebp-4]
00585BF2 call SJMZSF.004046D0
00585BF7 test al, al
00585BF9 jbe short SJMZSF.00585C3C
00585BFB mov byte ptr ss:[ebp-9], al
00585BFE mov bl, 1
00585C00 /lea eax, dword ptr ss:[ebp-8]
00585C03 |call SJMZSF.00404928 ; eax返回计算结果保存地址
00585C08 |mov edi, ebx
00585C0A |and edi, 0FF
00585C10 |mov edx, dword ptr ss:[ebp-4]
00585C13 |mov dl, byte ptr ds:[edx+edi-1] ; 取一个字符
00585C17 |movzx ecx, si ; si初始值为0x64
00585C1A |shr ecx, 8
00585C1D |xor dl, cl ; 与cl异或0
00585C1F |mov byte ptr ds:[eax+edi-1], dl ; 保存计算结果
00585C23 |mov eax, dword ptr ss:[ebp-4]
00585C26 |movzx eax, byte ptr ds:[eax+edi-1]
00585C2B |add si, ax ; 取一个字符+si
00585C2E |add si, 0D ; 再加0x0d
00585C32 |add si, 19 ; 再加0x19
00585C36 |inc ebx ; 计数加1
00585C37 |dec byte ptr ss:[ebp-9] ; 取完所有字符
00585C3A \jnz short SJMZSF.00585C00
00585C3C mov eax, dword ptr ss:[ebp+8]
00585C3F mov edx, dword ptr ss:[ebp-8]
00585C42 call SJMZSF.00404464
00585C47 xor eax, eax
00585C49 pop edx
00585C4A pop ecx
00585C4B pop ecx
00585C4C mov dword ptr fs:[eax], edx
00585C4F push SJMZSF.00585C64
00585C54 lea eax, dword ptr ss:[ebp-8]
00585C57 call SJMZSF.00404410
00585C5C retn
上面的循环用C语言描述一下:
int getkey(char * k_dest,char * k_src)
{
int i,j,k;
int si=0x64;
j=strlen(k_src);
for (i=0;i<j;i++)
{
k=si;
*k_dest=*k_src^(k>>8);
si+=*k_src+0x0d+0x19;
k_src++;
k_dest++;
}
*k_dest='\0';
return 0;
}
------------------------------------------------------------------------
【破解总结】适合初学者学算法。
------------------------------------------------------------------------
【版权声明】本文纯属技术交流, 转载请注明作者信息并保持文章的完整, 谢谢! |
|