surge 发表于 2005-11-21 13:29:27

三江门诊收费系统3.50算法分析

【破文标题】三江门诊收费系统3.50算法分析
【破文作者】surge
【作者邮箱】[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:
0058C721   mov   dword ptr fs:, esp
0058C724   lea   edx, dword ptr ss:
0058C727   mov   eax, dword ptr ds:
0058C72D   call    SJMZSF.00478510
0058C732   cmp   dword ptr ss:, 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:
0058C74A   mov   eax, dword ptr ds:
0058C750   call    SJMZSF.00478510
0058C755   mov   eax, dword ptr ss:
0058C758   push    eax
0058C759   lea   eax, dword ptr ss:
0058C75C   push    eax
0058C75D   lea   edx, dword ptr ss:
0058C760   mov   eax, dword ptr ds:
0058C766   call    SJMZSF.00478510
0058C76B   mov   edx, dword ptr ss:       ;机器码在此出现
0058C76E   mov   eax, dword ptr ds:
0058C773   mov   eax, dword ptr ds:
0058C775   mov   cx, 64
0058C779   call    SJMZSF.00585BBC                  ;跟进注册算法
0058C77E   mov   edx, dword ptr ss:
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:, ebx
00585BCA   mov   esi, ecx
00585BCC   mov   dword ptr ss:, edx
00585BCF   xor   eax, eax
00585BD1   push    ebp
00585BD2   push    SJMZSF.00585C5D
00585BD7   push    dword ptr fs:
00585BDA   mov   dword ptr fs:, esp
00585BDD   mov   eax, dword ptr ss:
00585BE0   call    SJMZSF.004046D0                  ;eax返回机器码长度
00585BE5   mov   edx, eax
00585BE7   lea   eax, dword ptr ss:
00585BEA   call    SJMZSF.00404A5C
00585BEF   mov   eax, dword ptr ss:
00585BF2   call    SJMZSF.004046D0
00585BF7   test    al, al
00585BF9   jbe   short SJMZSF.00585C3C
00585BFB   mov   byte ptr ss:, al
00585BFE   mov   bl, 1
00585C00   /lea   eax, dword ptr ss:
00585C03   |call    SJMZSF.00404928               ;eax返回计算结果保存地址
00585C08   |mov   edi, ebx
00585C0A   |and   edi, 0FF
00585C10   |mov   edx, dword ptr ss:
00585C13   |mov   dl, byte ptr ds:   ;取一个字符
00585C17   |movzx   ecx, si                         ;si初始值为0x64
00585C1A   |shr   ecx, 8
00585C1D   |xor   dl, cl                        ;与cl异或0
00585C1F   |mov   byte ptr ds:, dl   ;保存计算结果
00585C23   |mov   eax, dword ptr ss:
00585C26   |movzx   eax, byte ptr ds:
00585C2B   |add   si, ax                        ;取一个字符+si
00585C2E   |add   si, 0D                        ;再加0x0d
00585C32   |add   si, 19                        ;再加0x19
00585C36   |inc   ebx                           ;计数加1
00585C37   |dec   byte ptr ss:             ;取完所有字符
00585C3A   \jnz   short SJMZSF.00585C00
00585C3C   mov   eax, dword ptr ss:
00585C3F   mov   edx, dword ptr ss:
00585C42   call    SJMZSF.00404464
00585C47   xor   eax, eax
00585C49   pop   edx
00585C4A   pop   ecx
00585C4B   pop   ecx
00585C4C   mov   dword ptr fs:, edx
00585C4F   push    SJMZSF.00585C64
00585C54   lea   eax, dword ptr ss:
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;
}
------------------------------------------------------------------------
【破解总结】适合初学者学算法。
------------------------------------------------------------------------
【版权声明】本文纯属技术交流, 转载请注明作者信息并保持文章的完整, 谢谢!

风球 发表于 2005-11-22 09:18:37

学习了```

bklbklbk 发表于 2005-12-18 12:43:46

学习了```

speedboy 发表于 2006-1-15 11:00:07

学一学,备用!

bbyl 发表于 2006-2-2 00:21:07

厉害!跟着学习一下。

cxx17 发表于 2006-3-18 20:00:13

学习!学习!

go3344 发表于 2006-3-19 15:08:06

学习了```

bfqyygy 发表于 2006-6-11 23:52:32

厉害..小弟学习了.

菜儿 发表于 2006-6-19 16:34:32

收藏 ,学习!谢谢
页: [1]
查看完整版本: 三江门诊收费系统3.50算法分析