价值18万的工程设计软件破解之另类注册机
在破解这个软件之前我从来没有接触过软件破解。连OD、脱壳、爆破什么的都没听说过。破解这个软件总共花费了我整整三个月的时间,从2016年04号找到该软件,到2017年2月6号破解完成。从刚开始的学OD、看教程、看视频、查参考书,然后再到找各种重要函数原型、分析算法,再到最后跟设计者斗智斗勇的思想交锋。
破解过程中的各种心酸,各种纠结,各种难受说是说不清楚,中间有好几次都差点放弃。
之所以要选择我破解这个软件,是因为在工程设计过程中需要出工程制图,我的整个设计软件体系中就缺少这么一款热控设计软件。因为公司规模较小,公司是不会花钱买这种东西的,而且这种软件售价也比较贵,单个软件授权是5万元,如果公司组建一个5人用的平台至少也需要20万。如果10个人已上就更高了了
这个软件破解过程中有几个大坑,首先出现“授权正确”之后,并不代表软件破解成功。其次,如果你不能整出注册码,客户端软件就根本就启动不起来,就算爆破之后启动起来了,运行过程中也会出现很多次的内存访问错误,而且很可能出现软件异常中断。再有CAD的绘图功能也因没有正确授权而不能正常运行。对于CAD插件的破解没有找到合适的破解方法,所以现实要求必须完整的整出授权字符串。
再说说,关于“吾爱破解论坛”上活动的事情吧。双11的时候注册的帐号,之所以注册帐号是因为我在搜索为题的时候发现很多连接都直接指向了这个论坛。因为群里经常有公告说不发表原创文章就可能被封号,所以就一直想整个原创文章发表,而且经常签到,避免不被封号。但是由于自己是新手,能原创的东西并不多,发表文章呢只能拿来主义粘贴上去。但是我觉得这样子没啥意思,对自己的能力提升没有帮助,随后就想等我把这个软件破解完了精心做一篇文章发表,争取被纳入论坛精华。
鉴于这个软件涉及到厂家的只是产权,源文件就不往论坛里发了,但是我可以很负责的说,这个软件破解的精华都已经在下面的描述中给出来了。如果找到源文件按照我的方法可定是可以破解的。。。
经过这次软件破解之后的感悟:习惯了失败之后,成功已不算是成功,失败也不再是失败。坚持就是胜利。。。
现在将我破解过程中的东西进行总结,以方便跟我有共同目标的人少走弯路,坚持自己的路。。。早日成功。
一、软件介绍
二、基础知识
1.破解入门参考教程
暴力逆向第一季 逆向分析技术 https://pan.baidu.com/share/link ... 34880#list/path=%2F
暴力科技第二季 OD全面精通 (我认为最好的OD入门教程) https://pan.baidu.com/s/1i3w12RV#list/path=%2F
2.使用到的软件
吾爱破解专用版OllyDbg PEID 0.95 IDR (Interactive Delphi Reconstructor) IDA Pro v6.6 AspackDie
3.参考书籍
揭秘数据解密的关键技术-刘颖东 (这本书强烈推荐) https://pan.baidu.com/share/link ... fid=737029704242803
加密与解密(第三版) https://pan.baidu.com/share/link ... fid=619796960341408
4.破解常用网址
无爱破解论坛 强烈推荐 http://www.52pojie.cn/
Delphi库文件 (delphi破解必须要有的函数库) http://delphi.ktop.com.tw/download/upload/00019969_Classes.pas
TSL内置对象使用大全 http://www.tinysoft.com.cn/tsdn/helpdoc/display.tsl?id=1519
Delphi反汇编内部字符串处理函数/过程列表 http://www.th7.cn/Program/delphi/201407/251050.shtml
三、破解记录
1. 软件安装
软件安装之后共有两个主要运行文件,如图所示。 2.查壳脱壳
1)、用PEiD 0.95查壳 两个软件均为ASPack2.12压缩壳
2)用AspackDie脱壳之后判断软件的变成语言,均为delphi
3.找出服务器Server软件关键CALL 用IDR反编译Server软件后,单击下图方框中内的选项,进入到关键CALL
- fServer::TfrmServer.LicBtnClick
- 00734C5C push ebp
- 00734C5D mov ebp,esp
- 00734C5F mov ecx,5
- 00734C64 push 0
- 00734C66 push 0
- 00734C68 dec ecx
- <00734C69 jne 00734C64
- 00734C6B push ecx
- 00734C6C push ebx
- 00734C6D push esi
- 00734C6E mov ebx,eax
- 00734C70 xor eax,eax
- 00734C72 push ebp
- 00734C73 push 734E76
- 00734C78 push dword ptr fs:[eax]
- 00734C7B mov dword ptr fs:[eax],esp
- 00734C7E lea edx,[ebp-0C]
- 00734C81 mov eax,dword ptr [ebx+39C];
- 00734C87 call TCustomMaskEdit.GetText
- 00734C8C mov eax,dword ptr [ebp-0C]
- 00734C8F call FileExists //判断授权文件是否存在
- 00734C94 test al,al
- >00734C96 jne 00734CAE //al不为0则授权文件存在
- 00734C98 mov ecx,734E8C; '授权文件不存在!'
- 00734C9D mov dl,1
- 00734C9F mov eax,[00408BC8]; Exception
- 00734CA4 call EOutOfResources.Create; Exception.Create
- 00734CA9 call @RaiseExcept
- 00734CAE xor eax,eax
- 00734CB0 push ebp
- 00734CB1 push 734E1F
- 00734CB6 push dword ptr fs:[eax]
- 00734CB9 mov dword ptr fs:[eax],esp
- 00734CBC mov dl,1
- 00734CBE mov eax,[0041F558]; TStringList
- 00734CC3 call TdxInplaceTextEdit.Create; TStringList.Create
- 00734CC8 mov dword ptr [ebp-8],eax
- 00734CCB lea edx,[ebp-10]
- 00734CCE mov eax,dword ptr [ebx+39C]; TfrmServer.LicenseEdit:TComboEdit
- 00734CD4 call TCustomMaskEdit.GetText
- 00734CD9 mov edx,dword ptr [ebp-10]
- 00734CDC mov eax,dword ptr [ebp-8]
- 00734CDF mov ecx,dword ptr [eax]
- 00734CE1 call dword ptr [ecx+68]; TStrings.LoadFromFile
- 00734CE4 lea ecx,[ebp-4]
- 00734CE7 xor edx,edx
- 00734CE9 mov eax,dword ptr [ebp-8]
- 00734CEC mov esi,dword ptr [eax]
- 00734CEE call dword ptr [esi+0C]; TStringList.Get
- 00734CF1 cmp dword ptr [ebp-4],0
- >00734CF5 je 00734E09
- 00734CFB lea ecx,[ebp-14] //这个地方存放
- 00734CFE mov edx,734EA4;
- 'kjjuoiu987*(&*(uuiyui*&^*789897UIOUI&*^*&^&*Tuytu'
- 00734D03 mov eax,dword ptr [ebp-4] //这个地方存放授权字符串
- 00734D06 call 0070DDC0 //这个是主要解密函数
- 00734D0B mov edx,dword ptr [ebp-14] //解密后的字符串
- 00734D0E mov eax,dword ptr [ebp-8]
- 00734D11 mov ecx,dword ptr [eax]
- 00734D13 call dword ptr [ecx+2C]; //这个是看似没多大作用但非常重要的函数
- 00734D16 mov edx,734EE0; 'MacAddress'
- 00734D1B mov eax,dword ptr [ebp-8]
- 00734D1E mov ecx,dword ptr [eax]
- 00734D20 call dword ptr [ecx+58]; TStrings.IndexOfName
- 00734D23 inc eax //定位到MacAddress之后返回位置数值
- >00734D24 je 00734DFF //也就是说eax的返回值不能为-1
- 00734D2A lea eax,[ebp-18]
- 00734D2D mov edx,dword ptr [ebp-4]
- 00734D30 call @WStrFromLStr
- 00734D35 mov eax,dword ptr [ebp-18]
- 00734D38 push eax
- 00734D39 mov eax,dword ptr [ebx+31C]; TfrmServer.util:Tutil
- 00734D3F xor ecx,ecx
- 00734D41 mov edx,734EF0
- 00734D46 call 004DF858 //向注册表值写值
- 00734D4B lea eax,[ebp-1C]
- 00734D4E push eax
- 00734D4F mov eax,dword ptr [ebx+31C]; TfrmServer.util:Tutil
- 00734D55 xor ecx,ecx
- 00734D57 mov edx,734F34
- 00734D5C call 004DF8C8 //读取注册表值
- 00734D61 mov eax,dword ptr [ebp-1C]
- 00734D64 xor edx,edx
- 00734D66 call @WStrCmp //\Software\Classes\VBS AUTHOR\OLEScript这个注册表的值是否为空,值不为零提示软件已经注册,不能再注册,如果为0才可以注册。
- >00734D6B jne 00734DF3
- 00734D71 call 007310F4 //判断一个文件是否存在,这个不用分析
- 00734D76 test al,al
- >00734D78 jne 00734DB4 //这个跳转应该让它实现才对
- 00734D7A lea ecx,[ebp-24]
- 00734D7D mov edx,734F8C;
- ')(*979798LJOJLJOIU&*(876876YGUGJGJGHIYI(*&*(^&*678678)(*)(IO'
- 00734D82 mov eax,734FD4; '0'
- 00734D87 call 0070DC94
- 00734D8C mov edx,dword ptr [ebp-24]
- 00734D8F lea eax,[ebp-20]
- 00734D92 call @WStrFromLStr
- 00734D97 mov eax,dword ptr [ebp-20]
- 00734D9A push eax
- 00734D9B mov eax,dword ptr [ebx+31C]; TfrmServer.util:Tutil
- 00734DA1 xor ecx,ecx
- 00734DA3 mov edx,734F34
- 00734DA8 call 004DF858
- 00734DAD call 0073102C
- >00734DB2 jmp 00734DE7
- 00734DB4 mov edx,734F8C;
- ')(*979798LJOJLJOIU&*(876876YGUGJGJGHIYI(*&*(^&*678678)(*)(IO'
- 00734DB9 lea ecx,[ebp-2C]
- 00734DBC mov eax,734FE0; '9999'
- 00734DC1 call 0070DC94 //这个是主要加密函数,非常重要。在此处事件999加密
- 00734DC6 mov edx,dword ptr [ebp-2C]
- 00734DC9 lea eax,[ebp-28]
- 00734DCC call @WStrFromLStr
- 00734DD1 mov eax,dword ptr [ebp-28]
- 00734DD4 push eax
- 00734DD5 mov eax,dword ptr [ebx+31C]; TfrmServer.util:Tutil
- 00734DDB xor ecx,ecx
- 00734DDD mov edx,734F34
- 00734DE2 call 004DF858 //将999加密过之后写入注册表
- 00734DE7 mov eax,734FF0; '授权成功!'
- 00734DEC call 006AC330
- >00734DF1 jmp 00734E09
- 00734DF3 mov eax,735004; '已有授权,不能再次授权!'
- 00734DF8 call 006AC330
- >00734DFD jmp 00734E09
- 00734DFF mov eax,735024; '非法授权!'
- 00734E04 call 006AC2C8
- 00734E09 xor eax,eax
- 00734E0B pop edx
- 00734E0C pop ecx
- 00734E0D pop ecx
复制代码 4.客户端软件关键CALL 鉴于这个CALL太长且功能比较简单,暂不列出代码。具体分析见第四部分。
5.软件破解的关键点
下面这两点是经过我大量的分析之后得到的 破解软件的关键点。
1)、两个主要函数(上面代码标红的两个函数)
解密函数: 0070DDC0,加密函数 0070DC94。
2)、两个主要字符串
字符串1:)(*979798LJOJLJOIU&*(876876YGUGJGJGHIYI(*&*(^&*678678)(*)(IO
字符串2:kjjuoiu987*(&*(uuiyui*&^*789897UIOUI&*^*&^&*Tuytu
四、我的另类注册机
有一次上网是这样说的,软件破解有三个层次。第一层,爆破;第二层,追码;第三层写出注册机。
从这句话可以看,我应该数据第二种。但是我觉得我应该属于第三种。因为写出注册机也需要话费很多的事件(如果花点时间我肯定是可以写出来的)。采用我的方式不仅可以生出写注册机的事件,而且速度快。这应该属于破解的更高级别吧。简单而准确的写出注册码。废话不多说。
下面的图是我对整个软件仔细分析之后画出的注册框图,也是破解的核心。理解下列之后再通过代码定位就可以很容易分析出自己的破解方法
注:上途中的0是经过服务器软件检测授权文件之后发送的授权正确的代码。 通过上图可知,授权文件是通过明文加密之后的结果。所以我就猜想我可以通过猜想授权字符串文件没有加密之前的内容。在三.3章节中的00734D16 mov edx,734EE0; 'MacAddress'行可以看出授权字符串中必然含有“MacAddress=”字符串。又经过对服务器Server软件的分析觉得下面这段代码比较重要,对授权字符串代码猜想很有帮助。
- 00731793 . BA 6C1B7300 mov edx,Server.00731B6C ; UserName00731798 . A1 20957400 mov eax,dword ptr ds:[0x749520]
- 0073179D . E8 1224CFFF call <Server.Classes.TStrings.GetValue>
- 007317A2 . 8B55 AC mov edx,dword ptr ss:[ebp-0x54]
- 007317A5 . B8 40957400 mov eax,Server.00749540
- 007317AA . E8 3535CDFF call <Server.System.@LStrAsg>
- 007317AF . 8D4D A8 lea ecx,dword ptr ss:[ebp-0x58]
- 007317B2 . BA 801B7300 mov edx,Server.00731B80 ; License
- 007317B7 . A1 20957400 mov eax,dword ptr ds:[0x749520]
- 007317BC . E8 F323CFFF call <Server.Classes.TStrings.GetValue>
- 007317C1 . 8B45 A8 mov eax,dword ptr ss:[ebp-0x58]
- 007317C4 . E8 8B8CCDFF call <Server.SysUtils.StrToInt> ; 运行到这句之后会跳转到授权信息错误
- 007317C9 . 66:A3 3495740>mov word ptr ds:[0x749534],ax
- 007317CF . 8D4D E8 lea ecx,dword ptr ss:[ebp-0x18]
- 007317D2 . BA 981B7300 mov edx,Server.00731B98 ; JWLicenseNumber
- 007317D7 . A1 20957400 mov eax,dword ptr ds:[0x749520]
- 007317DC . E8 D323CFFF call <Server.Classes.TStrings.GetValue>
- 007317E1 . 66:C705 36957>mov word ptr ds:[0x749536],0x0
- 007317EA . 837D E8 00 cmp dword ptr ss:[ebp-0x18],0x0
- 007317EE . 74 0E je short Server.007317FE
- 007317F0 . 8B45 E8 mov eax,dword ptr ss:[ebp-0x18]
- 007317F3 . E8 5C8CCDFF call <Server.SysUtils.StrToInt>
- 007317F8 . 66:A3 3695740>mov word ptr ds:[0x749536],ax
- 007317FE > 8D4D A4 lea ecx,dword ptr ss:[ebp-0x5C]
- 00731801 . BA B01B7300 mov edx,Server.00731BB0 ; PDMS
- 00731806 . A1 20957400 mov eax,dword ptr ds:[0x749520]
- 0073180B . E8 A423CFFF call <Server.Classes.TStrings.GetValue>
- 00731810 . 8B55 A4 mov edx,dword ptr ss:[ebp-0x5C]
- 00731813 . B8 58957400 mov eax,Server.00749558
- 00731818 . E8 C734CDFF call <Server.System.@LStrAsg>
- 0073181D . 8D4D A0 lea ecx,dword ptr ss:[ebp-0x60]
- 00731820 . BA C01B7300 mov edx,Server.00731BC0 ; Run
- 00731825 . A1 20957400 mov eax,dword ptr ds:[0x749520]
- 0073182A . E8 8523CFFF call <Server.Classes.TStrings.GetValue>
- 0073182F . 8B55 A0 mov edx,dword ptr ss:[ebp-0x60]
- 00731832 . B8 44957400 mov eax,Server.00749544
- 00731837 . E8 A834CDFF call <Server.System.@LStrAsg> ; 需要分析
- 0073183C . 8D4D 9C lea ecx,dword ptr ss:[ebp-0x64]
- 0073183F . BA D41B7300 mov edx,Server.00731BD4 ; IP
- 00731844 . A1 20957400 mov eax,dword ptr ds:[0x749520]
- 00731849 . E8 6623CFFF call <Server.Classes.TStrings.GetValue>
- 0073184E . 8B55 9C mov edx,dword ptr ss:[ebp-0x64]
- 00731851 . B8 48957400 mov eax,Server.00749548
- 00731856 . E8 8934CDFF call <Server.System.@LStrAsg>
- 0073185B . 8D4D 98 lea ecx,dword ptr ss:[ebp-0x68]
- 0073185E . BA E81B7300 mov edx,Server.00731BE8 ; MacAddress
- 00731863 . A1 20957400 mov eax,dword ptr ds:[0x749520]
- 00731868 . E8 4723CFFF call <Server.Classes.TStrings.GetValue>
- 0073186D . 8B55 98 mov edx,dword ptr ss:[ebp-0x68]
- 00731870 . B8 4C957400 mov eax,Server.0074954C
- 00731875 . E8 6A34CDFF call <Server.System.@LStrAsg>
- 0073187A . 8D4D 94 lea ecx,dword ptr ss:[ebp-0x6C]
- 0073187D . BA FC1B7300 mov edx,Server.00731BFC ; Modules
- 00731882 . A1 20957400 mov eax,dword ptr ds:[0x749520]
- 00731887 . E8 2823CFFF call <Server.Classes.TStrings.GetValue>
复制代码
通过已上分析可以猜想加密之前的字符串为
UserName=123,License=123456,PDMSRun=1,RunTimes=1,LicenseIP=192.168.1.105,MacAddress=CC-AF-78-A2-14-E0,Modules=1
再结合三.5可知
字符串1:UserName=123,License=123456,PDMSRun=1,RunTimes=1,LicenseIP=192.168.1.105,MacAddress=CC-AF-78-A2-14-E0,Modules=1 字符串2:kjjuoiu987*(&*(uuiyui*&^*789897UIOUI&*^*&^&*Tuytu
过加密函数0070DC94处理过之后可得软件授权码。
修改之前 修改之后 单步跟踪之后可在local.11中得到授权码 然后将注册码考出,放在一个txt文件中再通过软件授权方式找到该文件即可。 至此软件破解工作结束
虽然这篇朴文不是写的最好的,但我保证肯定是用心的。。。希望能被被坛主加入精华帖。。。期待。。。期待。。。
http://www.52pojie.cn/thread-578989-1-1.html
00
|