ayan 发表于 2005-9-5 12:17:15

易用门诊收费系统算法分析

【破文标题】易用门诊收费系统算法分析
【破文作者】ayan
【软件名称】易用门诊收费系统 V1.20
【下载地址】http://nj.onlinedown.net/soft/40486.htm
【破解工具】flyOD peid
【保护方式】注册码
【软件限制】未知
【破解难度】简单
-----------------------------------------------------------------
【软件简介】《易用门诊收费系统》是一套对医院门诊的收费开票、退款、发票查询、门诊收费明细汇总、发票打印等进行多方管理的系统。系统的各种功能是根据国家《医院信息系统基本功能规范》的标准要求来设计的,更利于标准化管理。系统操作简单方便,界面美观大方,查询方便,且根据实际需要设计了各类汇总报表,使管理工作更为简便,是目前小型医院的最实用的收费系统之一。
门诊收费系统的主要功能有:
费用处理:收费开票、退款、发票查询、退出
收费报表:收费当班报表、收费工作汇总表、门诊科室收入汇总表、门诊收费      
分类汇总表、门诊收费分医师汇总表、超级查询;
系统维护:修改密码、部门参数管理、费用参数管理理、医师参数管理、数据备份、数据恢复、数据库升级、系统初始化   
-----------------------------------------------------------------
【破解分析】
    查壳:Borland Delphi 6.0 - 7.0无壳,先运行注册看看,提示重起验证。好用OD载入,字符参考“已保存了注册信息!
下次启动本程序时将会对你的注册码进行验证,如注册码正确,本程序所有功能限制将被解除,您成为我们正式版本用户!”
向上看字符,有NAME和PASS,判断这个NAME和PASS就是放注册信息的键名,好,在字符参考里搜索“PASS”,一共用两处,全部
下断,运行程序,在00606E78处断下,F8向下分析:
00606E78   .BA 84706000   mov edx,MZSF.00607084       ;ASCII "Pass"//运行后断在此处
00606E7D   .8B45 F8         mov eax,dword ptr ss:
00606E80   .E8 D74FE4FF   call MZSF.0044BE5C
00606E85   .8B55 C4         mov edx,dword ptr ss:
00606E88   .8B45 FC         mov eax,dword ptr ss:
00606E8B   .05 58040000   add eax,458
00606E90   .E8 ABDBDFFF   call MZSF.00404A40
00606E95   .33C0            xor eax,eax
00606E97   .55            push ebp
00606E98   .68 BE6E6000   push MZSF.00606EBE
00606E9D   .64:FF30         push dword ptr fs:
00606EA0   .64:8920         mov dword ptr fs:,esp
00606EA3   .BA 94706000   mov edx,MZSF.00607094      ;ASCII "Date"
00606EA8   .8B45 F8         mov eax,dword ptr ss:
00606EAB   .E8 C450E4FF   call MZSF.0044BF74
00606EB0   .DD5D E8         fstp qword ptr ss:
00606EB3   .9B            wait
00606EB4   .33C0            xor eax,eax
00606EB6   .5A            pop edx
00606EB7   .59            pop ecx
00606EB8   .59            pop ecx
00606EB9   .64:8910         mov dword ptr fs:,edx
00606EBC   .EB 29         jmp short MZSF.00606EE7
00606EBE   .^ E9 15D1DFFF   jmp MZSF.00403FD8
00606EC3   .FF75 E4         push dword ptr ss:       ; /Arg2
00606EC6   .FF75 E0         push dword ptr ss:       ; |Arg1
00606EC9   .BA 94706000   mov edx,MZSF.00607094            ; |ASCII "Date"
00606ECE   .8B45 F8         mov eax,dword ptr ss:   ; |
00606ED1   .E8 8A50E4FF   call MZSF.0044BF60               ; \MZSF.0044BF60
00606ED6   .8B45 E0         mov eax,dword ptr ss:
00606ED9   .8945 E8         mov dword ptr ss:,eax
00606EDC   .8B45 E4         mov eax,dword ptr ss:
00606EDF   .8945 EC         mov dword ptr ss:,eax
00606EE2   .E8 1DD5DFFF   call MZSF.00404404
00606EE7   >8B45 F8         mov eax,dword ptr ss:
00606EEA   .E8 314CE4FF   call MZSF.0044BB20
00606EEF   .33C0            xor eax,eax
00606EF1   .5A            pop edx
00606EF2   .59            pop ecx
00606EF3   .59            pop ecx
00606EF4   .64:8910         mov dword ptr fs:,edx
00606EF7   .68 0C6F6000   push MZSF.00606F0C
00606EFC   >8B45 F8         mov eax,dword ptr ss:
00606EFF   .E8 F4CBDFFF   call MZSF.00403AF8
00606F04   .C3            retn
00606F05   .^ E9 82D3DFFF   jmp MZSF.0040428C
00606F0A   .^ EB F0         jmp short MZSF.00606EFC
00606F0C   .DD45 E0         fld qword ptr ss:
00606F0F   .DC65 E8         fsub qword ptr ss:
00606F12   .DD5D D8         fstp qword ptr ss:
00606F15   .9B            wait
00606F16   .D905 9C706000   fld dword ptr ds:
00606F1C   .DC65 D8         fsub qword ptr ss:
00606F1F   .E8 C4BEDFFF   call MZSF.00402DE8
00606F24   .8B55 FC         mov edx,dword ptr ss:
00606F27   .8982 74040000   mov dword ptr ds:,eax
00606F2D   .8D4D C0         lea ecx,dword ptr ss:
00606F30   .8B45 FC         mov eax,dword ptr ss:
00606F33   .8B90 54040000   mov edx,dword ptr ds:
00606F39   .A1 60E16000   mov eax,dword ptr ds:
00606F3E   .8B00            mov eax,dword ptr ds:
00606F40   .E8 17A4FFFF   call MZSF.0060135C               //关键CALL,跟进
00606F45   .8B55 C0         mov edx,dword ptr ss:
00606F48   .8B45 FC         mov eax,dword ptr ss:   //到此可见真码
00606F4B   .8B80 58040000   mov eax,dword ptr ds:   //假码->EAX
00606F51   .E8 A2DEDFFF   call MZSF.00404DF8               //比较
00606F56   .75 52         jnz short MZSF.00606FAA          //关键跳转,跳OVER
00606F58   .8B45 FC         mov eax,dword ptr ss:
00606F5B   .C680 50040000 0>mov byte ptr ds:,0
00606F62   .6A FF         push -1
00606F64   .8B45 FC         mov eax,dword ptr ss:
00606F67   .8B80 7C040000   mov eax,dword ptr ds:
跟进关键CALL来到这里:
0060135C    /$55            push ebp
0060135D    |.8BEC            mov ebp,esp
0060135F    |.51            push ecx
00601360    |.B9 04000000   mov ecx,4
00601365    |>6A 00         /push 0
00601367    |.6A 00         |push 0
00601369    |.49            |dec ecx
0060136A    |.^ 75 F9         \jnz short MZSF.00601365
0060136C    |.51            push ecx
0060136D    |.874D FC         xchg dword ptr ss:,ecx
00601370    |.53            push ebx
00601371    |.56            push esi
00601372    |.57            push edi
00601373    |.8BF9            mov edi,ecx
00601375    |.8955 FC         mov dword ptr ss:,edx   
00601378    |.8B45 FC         mov eax,dword ptr ss:   //用户名->EAX
0060137B    |.E8 1C3BE0FF   call MZSF.00404E9C               //取得用户名位数->EDX
00601380    |.33C0            xor eax,eax                      //EAX清零
00601382    |.55            push ebp            
00601383    |.68 1D156000   push MZSF.0060151D
00601388    |.64:FF30         push dword ptr fs:
0060138B    |.64:8920         mov dword ptr fs:,esp
0060138E    |.8BC7            mov eax,edi
00601390    |.E8 5736E0FF   call MZSF.004049EC
00601395    |.8B45 FC         mov eax,dword ptr ss:      //用户名->EAX
00601398    |.E8 0F39E0FF   call MZSF.00404CAC                //取得用户名位数->EAX
0060139D    |.8BF0            mov esi,eax                     //EAX->ESI
0060139F    |.85F6            test esi,esi                      //测试ESI
006013A1    |.7E 26         jle short MZSF.006013C9         //小于等于零跳,OVER
006013A3    |.BB 01000000   mov ebx,1                         //1->EBX,用来记数
006013A8    |>8D4D EC         /lea ecx,dword ptr ss:
006013AB    |.8B45 FC         |mov eax,dword ptr ss:   //用户名-EAX
006013AE    |.0FB64418 FF   |movzx eax,byte ptr ds://取用户名第1位->EAX
006013B3    |.33D2            |xor edx,edx                      //EDX清零
006013B5    |.E8 BE8CE0FF   |call MZSF.0040A078               //取用户名第1位->
006013BA    |.8B55 EC         |mov edx,dword ptr ss:    //-EDX
006013BD    |.8D45 F8         |lea eax,dword ptr ss:   //地址-EAX   
006013C0    |.E8 EF38E0FF   |call MZSF.00404CB4
006013C5    |.43            |inc ebx                        //EBX=EBX+1
006013C6    |.4E            |dec esi                        //ESI=ESI-1
006013C7    |.^ 75 DF         \jnz short MZSF.006013A8          //没取完继续
006013C9    |>8B45 F8         mov eax,dword ptr ss:      //完成后存入EAX
上面就是取用户名ASCLL
006013CC    |.E8 DB38E0FF   call MZSF.00404CAC                //取得用户名ASCLL位数->EAX
006013D1    |.8BF0            mov esi,eax                     //EAX-ESI
006013D3    |.85F6            test esi,esi                      //测试ESI
006013D5    |.7E 2C         jle short MZSF.00601403         //小于等于零跳,OVER      
006013D7    |.BB 01000000   mov ebx,1                         //1-EBX,用来记数
006013DC    |>8B45 F8         /mov eax,dword ptr ss:   //用户名ASCLL-EAX
006013DF    |.E8 C838E0FF   |call MZSF.00404CAC               //取得用户名ASCLL位数->EAX
006013E4    |.2BC3            |sub eax,ebx                      //EAX=EAX-EBX
006013E6    |.8B55 F8         |mov edx,dword ptr ss:   //取得用户名ASCLL->EDX
006013E9    |.8A1402          |mov dl,byte ptr ds:   //用户名ASCLL最后一位->BL
006013EC    |.8D45 E8         |lea eax,dword ptr ss:    //地址传送
006013EF    |.E8 E037E0FF   |call MZSF.00404BD4               //
006013F4    |.8B55 E8         |mov edx,dword ptr ss:    //->EDX
006013F7    |.8D45 F4         |lea eax,dword ptr ss:   //地址传送
006013FA    |.E8 B538E0FF   |call MZSF.00404CB4               
006013FF    |.43            |inc ebx                        //EBX+1
00601400    |.4E            |dec esi                        //ESI-1
00601401    |.^ 75 D9         \jnz short MZSF.006013DC          //没取完继续
上面的循环就是将用户名ASCLL取反
00601403    |>8D45 F8         lea eax,dword ptr ss:      //地址传送
00601406    |.50            push eax
00601407    |.B9 04000000   mov ecx,4                         //4->ECX
0060140C    |.BA 01000000   mov edx,1                         //1->EDX
00601411    |.8B45 F4         mov eax,dword ptr ss:      //取反ASCLL->EAX
00601414    |.E8 F33AE0FF   call MZSF.00404F0C               
00601419    |.8D45 F4         lea eax,dword ptr ss:      //地址传送
0060141C    |.50            push eax                        //压栈
0060141D    |.B9 04000000   mov ecx,4                         //4-ECX
00601422    |.BA 05000000   mov edx,5                         //5-EDX
00601427    |.8B45 F4         mov eax,dword ptr ss:      //取反ASCLL-EAX
0060142A    |.E8 DD3AE0FF   call MZSF.00404F0C                //取前4位->
0060142F    |.8B45 F8         mov eax,dword ptr ss:      //->EAX
00601432    |.E8 7538E0FF   call MZSF.00404CAC                //取位数
00601437    |.83F8 04         cmp eax,4                         //和4比较
0060143A    |.7D 2F         jge short MZSF.0060146B         //大于等于跳
0060143C    |.8B45 F8         mov eax,dword ptr ss:
0060143F    |.E8 6838E0FF   call MZSF.00404CAC
00601444    |.8BD8            mov ebx,eax
00601446    |.83FB 03         cmp ebx,3
00601449    |.7F 20         jg short MZSF.0060146B
0060144B    |>8D4D E4         /lea ecx,dword ptr ss:
0060144E    |.8BC3            |mov eax,ebx
00601450    |.C1E0 02         |shl eax,2
00601453    |.33D2            |xor edx,edx
00601455    |.E8 1E8CE0FF   |call MZSF.0040A078
0060145A    |.8B55 E4         |mov edx,dword ptr ss:
0060145D    |.8D45 F8         |lea eax,dword ptr ss:
00601460    |.E8 4F38E0FF   |call MZSF.00404CB4
00601465    |.43            |inc ebx
00601466    |.83FB 04         |cmp ebx,4
00601469    |.^ 75 E0         \jnz short MZSF.0060144B
0060146B    |>8B45 F4         mov eax,dword ptr ss:      //取剩下的几位
0060146E    |.E8 3938E0FF   call MZSF.00404CAC                //取位数
00601473    |.83F8 04         cmp eax,4                         //和4比较
00601476    |.7D 2F         jge short MZSF.006014A7         //大于等于跳,
00601478    |.8B45 F4         mov eax,dword ptr ss:      //剩下的字符->EAX
0060147B    |.E8 2C38E0FF   call MZSF.00404CAC                //取位数
00601480    |.8BD8            mov ebx,eax                     //EAX->EBX
00601482    |.83FB 03         cmp ebx,3                         //和3比较
00601485    |.7F 20         jg short MZSF.006014A7            //大于跳
00601487    |>8D4D E0         /lea ecx,dword ptr ss:    //地址传送
0060148A    |.8BC3            |mov eax,ebx                      //EBX->EAX
0060148C    |.C1E0 02         |shl eax,2                        //EAX逻辑左移2位
0060148F    |.33D2            |xor edx,edx                      //EDX清零
00601491    |.E8 E28BE0FF   |call MZSF.0040A078               
00601496    |.8B55 E0         |mov edx,dword ptr ss:
00601499    |.8D45 F4         |lea eax,dword ptr ss:
0060149C    |.E8 1338E0FF   |call MZSF.00404CB4
006014A1    |.43            |inc ebx                        //EBX+1
006014A2    |.83FB 04         |cmp ebx,4                        //和4比较
006014A5    |.^ 75 E0         \jnz short MZSF.00601487          //不等回跳继续
上面的循环就是取剩下的两位字符和2左移2位得到8,3左移2位得到C连在一起,如果用户名大于4的话就会跳过这个循环
006014A7    |>8D45 F0         lea eax,dword ptr ss:   //如果用户名大于4位的话会跳到此处
006014AA    |.BA 34156000   mov edx,MZSF.00601534    ASCII "MZSF9588dj5"//字符"MZSF9588dj5"->EDX
006014AF    |.E8 D035E0FF   call MZSF.00404A84               
006014B4    |.8D45 DC         lea eax,dword ptr ss:   
006014B7    |.50            push eax
006014B8    |.B9 04000000   mov ecx,4
006014BD    |.BA 01000000   mov edx,1
006014C2    |.8B45 F0         mov eax,dword ptr ss:   //"MZSF9588dj5"->EAX
006014C5    |.E8 423AE0FF   call MZSF.00404F0C                //取"MZSF9588dj5"前4位
006014CA    |.FF75 DC         push dword ptr ss:
006014CD    |.68 48156000   push MZSF.00601548
006014D2    |.FF75 F8         push dword ptr ss:
006014D5    |.8D45 D8         lea eax,dword ptr ss:
006014D8    |.50            push eax
006014D9    |.B9 05000000   mov ecx,5                         //5->ECX
006014DE    |.BA 05000000   mov edx,5                         //5->EDX
006014E3    |.8B45 F0         mov eax,dword ptr ss:   //"MZSF9588dj5"->EAX
006014E6    |.E8 213AE0FF   call MZSF.00404F0C                //取"MZSF9588dj5"中9588d
006014EB    |.FF75 D8         push dword ptr ss:      //9588d压栈
006014EE    |.68 48156000   push MZSF.00601548               
006014F3    |.FF75 F4         push dword ptr ss:         //字符压栈
006014F6    |.8BC7            mov eax,edi                     //EDI->EAX
006014F8    |.BA 06000000   mov edx,6                         //6->EDX
006014FD    |.E8 6A38E0FF   call MZSF.00404D6C               
00601502    |.33C0            xor eax,eax
00601504    |.5A            pop edx
00601505    |.59            pop ecx
00601506    |.59            pop ecx
00601507    |.64:8910         mov dword ptr fs:,edx
0060150A    |.68 24156000   push MZSF.00601524
0060150F    |>8D45 D8         lea eax,dword ptr ss:
00601512    |.BA 0A000000   mov edx,0A
00601517    |.E8 F434E0FF   call MZSF.00404A10
0060151C    \.C3            retn
0060151D   .^ E9 6A2DE0FF   jmp MZSF.0040428C
00601522   .^ EB EB         jmp short MZSF.0060150F
00601524   .5F            pop edi
00601525   .5E            pop esi
00601526   .5B            pop ebx
00601527   .8BE5            mov esp,ebp
00601529   .5D            pop ebp
0060152A   .C3            retn
-----------------------------------------------------------------
【破解总结】
          注册名大于等于4位,只取后4位进行运算,MZSF-后4位ASCLL取反的前4位+9588d-后4位ASCLL取反的后4位
          注册名等于3位,MZSF-注册名ASCLL取反的前4位+9588d-注册名ASCLL取反的后2位+8C
          注册名等于2位,MZSF-注册名ASCLL取反+9588d-048C
          注册名等于1位,MZSF-注册名ASCLL取反+8C+9588d-048C
          最后还是明码,简单的算法
          一组可用的注册信息,来个简单的
          NAME:a
          pass:MZSF-168C9588d-048C(注意大小写)
-----------------------------------------------------------------
【版权信息】
    本文纯属技术交流,转载请保持文章完整,谢谢!
                                        本文章写于2005-9-5

[ Last edited by ayan on 2005-9-5 at 12:30 PM ]

crack123 发表于 2005-9-6 12:26:32

好文 ,学习!

cha23 发表于 2005-9-9 13:34:58

学习中。。。。。

hrbx 发表于 2005-9-12 13:09:40

支持,学习中

chinaow 发表于 2005-9-15 15:24:34

学习一下呀!!!!

lovesoft 发表于 2005-9-30 08:16:33

支持,学习中

wangkewei 发表于 2005-10-4 18:09:42

学习!支持
页: [1]
查看完整版本: 易用门诊收费系统算法分析