某GIS行业软件 5.2.1(全系列) 许可文件验证分析
【破文标题】某GIS行业软件 x.x.x(全系列) 许可文件验证分析【破文主页】https://www.chinapyg.com
【破解工具】OD,W32Dasm,UEStudio '06,Resource Hacker
【破解平台】XP SP2,Visual Studio 6.0
【软件名称】XxxxxXxx x.x.x(全系列)
【软件大小】965M
【原版下载】http://www.XxxxxXxx.com.cn
【保护方式】单机加密狗/网络加密狗/许可文件
【软件简介】
XxxxxXxx GIS是xxxxxxxx技术有限公司依托xxxxx的科技优势,立足技术创新,研制的新一代大型地理信息系统平台,满足各行业不同类型的用户需要。XxxxxXxx GIS 5系列产品是XxxxxXxx GIS产品的最新版本。
XxxxxXxx GIS由多个软件组成,形成适合各种应用需求的完整的产品系列。XxxxxXxx GIS提供了包括空间数据管理、数据采集、数据处理、大型应用系统开发、地理空间信息发布和移动/嵌入式应用开发在内的全方位的产品,涵盖了GIS应用工程建设全过程。本次发布的XxxxxXxx GIS 5系列产品包括:
◆ XxxxxXxx SDX+ 5 —支持海量空间数据管理的大型空间数据库引擎;
◆ XxxxxXxx Objects 5 —适合大型专业应用系统建设的全组件式GIS开发平台;
◆ XxxxxXxx IS .NET 5 —用于建立大型网络GIS服务的Internet GIS开发平台;
◆ XxxxxXxx Deskpro 5 —用于地理空间数据处理与分析建模的大型桌面GIS软件;
◆ XxxxxXxx Express 5 —用于地理空间数据编辑与处理的桌面GIS软件;
◆ XxxxxXxx Viewer 5 —用于浏览地理空间数据的工具软件。
◆ eXxxxxXxx 5 —适用于移动终端设备的嵌入式GIS开发平台;
【破解声明】
虽然这是一款行业软件,但对于从事地理信息系统开发的人员来说并不陌生,在行业中应用非常广泛,可以称得上是国内 GIS(Geographical Information System) 行业标准之一。但是同其他行业软件一样,其高额的许可费用让许多 GIS 开发初学者望而却步,从而无缘接触该软件。对于 GIS 行业全球的老大——美国 ESRI 的 ArcGIS 系列产品早已被破解得到处都在用,虽然都是用盗版,但毕竟大量的用户为他们带来了丰富的反馈信息与技术交流。为了让所有人都能用得起这款软件,为中国的 GIS 行业发展添一份力(似乎说大了,呵呵),研究了数天(不少了),终于搞定了全系列软件的许可。
当然,话说回来,从Crack技术角度来说,这也是一个很不错的练手的例子,它采用 单机加密狗/网络加密狗/许可文件 的方式进行许可的授权,对于我这个菜鸟来说把狗爆掉简直比登天还难,无奈之下只好研究 许可文件 这种破解方式了。许可文件 的受权方式是一机一号,序列号与硬件有关,还有正式版与试用版(有时间限制)之分,因此非常适合拿来练手^^。
========================================================================
【破解过程】
首先到 http://www.XxxxxXxx.com.cn 下载 xxxxxx x.x.x (免费下载,大概60M左右,速度还可以),并安装到任意目录下(经过长时间研究,发现除了 IS.NET 许可方式稍有不同以外,其它产品完全一致,这为我们的破解带来了很大方便)。安装完成后会自动运行“软件许可配置管理工具”,软件列表中选择 Deskpro,许可方式选择“软件许可文件”,单击下一步,上面的“硬件ID”和“计算机名”任选其一,但许可信息文件需要我们手工建立:
新建一个文本文件,写入如下内容:
Description=XxxxxXxx GIS 5 License File
Version=5.2
User=FreeUser
Company=XxxxxXxx
HardwareID=1234567890
TrialVersion=0
ExpiredDate=9999-12-31
LicenseData=1234567890ABCDEF
LicenseData=1234567890ABCDEF
LicenseData=1234567890ABCDEF
LicenseData=1234567890ABCDEF
LicenseData=1234567890ABCDEF
LicenseData=1234567890ABCDEF
LicenseData=1234567890ABCDEF
LicenseData=1234567890ABCDEF
LicenseData=1234567890ABCDEF
LicenseData=1234567890ABCDEF
LicenseData=1234567890ABCDEF
LicenseData=1234567890ABCDEF
LicenseData=1234567890ABCDEF
LicenseData=1234567890ABCDEF
LicenseData=1234567890ABCDEF
LicenseData=1234567890ABCDEF
LicenseData=1234567890ABCDEF
LicenseData=1234567890ABCDEF
其中“FreeUser”和“XxxxxXxx”可以随意替换,分别对应授权的用户名和公司名。保存后将该文本文件改名为 License.dat,同时在“软件许可配置管理工具”中的“请设置许可信息文件”处指向该文件。基本设置完成,下面运行桌面的 XxxxxXxx Deskpro 5.2 快捷方式看看,怎么样,会铛的一声拒绝你运行该程序。对话框上的“无效的运行许可”正是我们下手的好把柄。打开软件安装路径下的 bin 文件夹,发现了几个 exe 文件和众多 dll 文件,使用 Resource Hacker 挨个过滤(好在没加壳,不然....),终于在 SmALib50.dll 的字串表资源中发现了猫腻(1960号资源含如下字串:“XxxxxXxx Objects软件不能从您的计算机上或网络上获得合法的使用许可,这可能因为....”),看来关键部分在这个文件中。
启动OD,挂上 XxxxxXxxDeskpro.exe(天啊,那个启动窗口居然挡在屏幕中间,你可以把OD设为最前端显示,或者将 XxxxxXxx\bin\Logo.bmp 换成个很小的图片来消除它的影响),切入 SmALib50 模块中,在字符串参考中赫然发现了“Invalid license”、“LicenseData”等字串,跳过去、下断点,跟踪......
整个跟踪过程我就不详细描述了,不说大家也应该体会到了,玩破解关键在这里看你的耐力与运气,对于我这个菜鸟来说整整1天时间全耗在这猫捉老鼠的“游戏”里了。功夫不负有心人,终于在如下代码处让我给跟出来一些关键性的东西(当然这也需要经验和运气),接下来看无比简单的代码分析吧:
========================================================================
SmALib50.dll
修改前的代码(正式许可):
........
008D61D9 A1 E44F9000 mov eax,dword ptr ds:
008D61DE 8D70 F8 lea esi,dword ptr ds:
008D61E1 8D0CB5 44889000 lea ecx,dword ptr ds:[esi*4+CSmCheck::m_strL> ; 看到CSmCheck能想到什么?
008D61E8 51 push ecx
008D61E9 8D4C24 20 lea ecx,dword ptr ss:
008D61ED E8 0C4D0000 call <jmp.&MFC42.#535>
008D61F2 A1 A0889000 mov eax,dword ptr ds:[CSmCheck::m_nTrialVers> ; 这里应该是获取试用版的信息
008D61F7 C68424 E4080000>mov byte ptr ss:,13
008D61FF 85C0 test eax,eax
008D6201 0F85 D5010000 jnz SmALib50.008D63DC
008D6207 8D4C24 60 lea ecx,dword ptr ss:
008D620B E8 D0390000 call SmALib50.008D9BE0
008D6210 8B15 9C889000 mov edx,dword ptr ds:[CSmCheck::m_dwHardware> ; 这里获得硬件代码
008D6216 6A 00 push 0
008D6218 52 push edx
008D6219 51 push ecx
008D621A 8BCC mov ecx,esp
008D621C 896424 2C mov dword ptr ss:,esp
008D6220 68 04849000 push offset SmALib50.CSmCheck::m_strCompany ; 获取公司名字串
008D6225 C68424 F4080000>mov byte ptr ss:,14
008D622D E8 CC4C0000 call <jmp.&MFC42.#535>
008D6232 51 push ecx
008D6233 C68424 F4080000>mov byte ptr ss:,15
008D623B 8BCC mov ecx,esp
008D623D 896424 38 mov dword ptr ss:,esp
008D6241 68 28889000 push offset SmALib50.CSmCheck::m_strUser ; 获取用户名字串
008D6246 E8 B34C0000 call <jmp.&MFC42.#535>
008D624B 8D4424 34 lea eax,dword ptr ss:
008D624F 56 push esi
008D6250 50 push eax
008D6251 8D4C24 78 lea ecx,dword ptr ss: ; 所有以上信息都入了栈
008D6255 C68424 FC080000>mov byte ptr ss:,14
008D625D E8 0E3A0000 call SmALib50.008D9C70 ; 根据堆栈中的字串算出加密的许可号,当然这里面就是算法,搞明白了就可以做注册机了
008D6262 8B4C24 1C mov ecx,dword ptr ss: ; 假码“1234567890ABCDEF”入寄存器ecx
008D6266 8B5424 24 mov edx,dword ptr ss: ; 真码“XXXXXXXXXXXXXXXX”入寄存器edx
008D626A 51 push ecx ; 假码入栈
008D626B 52 push edx ; 真码入栈
008D626C FF15 74658E00 call dword ptr ds:[<&MSVCRT._mbscmp>] ; 比较真假码
008D6272 83C4 08 add esp,8
008D6275 C68424 E4080000>mov byte ptr ss:,14
008D627D 85C0 test eax,eax
008D627F 8D4C24 24 lea ecx,dword ptr ss:
008D6283 0F85 A8000000 jnz SmALib50.008D6331 ; 关键跳,改成0F84 A8000000 je不就就可以了
008D6289 E8 4C4C0000 call <jmp.&MFC42.#800> ;先别高兴,看后面分析!!
008D628E 8D4C24 60 lea ecx,dword ptr ss:
008D6292 C68424 E4080000>mov byte ptr ss:,13
........
========================================================================
但是改了上面的关键跳后,你应该注意到真正的许可文件反而会不能用,那就取一个更稳妥的办法吧:将真假码入栈那一部分改一下,思路是让入栈的都是真码不就更完美了么。
========================================================================
SmALib50.dll
修改后的代码(正式许可):
........
008D6251 8D4C24 78 lea ecx,dword ptr ss: ; 所有以上信息都入了栈
008D6255 C68424 FC080000>mov byte ptr ss:,14
008D625D E8 0E3A0000 call SmALib50.008D9C70
008D6262 8B4C24 24 mov ecx,dword ptr ss: ; 改为真码“XXXXXXXXXXXXXXXX”入寄存器edx
008D6266 8B5424 24 mov edx,dword ptr ss: ; 真码“XXXXXXXXXXXXXXXX”入寄存器edx
008D626A 51 push ecx ; 真码入栈
008D626B 52 push edx ; 还是真码入栈
008D626C FF15 74658E00 call dword ptr ds:[<&MSVCRT._mbscmp>] ; 真码和真码比较还有不通过之说^^
........
========================================================================
既然都明白了,开始下手吧。在 OD 中修改好代码后将修改保存到文件中覆盖原文件,运行一下看看吧,是不是成功了。
先别急,这个破解文件虽然可以用在 XxxxxXxx Deskpro、XxxxxXxx Express、XxxxxXxx D-Builder、XxxxxXxx Objects以及XxxxxXxx Objects Runtime中,可是 XxxxxXxx IS.NET 中却没有这个文件。下面进到 XxxxxXxx IS .NET 安装路径下的 bin 文件夹中看看吧,发现什么了? 那个 AuxLicence50.dll 是不是特别显眼啊,对了,就是这个,看看字串资源与 SmALib50.dll 一样,这个可以用同样方法载入 XxxxxXxx.IS.AppServer.exe 进行跟踪,你会发现判断许可部分代码与 SmALib50.dll 完全一样,只是地址不同了。有了上面的方法,这点小变化不会影响你爆掉它吧^^
但是到此还没有结束,有的人可能已经注意到 Lecense.dat 中“TrialVersion=0”、“ExpiredDate=9999-12-31”这两行了,什么意思呢?对了,是试用版的许可标记及试用期限。目前 XxxxxXxx 公司免费提供试用版许可,这种许可不但有时间限制,还会在生成的Map上显示“未注册”字样。如果还想要以试用版的状态运行软件的话(为什么还要运行试用版?当然是想掩人耳目嘛,这才叫完美破解,我要拥有所有功能,包括试用功能-_-!),只有以上修改还不行,需要再改改其他地方,在这里我同样不再描述对于我这个菜鸟那可怕的跟踪经历了,直接把结果通报如下吧:
========================================================================
AuxLicence50.dll
修改前的代码(试用许可):
........
008D63DC 8D4424 60 lea eax,dword ptr ss:
008D63E0 8D4C24 34 lea ecx,dword ptr ss:
008D63E4 50 push eax
008D63E5 51 push ecx
008D63E6 E8 E5040000 call SmALib50.CSmCheck::IsExpired ; 用于判断是否过期
008D63EB 83C4 08 add esp,8
008D63EE 85C0 test eax,eax
008D63F0 0F85 DD010000 jnz SmALib50.008D65D3 ; 过期关键跳,跳则过期
008D63F6 8D4C24 6C lea ecx,dword ptr ss:
008D63FA E8 E1370000 call SmALib50.008D9BE0
008D63FF A1 9C889000 mov eax,dword ptr ds: ; 获取硬件代码
008D6404 8D5424 34 lea edx,dword ptr ss:
008D6408 52 push edx
008D6409 50 push eax
008D640A 51 push ecx
008D640B C68424 F0080000>mov byte ptr ss:,17
008D6413 8BCC mov ecx,esp
008D6415 896424 2C mov dword ptr ss:,esp
008D6419 68 04849000 push offset SmALib50.CSmCheck::m_strCompany ; 获取公司名字串
008D641E E8 DB4A0000 call <jmp.&MFC42.#535>
008D6423 51 push ecx
008D6424 C68424 F4080000>mov byte ptr ss:,18
008D642C 8BCC mov ecx,esp
008D642E 896424 38 mov dword ptr ss:,esp
008D6432 68 28889000 push offset SmALib50.CSmCheck::m_strUser ; 获取用户名字串
008D6437 E8 C24A0000 call <jmp.&MFC42.#535>
008D643C 8D4C24 34 lea ecx,dword ptr ss:
008D6440 56 push esi
008D6441 51 push ecx
008D6442 8D8C24 84000000 lea ecx,dword ptr ss:
008D6449 C68424 FC080000>mov byte ptr ss:,17
008D6451 E8 1A380000 call SmALib50.008D9C70 ; 试用版许可号比较
008D6456 8B5424 1C mov edx,dword ptr ss: ; 将假码入寄存器
008D645A 8B4424 24 mov eax,dword ptr ss: ; 将真码入寄存器(并非含日期的真码)
008D645E 52 push edx
008D645F 50 push eax
008D6460 FF15 74658E00 call dword ptr ds:[<&MSVCRT._mbscmp>] ; 所有以上信息都入了栈
008D6466 83C4 08 add esp,8
008D6469 C68424 E4080000>mov byte ptr ss:,17
008D6471 85C0 test eax,eax
008D6473 8D4C24 24 lea ecx,dword ptr ss:
008D6477 0F85 AB000000 jnz SmALib50.008D6528 ; 注册关键跳
008D647D E8 584A0000 call <jmp.&MFC42.#800> ; 可以看到这里也与上面过程完全相同
008D6482 8D4C24 6C lea ecx,dword ptr ss: ; 所以这里破解就一样简单了
008D6486 C68424 E4080000>mov byte ptr ss:,13
008D648E E8 CD370000 call SmALib50.008D9C60
........
========================================================================
AuxLicence50.dll
修改后的代码(试用许可):
........
008D63DC 8D4424 60 lea eax,dword ptr ss:
008D63E0 8D4C24 34 lea ecx,dword ptr ss:
008D63E4 50 push eax
008D63E5 51 push ecx
008D63E6 E8 E5040000 call SmALib50.CSmCheck::IsExpired ; 用于判断是否过期
008D63EB 83C4 08 add esp,8
008D63EE 85C0 test eax,eax
008D63F0 EB 04 jmp short SmALib50.008D63F6 ; 强行跳到接下来的一句,这样不管实际日期是否超过程序都按没过期的路子走了
008D63F2 90 nop ; 多余字节补nop
008D63F3 90 nop
008D63F4 90 nop
008D63F5 90 nop
008D63F6 8D4C24 6C lea ecx,dword ptr ss:
008D63FA E8 E1370000 call SmALib50.008D9BE0
........
008D6442 8D8C24 84000000 lea ecx,dword ptr ss:
008D6449 C68424 FC080000>mov byte ptr ss:,17
008D6451 E8 1A380000 call SmALib50.008D9C70 ; 试用版许可号比较
008D6456 8B5424 24 mov edx,dword ptr ss: ; 改为将伪真码入寄存器
008D645A 8B4424 24 mov eax,dword ptr ss: ; 还是伪真码入寄存器...
008D645E 52 push edx ; 可以看到这与上面过程完全相同
008D645F 50 push eax ; 所以这里破解就一样简单了
008D6460 FF15 74658E00 call dword ptr ds:[<&MSVCRT._mbscmp>] ; 所有以上信息都入了栈
008D6466 83C4 08 add esp,8
008D6469 C68424 E4080000>mov byte ptr ss:,17
008D6471 85C0 test eax,eax
008D6473 8D4C24 24 lea ecx,dword ptr ss:
008D6477 0F85 AB000000 jnz SmALib50.008D6528 ; 注册关键跳
........
值得注意的是,这里获得的真码并不是试用版中真正包含试用日期的许可码,所以还原回原版文件后你会发现程序仍然提示试用期已过,所以只好用上面的办法绕过日期以及伪真码的验证,改后虽然可以提示试用期已过,但实际上并无日期限制,只是多个提示而已(偶很菜,跟踪了很久也没弄明白日期与许可号的关系,似乎 License.dat 中的日期与许可号没关系,所以没办法做出真正的试用版来,希望大虾们指点一下)。
========================================================================
========================================================================
如果还嫌上面的方法不好,破坏了程序的话,可以试试下面这个方法直接获得许可号。就是让程序自己弹出真正的许可号(目前不适用于IS.NET,因为它是以服务形式运行于后台的,弹不出任何对话框)
让程序自动弹出注册码,最简单的方法是给它加上一个MessageBox,下面就利用区段的空隙插入代码。既然是为程序添加消息框,我们就得先了解消息函数MessageBox的各个参数。查一下WIN32API的帮助文件:
MessageBox(
HWND hWnd, ;第一个参数是对话框所有者的句柄,可以为NULL
LPCTSTR lpText, ;第二个参数是要显示的字符串
LPCTSTR lpCaption, ;第三个参数是对话框的标题
UINT uType ;第四个参数是对话框的风格
);
我们随便找个带MessageBox函数的PE文件,反汇编后找一下MessageBox,将会发现它的格式基本上是这样:
00404136 6A 00 PUSH 0 ; Style = 对话框的风格
00404138 68 74704500 PUSH00457074 ; Title = 对话框的标题
0040413D 68 54704500 PUSH00457054 ; Text =对话框的内容
00404142 6A 00 PUSH 0 ; hOwner = 句柄
00404144 E8 4FD1FFFF CALL <JMP.&user32.MessageBoxA>; MessageBoxA
这些就是我们要注入的内容。但是我们首要解决的问题是找放这些代码的空间。我们可以用LOADPE为 Dll 增加一个新的区段,然后写入代码。但是这里介绍的方法是利用区段的空隙插入代码,程序运行到这里时可以看到真假码入栈:
008D6262 8B4C24 1C mov ecx,dword ptr ss: ; 假码“1234567890ABCDEF”入寄存器ecx
008D6266 8B5424 24 mov edx,dword ptr ss: ; 真码“XXXXXXXXXXXXXXXX”入寄存器edx
008D626A 51 push ecx ; 假码入栈
008D626B 52 push edx ; 真码入栈
思路是在紧接下来的程序中修改一句 Call,让其指向我们新添加的代码,在新添加的部分读取堆栈中的真码并显示出来,再 RETN 回去继续执行,这样就在程序判断注册码正确与否之前弹出个 MessageBox 来显示真码了。
下面简单说,首先在程序中找个 MessageBox 函数看其格式,记下后再看看上面那段程序把真假码入栈的位置以便读出,写出代码如下:
MOV EAX,DWORD PTR SS: ; 读取堆栈中的假码
MOV EBX,DWORD PTR SS: ; 读取堆栈中的真码
PUSH 0 ; 对话框的风格,无图标,单OK按钮
PUSH EAX ; 标题显示假码
PUSH EBX ; 用户区显示真码
PUSH 0 ; 父句柄,可以不指定,即为0
CALL DWORD PTR DS:[<&USER32.MessageBoxA>>; USER32.MessageBoxA
RETN ; 返回原位置继续执行
========================================================================
至于区段的空隙可以用 OD 打开 dll 的代码,将代码一直拉到底,再向上找到原代码的最后一句,在它下面写我们的语句就可以了:
SmALib50.dll中:
添加语句的代码及位置(即弹出MessageBox:在标题显示假码,在用户区显示真码)
008E50E2 8B4424 20 MOV EAX,DWORD PTR SS:
008E50E6 8B5C24 28 MOV EBX,DWORD PTR SS:
008E50EA 6A 00 PUSH 0
008E50EC 50 PUSH EAX
008E50ED 53 PUSH EBX
008E50EE 6A 00 PUSH 0
008E50F0 FF15 B065DD73 CALL DWORD PTR DS:[<&USER32.MessageBoxA>>; USER32.MessageBoxA
008E50F6 C3 RETN
008E50F7 0000 ADD BYTE PTR DS:,AL
将原先的跳转位置:
008D6330 C3 RETN
008D6331 E8 A44B0000 CALL <JMP.&MFC42.#800_CString::~CString> ; 原先的跳转
008D6336 8D4C24 60 LEA ECX,DWORD PTR SS:
008D633A C68424 E4080000 13 MOV BYTE PTR SS:,13
改为:
008D6330 C3 RETN
008D6331 E8 ACED0000 CALL SmALib50.008E50E2 ; 改为跳转到添加的代码段
008D6336 8D4C24 60 LEA ECX,DWORD PTR SS:
008D633A C68424 E4080000 13 MOV BYTE PTR SS:,13
试用版的方式由于得到的也不是真正的许可码,在这种方法中就略去这一获取许可号的功能了。
========================================================================
对于IS.NET 的 AuxLicence50.dll中,也可以这么改,但由于后台服务的缘故无法弹出 MessageBox ,我是没辙了:
添加语句的代码及位置(即弹出MessageBox:在标题显示假码,在用户区显示真码)
1000B45E 8B4424 20 MOV EAX,DWORD PTR SS:
1000B462 8B5C24 28 MOV EBX,DWORD PTR SS:
1000B466 6A 00 PUSH 0
1000B468 50 PUSH EAX
1000B469 53 PUSH EBX
1000B46A 6A 00 PUSH 0
1000B46C FF15 B065DD73 CALL DWORD PTR DS:[<&USER32.MessageBoxA>] ; USER32.MessageBoxA
1000B472 C3 RETN
1000B473 0000 ADD BYTE PTR DS:,AL
将原先的跳转位置:
10004360 C3 RETN
10004361 E8 A8610000 CALL <JMP.&MFC42.#800_CString::~CString> ; 原先的跳转
10004366 8D4C24 60 LEA ECX,DWORD PTR SS:
1000436A C68424 E4080000 13 MOV BYTE PTR SS:,13
改为:
10004360 C3 RETN
10004361 E8 F8700000 CALL AuxLicen.1000B45E ; 改为跳转到添加的代码段
10004366 8D4C24 60 LEA ECX,DWORD PTR SS:
1000436A C68424 E4080000 13 MOV BYTE PTR SS:,13
同样不进行试用版的分析了,没意义。
========================================================================
有关试用版的一个假想:就是在试用版情况下程序会先根据 License 文件中的许可号计算出到期日期并与系统日起比较,当没有过期的时候才会转入许可号的合法性验证,也就是说如果事先不准备一个到期日期比当前时间晚的假码的话,程序是不会运行到许可号的合法性验证部分,我们也就无法通过上述方法获得正确的许可号了。程序算出的那个所谓的试用真码估计(看好了,是猜想)是以时间 0001-01-01 来计算的,所以还原回去都是提醒过期。
========================================================================
========================================================================
【破解总结】
经过上面的分析(称不上分析啦,大家凑合看吧,别骂我啊),我们要坚定一个信念:行业软件有时候比共享软件更好破解,千万别被他们的各种花哨的许可方式给吓住。因为共享软件作者会更多考虑自己的软件被破解的问题,商业开发团队可不关心这个。破解时即使你是刚入门的菜鸟也没关系,只要有足够的耐心与信心(当然,还有运气),多观察,多注意程序进行的各个部分(比如寄存器,交换的代码,或者堆栈的变化),就一定能够找到关键的代码。最后还要勤记录,多发表破文,这样才能体验到作为一名 Cracker 的快乐。
当然,最后还要强调一下,在你学会破解 XxxxxXxx 之后,希望你能够在24小时内忘掉该方法(汗...),并且千万不要在网上流传出去,仅供自己学习使用即可,更不要以营利为目的进行商业活动,产生的一切后果与本文作者及飘云阁无关。口袋富裕的兄弟们请用你的 Money 来支持国内 GIS 行业的发展,本文纯粹是为了学习技术,绝无其他目的,别有用心之人请勿另作他用。
[ 本帖最后由 shenhaiyu 于 2007-3-8 11:10 编辑 ] 学习了,谢谢分享 又是一篇好文,学习! 精品文章,分析的非常不错,希望shenhaiyu兄弟会带给我们更多惊喜!:lol: 很不错~~
赞一个~~~ :victory: :lol: 辛苦了,最需要这样的作品来学习。 谢谢大家的关注,也感谢斑竹给的置顶,不过这个软件有些太敏感了,我不得不再删去一些信息,也希望斑竹取消置顶,以免被一些别有用心的人利用,谢谢大家 非常感谢shenhaiyu,好的示范,初学者的好帮手,非常感谢! 写得好!
学习了!!! 新建一个文本文件,写入如下内容:
Description=XxxxxXxx GIS 5 License File
Version=5.2
User=FreeUser
Company=XxxxxXxx
HardwareID=1234567890
TrialVersion=0
ExpiredDate=9999-12-31
LicenseData=1234567890ABCDEF
LicenseData=1234567890ABCDEF
LicenseData=1234567890ABCDEF
LicenseData=1234567890ABCDEF
LicenseData=1234567890ABCDEF
LicenseData=1234567890ABCDEF
LicenseData=1234567890ABCDEF
LicenseData=1234567890ABCDEF
LicenseData=1234567890ABCDEF
LicenseData=1234567890ABCDEF
LicenseData=1234567890ABCDEF
LicenseData=1234567890ABCDEF
LicenseData=1234567890ABCDEF
LicenseData=1234567890ABCDEF
LicenseData=1234567890ABCDEF
LicenseData=1234567890ABCDEF
LicenseData=1234567890ABCDEF
LicenseData=1234567890ABCDEF
楼主是怎么知道要新开个文本和里面的内容的? 呵呵
楼猪很强~~支持~!
页:
[1]
2