2007/06/13 | 药品销售管理系统破解心得
类别(软件破解及黑客技术) | 评论(0) | 阅读(464) | 发表于 12:56
标 题: 【原创】药品销售管理系统破解心得
作 者: VC果冻
时 间: 2007-06-10,09:14
链 接: bbs.pediy.com/showthread.php?t=46087

【文章标题】: 销售系统破解心得
【文章作者】: 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++没学好,导致了编写注册程序时出现了溢出,后竟大哥哥帮忙改正
在这次过程中存在侥幸心理,实不可取!


扎好基本功才是根本,不再一味的去追求成就感了。
好好学习,天天向上~

0

评论Comments