首页
社区
课程
招聘
[原创]药品销售管理系统破解心得
发表于: 2007-6-10 09:14 11077

[原创]药品销售管理系统破解心得

2007-6-10 09:14
11077

【文章标题】: 销售系统破解心得
【文章作者】: VC果冻
【软件名称】: 药品销售管理系统
【软件大小】: 1.26M
【下载地址】: 软件暂不提供下载
【加壳方式】: 无壳
【编写语言】: Delphi
【使用工具】: OllyICE
【操作平台】: Windows XP2
【软件介绍】: 对药品的销售,出入库,及业务信息进行管理的系统
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  由于刚刚学习加密解蜜不久,没有经验,能按着步骤一步一步的边学边用。
  用PEiD检查是否加壳,确定无壳,且开发环境是Dephi 6.0,心情稍稍放松一点,没壳就好~~
  运行EXE,弹出注册窗口,提示输入公司名称,电话和注册号码,在下方还有机器码(机器码是纯数字的),和相关的注册提示。
  让输咱就输,公司名称AABBCC,电话12345678,
  注册码0123456789,点击注册,弹出注册失败,注册码错误提示。心中欢喜,找这个提示窗口,估计就离注册码不远了,
  嘿嘿~~~
  关闭程序,用OD载入
  右键->Ultra String Reference->Find UNICODE,哎~~怪了,没那个提示的“注册码错误”,再找,再看,还是没有,
  好生郁闷!再仔细一看,原来还有一个模块,regdll.dll,再看看它继续Find UNICODE,哈哈,终于找到了,立即F2下断,
  由于初次Crack,没经验,就把上面的几个call都没断了下来,以后慢慢再看是不是关键call。
  好了,按F9,运行程序,随便输入名称,电话,和注册码,程序断在了这里:
  
  007D9C3F    E8 BCFCFFFF     call    007D9900                     
  007D9C44    84C0            test    al, al
  007D9C46    75 29           jnz     short 007D9C71
  007D9C48    6A 40           push    40
  007D9C4A    68 0C9F7D00     push    007D9F0C                         ; 提示
  007D9C4F    68 589F7D00     push    007D9F58                         ; 你输入你的注册码不正确!
  007D9C54    6A 00           push    0
  007D9C56    E8 1DCEF8FF     call    <jmp.&user32.MessageBoxA>
  007D9C5B    8B45 FC         mov     eax, dword ptr [ebp-4]
  007D9C5E    8B80 04030000   mov     eax, dword ptr [eax+304]
  007D9C64    8B10            mov     edx, dword ptr [eax]
  
  前面有一个call,再看EDX,里面竟然存着测试的注册码,喜欢,呵呵,跟进去看看。
  来到这里
  
  007D992E    E8 05A7F8FF    call    00764038                  ;EDX存储了机器码
  007D9933    8D55 F4        lea     edx, dword ptr [ebp-C]
  007D9936    8B45 F8        mov     eax, dword ptr [ebp-8]
  007D9939    E8 26FFFFFF    call    007D9864
  007D993E    8D55 F0        lea     edx, dword ptr [ebp-10]
  007D9941    8B45 FC        mov     eax, dword ptr [ebp-4]
  007D9944    E8 F3E6F8FF    call    0076803C
  007D9949    8B55 F0        mov     edx, dword ptr [ebp-10]
  007D994C    8B45 F4        mov     eax, dword ptr [ebp-C]
  007D994F    E8 58AAF8FF    call    007643AC  
  
  看到机器码了,呵呵,开心,一路F8,来到这里:
  
  007D98CF    E8 20A7F8FF    call    00763FF4                        
  007D98D4    33C0           xor     eax, eax
  007D98D6    5A             pop     edx
  007D98D7    59             pop     ecx
  007D98D8    59             pop     ecx
  007D98D9    64:8910        mov     dword ptr fs:[eax], edx
  007D98DC    68 F6987D00    push    007D98F6
  007D98E1    8D45 F4        lea     eax, dword ptr [ebp-C]
  007D98E4    BA 03000000    mov     edx, 3
  007D98E9    E8 D6A6F8FF    call    00763FC4
  007D98EE    C3             retn
  
  再看看寄存器,哈哈,注册码出来了
  EDX 010FCB84 ASCII "3238:<=9=;<?=B?GADCG"
  哎呀,真让我开心。就这么简单就把注册码给“追”出来了,这对于我这个初学者来说可是个极大的鼓舞。
  不行,要找出算法来才行!
                        
  继续加油,数数机器码和注册码都是20位(小弟初学,只能用这种菜方法,大家不要笑我哦~~),把注册码
  出现的那个call断下来。
  再往上面仔细看看,有这么一段代码:
  
  007D988B    8B45 FC        mov     eax, dword ptr [ebp-4]           ; 机器码入EAX
  007D988E    E8 CDA9F8FF    call    00764260
  007D9893    8BF0           mov     esi, eax
  007D9895    85F6           test    esi, esi
  007D9897    7E 31          jle     short 007D98CA
  007D9899    BB 01000000    mov     ebx, 1
  007D989E    8D45 F4        lea     eax, dword ptr [ebp-C]
  007D98A1    8B55 FC        mov     edx, dword ptr [ebp-4]
  007D98A4    8A541A FF      mov     dl, byte ptr [edx+ebx-1]         ; 取机器码第一位入dl
  007D98A8    80E2 07        and     dl, 7
  007D98AB    81E2 FF000000  and     edx, 0FF
  007D98B1    83C2 30        add     edx, 30
  007D98B4    03D3           add     edx, ebx
  007D98B6    E8 CDA8F8FF    call    00764188
  007D98BB    8B55 F4        mov     edx, dword ptr [ebp-C]
  007D98BE    8D45 F8        lea     eax, dword ptr [ebp-8]
  007D98C1    E8 A2A9F8FF    call    00764268
  007D98C6    43             inc     ebx
  007D98C7    4E             dec     esi
  007D98C8  ^ 75 D4          jnz     short 007D989E
  007D98CA    8BC7           mov     eax, edi
  007D98CC    8B55 F8        mov     edx, dword ptr [ebp-8]
  007D98CF    E8 20A7F8FF    call    00763FF4                         ; 关键的Call,EDX就是注册码了
  
  看这段
  
  007D98A1    8B55 FC        mov     edx, dword ptr [ebp-4]
  007D98A4    8A541A FF      mov     dl, byte ptr [edx+ebx-1]         ; 取机器码第一位入dl
  007D98A8    80E2 07        and     dl, 7
  007D98AB    81E2 FF000000  and     edx, 0FF
  007D98B1    83C2 30        add     edx, 30
  
  真是熟悉,计算ASCII的,而且从007D9899    BB 01000000    mov     ebx, 1到
  007D98C8  ^ 75 D4          jnz     short 007D989E循环的次数刚好是计算注册码的过程,而且是一位一位的计算的
  这下真让我开心。
  把上面的两个call都断下来,仔细研究一下。没错就是注册码算法
  很简单
  把20位的机器码第一位+1,第二位+2……第20位+20就得出了注册码
  嘿嘿,写出注册程序
  #include<iostream.h>
  int main()
  {
      char jiqima[20];
      char zhucema[21];
      char n;
      cin>>jiqima;
      for(int i=0;i<20;i++)
         {
             n=jiqima[i]+(i+1);
             zhucema[i]=n;
         }
      zhucema[20]='\0';
      cout<<zhucema;
  }
  编译、运行,输入机器码,哎呀,郁闷了,第16位竟然错了,郁闷呀~~
  再仔细看看反汇编的程序,原来问题出在这里
  007D98A8    80E2 07        and     dl, 7
  没注意到这一点,大于8的的机器码都会出错。
  改下注册程序
  ……
  char m='7';//低四位是7,高四位是3,符合纯数字
  ……
  n=(jiqima[i]&m)+(i+1);
  ……
  再编译,运行,哈哈,正确的注册码出来了。
  俩字:激动~
  
  
  
  
  
--------------------------------------------------------------------------------
【经验总结】
  程序不只一个模块,在查找字符串的时候忽略了这一点,浪费了不少时间,自信心也很受打击。
  对汇编语言不熟悉,看着反汇编的程序有点头晕。
  当初的c++没学好,导致了编写注册程序时出现了溢出,后竟大哥哥帮忙改正
  在这次过程中存在侥幸心理,实不可取!
  
  
  扎好基本功才是根本,不再一味的去追求成就感了。
  好好学习,天天向上~
  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2007年06月10日 上午 09:04:06


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 7
支持
分享
最新回复 (7)
雪    币: 222
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
好贴,支持下。

但你应该提供软件下载地址
2007-6-10 10:59
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
支持下

向你学习
2007-6-10 14:12
0
雪    币: 207
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
由于该软件是朋友公司定做的,不便发上来,还请foresee大哥哥多多谅解.
2007-6-10 19:24
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
学习了
一天一天进步吧
2007-6-10 21:19
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
学习了
支持
2007-6-10 22:00
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
呵呵,不错
 可我第一次找了个软件,就复杂的很,验证密码是实时的,通过暴力显示注册成功了,却还有功能限制,并且使用 call EBX这样的跳转,使你找不到真正的密码验证的地方。
 愁
2007-6-11 11:25
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
很详细,如果有软件学着调试一番就更好了,谢谢分享破解心得。
2007-6-12 16:30
0
游客
登录 | 注册 方可回帖
返回
//