【破解作者】 侠盗
【作者邮箱】 mr.zhs@163.com
【作者主页】 www.xyljcom.cn
【使用工具】 PEID,UnAspack,OD
【破解平台】 XP SP2
【软件名称】 客户王 V8.1.6.100 企业版
【下载地址】 http://www4.skycn.com/soft/10294.html
【软件简介】 一个现代化的企业,对于客户资源的关注,已经成为决定企业长久发展的基础。客户王将整个企业的客户关系统一管理,并且通过不同的权限设定,来区别每个角色对资源的操作范围。有了良好的客户数据基础,即使销售人员的变动,客户资料也能够一目了然。
客户王主要功能如下:客户管理(客户基本信息管理,客户智能化分类管理,客户生日提醒,客户联系记录,客户文档管理,客户开发成本分析,客户分布分析)、进销存管理、简易财务管理、文档管理、常用模板管理、工作计划(日历工作计划、全年工作计划安排,计划提醒)、事务管理(加密管理,普通事务,特殊事务、事务提醒)、邮件发送管理、常用信息管理(度量衡查询,邮编区号查询)、销售管理、收藏夹管理.....
主要功能:(略)
【软件大小】 5.81 M
【加壳方式】 Aspack V2.12
【破解声明】 我是一只小菜鸟,偶得一点心得,愿与大家分享:)
--------------------------------------------------------------------------------
【破解内容】
本人破解过多个版本的《客户王》,其中包括早几天出的那个 V9.0 的测试版。今天有网友在 QQ 上通知我说又出 V8.1 的企业版了,问我是否可以做掉它。我当然信心十足,毕竟不是第一次与客户王打交道了嘛。
下载,安装,打开安装文件夹(我破解程序时,都把程序安装在虚拟的 Z: 盘的根目录,这样方便打开,不要层层目录地打开那个 Program Files 什么的了。),双击 KingCRM.exe--因为这个程序要先填写注册信息,属于重启校验型的--居然没有反应!再双击,仍然没有反应,有些晕了,它不会已检测到我将要破解它了吧?它把我的硬盘搜索一遍,发现有 OD 了?
重启电脑,到客厅抽根烟,烟抽完回到电脑桌,电脑已完全启动了,显现出清爽的桌面。开始-客户王 企业版-客户王,呵呵,程序居然运行起来了,填写完注册信息,程序自动关闭,立即打开 Z:\客户王 文件夹,双击 KingCRM.exe,郁闷,仍然是没有反应。有点怪。
关掉文件夹,重新从开始菜单运行,它又运行了。难道它只能从快捷方式启动吗?关闭程序再打开安装文件夹,程序还是无法运行。好象是,它为了防破解,程序只能从快捷方式启动。
打开文件夹,把文件夹最小化,从开始菜单运行程序,程序不运行,却自动把我最小化的窗口还原了。我有些明白了,程序会检测当前打开的窗口,如果打开了程序安装的文件夹,程序就死活不运行。
把 Z:\客户王 改中为 Z:\TEMP,打开 TEMP,双击 KingCRM.exe,呵呵,程序启动了!想法被证实了,它有窗口自校验!
如果在这种情况下破解,当然是可以的,但破解之后发布注册机的时候,还得告诉网友要把程序的安装文件夹改名,不能是“客户王”,显然这有些不爽。既然是自校验,为什么不能把这个校验给砍掉呢?开始工作!
不用再 PEID 了,知道它是 Aspack V2.12 的弱壳,用 UnAspack 轻松搞定。脱 Aspack 的壳,有多种工具可以选择,但 UnAspack 和 QUnpack 脱得比较彻底、完美;如果用 AspackDie 来脱,完了尽管也可以破解,但以后再压缩的时候会提示已经加壳,显然脱壳不完美。但如果遇有附加数据的 Aspack 壳,还只能用 AspackDie 来搞定它。脱过之后,仍然不必 PEID,我知道它的编程语言是 Delphi。
OD 加载脱壳后的 KingCRM.exe。OD 有多个版本,我的电脑上就安装有 5 个版本的 OD,但我最喜欢用的,还是二哥的那个 FuckAll。也许是爱屋及乌吧,我是跟着二哥的教程进入破解之门的。可惜二哥已经退出了,不会再有更好的教程给我们看。
怎么寻找程序退出的位置呢?因为它是发现“客户王”字样的窗口之后,程序才退出的,因此,肯定应该与“客户王”这三个字有关系。用 OD 的字符串插件搜索全部字符串,Ctrl+F 打开搜索窗口,填写“客户王”进行搜索。找到一个,双击“客户王”,来到这里:
005AB1F6 8BC0 MOV EAX,EAX
005AB1F8 . 68 18B25A00 PUSH KingCRM_.005AB218 ; /客户王
005AB1FD . 6A 00 PUSH 0 ; |Class = 0
005AB1FF . E8 90D7E5FF CALL <JMP.&user32.FindWindowA> ; \FindWindowA --发现窗口的函数
005AB204 . 85C0 TEST EAX,EAX
005AB206 . 74 0D JE SHORT KingCRM_.005AB215 --如果没有发现“客户王”窗口,就跳过去,程序继续运行。
005AB208 . 6A 05 PUSH 5 ; /ShowState = SW_SHOW --如果程序不跳,就把窗口打开。
005AB20A . 50 PUSH EAX ; |hWnd
005AB20B . E8 CCDBE5FF CALL <JMP.&user32.ShowWindow> ; \ShowWindow
005AB210 . E8 379FE5FF CALL KingCRM_.0040514C --退出程序的过程
005AB215 > C3 RETN
已经很明显了,把 JE SHORT KingCRM_.005AB215 改为 JMP,不管是否发现“客户王”窗口,都跳过去继续运行程序。把程序另存为 KingCRM_01.exe,解除第一步自校验顺利告捷!
双击 KingCRM_01.exe,程序闪了一下界面,又退出了。这个不用怕,客户王的每一个版本都有这种自校验,它就检验程序是否被脱壳,如果是发现是脱壳后的程序,它就直接退出,不再运行了。
程序是在什么地方发现被脱过壳,然后就退出的呢?这个好找,上面的代码中,倒数第二行是退出程序的过程,想必这在校验也是调用这个过程吧。在 CALL KingCRM_.0040514C 这一行点右键,选“跟随”,发现有多处代码调用这个过程,想法初步被证实:
Local Calls from 00405229, 005AB210, 00918AA6, 00919E8A, 009223E5, 00924E80
OD 重新打开 KingCRM_01.exe,在上面的每一个 CALL 处下断点。当然,005AB210 这儿就不用再下断点了,因为我们刚才已经修改过了。
F9运行程序,立即中断在这儿:
00918A64 > \8D95 7CFFFFFF LEA EDX,DWORD PTR SS:[EBP-84]
00918A6A . A1 D0DA9300 MOV EAX,DWORD PTR DS:[93DAD0]
00918A6F . 8B00 MOV EAX,DWORD PTR DS:[EAX]
00918A71 . E8 BE1CBAFF CALL KingCRM_.004BA734
00918A76 . 8B85 7CFFFFFF MOV EAX,DWORD PTR SS:[EBP-84]
00918A7C . 8D4D 80 LEA ECX,DWORD PTR SS:[EBP-80]
00918A7F . BA 20000000 MOV EDX,20
00918A84 . E8 8FF0FFFF CALL KingCRM_.00917B18
00918A89 . 8B45 80 MOV EAX,DWORD PTR SS:[EBP-80]
00918A8C . 50 PUSH EAX
00918A8D . 8D85 78FFFFFF LEA EAX,DWORD PTR SS:[EBP-88]
00918A93 . E8 7CEFFFFF CALL KingCRM_.00917A14
00918A98 . 8B95 78FFFFFF MOV EDX,DWORD PTR SS:[EBP-88]
00918A9E . 58 POP EAX
00918A9F . E8 58CCAEFF CALL KingCRM_.004056FC
00918AA4 . 74 05 JE SHORT KingCRM_.00918AAB --相等则跳过去继续运行程序。上面的几行代码,好象在用 MD5 进行对比。
00918AA6 . E8 A1C6AEFF CALL KingCRM_.0040514C --退出程序的过程
00918AAB > E8 1C47FFFF CALL KingCRM_.0090D1CC
00918AB0 . 84C0 TEST AL,AL
把 JE SHORT KingCRM_.00918AAB 改为 JMP SHORT KingCRM_.00918AAB,把程序另存为 KingCRM_02.exe,退出OD,双击 KingCRM_02.exe,程序欢快地运行起来了,呵呵,有点兴奋。
至此,客户王的两处自校验都已被拿下,下面的过程就是写注册机了。这个程序是明码比较,写注册机非常小儿科。
程序启动之后,程序窗口的标题显示:客户王 V8.1 [未注册],很显然,程序在启动的时候会检验是否注册,如果尚未注册,会显示[未注册]字样,否则,就不显示[未注册]。它既然会检测是否注册,则必须有检测的过程。对,就从这儿开刀。
OD 加载 KingCRM_02.exe,用字符串插件搜索全部 Ascii 字符串,Ctrl+F 搜索“未注册”,双击搜索到的字符串,程序来到这里:
0091A8E0 /$ 55 PUSH EBP
0091A8E1 |. 8BEC MOV EBP,ESP
0091A8E3 |. 33C9 XOR ECX,ECX
0091A8E5 |. 51 PUSH ECX
0091A8E6 |. 51 PUSH ECX
0091A8E7 |. 51 PUSH ECX
0091A8E8 |. 51 PUSH ECX
0091A8E9 |. 51 PUSH ECX
0091A8EA |. 33C0 XOR EAX,EAX
0091A8EC |. 55 PUSH EBP --这儿下断点
0091A8ED |. 68 CEA99100 PUSH KingCRM_.0091A9CE
0091A8F2 |. 64:FF30 PUSH DWORD PTR FS:[EAX]
0091A8F5 |. 64:8920 MOV DWORD PTR FS:[EAX],ESP
0091A8F8 |. E8 CF28FFFF CALL KingCRM_.0090D1CC --这儿必须 F7 跟进。
0091A8FD |. 84C0 TEST AL,AL
0091A8FF |. 0F84 85000000 JE KingCRM_.0091A98A --从这儿跳到“未注册”,则上面的 CALL 必然是检测注册码的关键 CALL。
0091A905 |. 833D 30389400>CMP DWORD PTR DS:[943830],0
0091A90C |. 74 3E JE SHORT KingCRM_.0091A94C
0091A90E |. 8D55 F8 LEA EDX,DWORD PTR SS:[EBP-8]
0091A911 |. A1 D0DA9300 MOV EAX,DWORD PTR DS:[93DAD0]
0091A916 |. 8B00 MOV EAX,DWORD PTR DS:[EAX]
0091A918 |. E8 1BF3B9FF CALL KingCRM_.004B9C38
0091A91D |. FF75 F8 PUSH DWORD PTR SS:[EBP-8]
0091A920 |. 68 E4A99100 PUSH KingCRM_.0091A9E4 ; - [
0091A925 |. FF35 30389400 PUSH DWORD PTR DS:[943830]
0091A92B |. 68 F4A99100 PUSH KingCRM_.0091A9F4 ; ]
0091A930 |. 8D45 FC LEA EAX,DWORD PTR SS:[EBP-4]
0091A933 |. BA 04000000 MOV EDX,4
0091A938 |. E8 33ADAEFF CALL KingCRM_.00405670
0091A93D |. 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4]
0091A940 |. A1 0C389400 MOV EAX,DWORD PTR DS:[94380C]
0091A945 |. E8 2AD1B7FF CALL KingCRM_.00497A74
0091A94A |. EB 67 JMP SHORT KingCRM_.0091A9B3
0091A94C |> 8D55 F0 LEA EDX,DWORD PTR SS:[EBP-10]
0091A94F |. A1 D0DA9300 MOV EAX,DWORD PTR DS:[93DAD0]
0091A954 |. 8B00 MOV EAX,DWORD PTR DS:[EAX]
0091A956 |. E8 DDF2B9FF CALL KingCRM_.004B9C38
0091A95B |. FF75 F0 PUSH DWORD PTR SS:[EBP-10]
0091A95E |. 68 E4A99100 PUSH KingCRM_.0091A9E4 ; - [
0091A963 |. FF35 44389400 PUSH DWORD PTR DS:[943844]
0091A969 |. 68 F4A99100 PUSH KingCRM_.0091A9F4 ; ]
0091A96E |. 8D45 F4 LEA EAX,DWORD PTR SS:[EBP-C]
0091A971 |. BA 04000000 MOV EDX,4
0091A976 |. E8 F5ACAEFF CALL KingCRM_.00405670
0091A97B |. 8B55 F4 MOV EDX,DWORD PTR SS:[EBP-C]
0091A97E |. A1 0C389400 MOV EAX,DWORD PTR DS:[94380C]
0091A983 |. E8 ECD0B7FF CALL KingCRM_.00497A74
0091A988 |. EB 29 JMP SHORT KingCRM_.0091A9B3
0091A98A |> 8D55 EC LEA EDX,DWORD PTR SS:[EBP-14]
0091A98D |. A1 D0DA9300 MOV EAX,DWORD PTR DS:[93DAD0]
0091A992 |. 8B00 MOV EAX,DWORD PTR DS:[EAX]
0091A994 |. E8 9FF2B9FF CALL KingCRM_.004B9C38
0091A999 |. 8D45 EC LEA EAX,DWORD PTR SS:[EBP-14]
0091A99C |. BA 00AA9100 MOV EDX,KingCRM_.0091AA00 ; - [未注册]
0091A9A1 |. E8 12ACAEFF CALL KingCRM_.004055B8
0091A9A6 |. 8B55 EC MOV EDX,DWORD PTR SS:[EBP-14]
0091A9A9 |. A1 0C389400 MOV EAX,DWORD PTR DS:[94380C]
0091A9AE |. E8 C1D0B7FF CALL KingCRM_.00497A74
0091A9B3 |> 33C0 XOR EAX,EAX
0091A9B5 |. 5A POP EDX
0091A9B6 |. 59 POP ECX
0091A9B7 |. 59 POP ECX
0091A9B8 |. 64:8910 MOV DWORD PTR FS:[EAX],EDX
0091A9BB |. 68 D5A99100 PUSH KingCRM_.0091A9D5
0091A9C0 |> 8D45 EC LEA EAX,DWORD PTR SS:[EBP-14]
0091A9C3 |. BA 05000000 MOV EDX,5
0091A9C8 |. E8 37A9AEFF CALL KingCRM_.00405304
0091A9CD \. C3 RETN
运行程序,打开注册窗口,软件序列号填写 99999999-99999999-99999999-99999999,注册码填写:9876543210,点确定,程序提示注册成功,要求重启验证,并自动关闭了客户王。
切换到 OD 窗口,F9 运行程序,Shift+F9 忽略几处错误信息之后,程序中断在 0091A8EC 处。F8 单步运行到 0091A8F8 处,F7跟进,来到下面:
0090D1CC /$ 55 PUSH EBP
0090D1CD |. 8BEC MOV EBP,ESP
0090D1CF |. 83C4 F0 ADD ESP,-10
0090D1D2 |. 53 PUSH EBX
0090D1D3 |. 33C0 XOR EAX,EAX
0090D1D5 |. 8945 FC MOV DWORD PTR SS:[EBP-4],EAX
0090D1D8 |. 33C0 XOR EAX,EAX
0090D1DA |. 55 PUSH EBP
0090D1DB |. 68 57D29000 PUSH KingCRM_.0090D257
0090D1E0 |. 64:FF30 PUSH DWORD PTR FS:[EAX]
0090D1E3 |. 64:8920 MOV DWORD PTR FS:[EAX],ESP
0090D1E6 |. A1 80E89300 MOV EAX,DWORD PTR DS:[93E880]
0090D1EB |. 8378 20 00 CMP DWORD PTR DS:[EAX+20],0 ; 是否填写了用户单位?如果未填写,下面的 JMP 就跳走了。
0090D1EF |. 75 04 JNZ SHORT KingCRM_.0090D1F5 ; 填写过用户单位名称的,这儿跳过去,略过下面的 JMP。
0090D1F1 |. 33DB XOR EBX,EBX
0090D1F3 |. EB 4C JMP SHORT KingCRM_.0090D241
0090D1F5 |> A1 80E89300 MOV EAX,DWORD PTR DS:[93E880]
0090D1FA |. 8B40 48 MOV EAX,DWORD PTR DS:[EAX+48] ; 机器码
0090D1FD |. E8 CA7BFFFF CALL KingCRM_.00904DCC
0090D202 |. D80D 68D29000 FMUL DWORD PTR DS:[90D268]
0090D208 |. DB7D F0 FSTP TBYTE PTR SS:[EBP-10]
0090D20B |. 9B WAIT
0090D20C |. A1 80E89300 MOV EAX,DWORD PTR DS:[93E880]
0090D211 |. 8B40 4C MOV EAX,DWORD PTR DS:[EAX+4C] ; 序列号,999999999999999999999999999999
0090D214 |. E8 B37BFFFF CALL KingCRM_.00904DCC
0090D219 |. DB6D F0 FLD TBYTE PTR SS:[EBP-10]
0090D21C |. DEC1 FADDP ST(1),ST
0090D21E |. 83C4 F4 ADD ESP,-0C
0090D221 |. DB3C24 FSTP TBYTE PTR SS:[ESP] ; |
0090D224 |. 9B WAIT ; |
0090D225 |. 8D45 FC LEA EAX,DWORD PTR SS:[EBP-4] ; |
0090D228 |. E8 03FAAFFF CALL KingCRM_.0040CC30 ; \由上面的机器码和序列号生成注册码的过程。
0090D22D |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] ; 真正的注册码入 EAX。由于我看不懂算法,上面的 CALL 就没有跟进。
0090D230 |. 8B15 80E89300 MOV EDX,DWORD PTR DS:[93E880] ; KingCRM_.00943810
0090D236 |. 8B52 50 MOV EDX,DWORD PTR DS:[EDX+50] ; 假码 9876543210 EDX.
0090D239 |. E8 BE84AFFF CALL KingCRM_.004056FC ; 比较!经典的比较!
0090D23E |. 0F94C3 SETE BL ; BL 的值确定比较的成败。
0090D241 |> 33C0 XOR EAX,EAX
0090D243 |. 5A POP EDX
0090D244 |. 59 POP ECX
0090D245 |. 59 POP ECX
0090D246 |. 64:8910 MOV DWORD PTR FS:[EAX],EDX
0090D249 |. 68 5ED29000 PUSH KingCRM_.0090D25E
0090D24E |> 8D45 FC LEA EAX,DWORD PTR SS:[EBP-4]
0090D251 |. E8 8A80AFFF CALL KingCRM_.004052E0
0090D256 \. C3 RETN
从以上分析可知,在 0090D230 处是写注册机的最佳断点。
完成!
侠盗 2005-12-22
--------------------------------------------------------------------------------
【破解总结】
去除第一个自校验:005AB206 . 74 0D JE SHORT KingCRM_.005AB215,JE 改 JMP;
去除第二个自校验:00918AA4 . 74 05 JE SHORT KingCRM_.00918AAB,JE 改 JMP;
注册机断点:0090D230
中断次数:1
第一字节:8B
指令长度:6
寄存器:EAX
--------------------------------------------------------------------------------
【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课