飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 13858|回复: 17

[原创] 某GIS行业软件 5.2.1(全系列) 许可文件验证分析

[复制链接]
  • TA的每日心情
    开心
    2021-11-1 00:43
  • 签到天数: 10 天

    [LV.3]偶尔看看II

    发表于 2007-3-3 10:18:05 | 显示全部楼层 |阅读模式
    【破文标题】某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”和“计算机名”任选其一,但许可信息文件需要我们手工建立:
        新建一个文本文件,写入如下内容:


    [Common]
    Description=XxxxxXxx GIS 5 License File
    Version=5.2
    [UserInfo]
    User=FreeUser
    Company=XxxxxXxx
    HardwareID=1234567890
    TrialVersion=0
    ExpiredDate=9999-12-31

    [XxxxxXxxDeskpro]
    LicenseData=1234567890ABCDEF
    [XxxxxXxxExpress]
    LicenseData=1234567890ABCDEF
    [XxxxxXxxDBuilder]
    LicenseData=1234567890ABCDEF
    [SmoDev3D]
    LicenseData=1234567890ABCDEF
    [SmoRt3D]
    LicenseData=1234567890ABCDEF
    [SmoDevCore]
    LicenseData=1234567890ABCDEF
    [SmoRtCore]
    LicenseData=1234567890ABCDEF
    [SmoDevLayout]
    LicenseData=1234567890ABCDEF
    [SmoRtLayout]
    LicenseData=1234567890ABCDEF
    [SmoDevAnalyst]
    LicenseData=1234567890ABCDEF
    [SmoRtAnalyst]
    LicenseData=1234567890ABCDEF
    [SmoDevTopology]
    LicenseData=1234567890ABCDEF
    [SmoRtTopology]
    LicenseData=1234567890ABCDEF
    [SmISNETProfessional]
    LicenseData=1234567890ABCDEF
    [SmISNETAdvanced]
    LicenseData=1234567890ABCDEF
    [SmISNETDevelop]
    LicenseData=1234567890ABCDEF
    [SmDevSDX]
    LicenseData=1234567890ABCDEF
    [SmRtSDX]
    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:[CSmCheck::m_nAppID]
    008D61DE    8D70 F8         lea esi,dword ptr ds:[eax-8]
    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:[esp+20]
    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:[esp+8E4],13
    008D61FF    85C0            test eax,eax
    008D6201    0F85 D5010000   jnz SmALib50.008D63DC
    008D6207    8D4C24 60       lea ecx,dword ptr ss:[esp+60]
    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+2C],esp
    008D6220    68 04849000     push offset SmALib50.CSmCheck::m_strCompany   ; 获取公司名字串
    008D6225    C68424 F4080000>mov byte ptr ss:[esp+8F4],14
    008D622D    E8 CC4C0000     call <jmp.&MFC42.#535>
    008D6232    51              push ecx
    008D6233    C68424 F4080000>mov byte ptr ss:[esp+8F4],15
    008D623B    8BCC            mov ecx,esp
    008D623D    896424 38       mov dword ptr ss:[esp+38],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:[esp+34]
    008D624F    56              push esi
    008D6250    50              push eax
    008D6251    8D4C24 78       lea ecx,dword ptr ss:[esp+78]                ; 所有以上信息都入了栈
    008D6255    C68424 FC080000>mov byte ptr ss:[esp+8FC],14
    008D625D    E8 0E3A0000     call SmALib50.008D9C70                       ; 根据堆栈中的字串算出加密的许可号,当然这里面就是算法,搞明白了就可以做注册机
    008D6262    8B4C24 1C       mov ecx,dword ptr ss:[esp+1C]                ; 假码“1234567890ABCDEF”入寄存器ecx
    008D6266    8B5424 24       mov edx,dword ptr ss:[esp+24]                ; 真码“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:[esp+8E4],14
    008D627D    85C0            test eax,eax
    008D627F    8D4C24 24       lea ecx,dword ptr ss:[esp+24]
    008D6283    0F85 A8000000   jnz SmALib50.008D6331                        ; 关键跳,改成0F84 A8000000 je不就就可以了
    008D6289    E8 4C4C0000     call <jmp.&MFC42.#800>                       ;先别高兴,看后面分析!!
    008D628E    8D4C24 60       lea ecx,dword ptr ss:[esp+60]
    008D6292    C68424 E4080000>mov byte ptr ss:[esp+8E4],13

    ........

    ========================================================================

        但是改了上面的关键跳后,你应该注意到真正的许可文件反而会不能用,那就取一个更稳妥的办法吧:将真假码入栈那一部分改一下,思路是让入栈的都是真码不就更完美了么。

    ========================================================================
    SmALib50.dll
    修改后的代码(正式许可):
    ........
    008D6251    8D4C24 78       lea ecx,dword ptr ss:[esp+78]                ; 所有以上信息都入了栈
    008D6255    C68424 FC080000>mov byte ptr ss:[esp+8FC],14
    008D625D    E8 0E3A0000     call SmALib50.008D9C70
    008D6262    8B4C24 24       mov ecx,dword ptr ss:[esp+24]                ; 改为真码“XXXXXXXXXXXXXXXX”入寄存器edx
    008D6266    8B5424 24       mov edx,dword ptr ss:[esp+24]                ; 真码“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:[esp+60]
    008D63E0    8D4C24 34       lea ecx,dword ptr ss:[esp+34]
    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:[esp+6C]
    008D63FA    E8 E1370000     call SmALib50.008D9BE0
    008D63FF    A1 9C889000     mov eax,dword ptr ds:[CSmCheck::m_dwHardwareID]     ; 获取硬件代码
    008D6404    8D5424 34       lea edx,dword ptr ss:[esp+34]
    008D6408    52              push edx
    008D6409    50              push eax
    008D640A    51              push ecx
    008D640B    C68424 F0080000>mov byte ptr ss:[esp+8F0],17
    008D6413    8BCC            mov ecx,esp
    008D6415    896424 2C       mov dword ptr ss:[esp+2C],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:[esp+8F4],18
    008D642C    8BCC            mov ecx,esp
    008D642E    896424 38       mov dword ptr ss:[esp+38],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:[esp+34]
    008D6440    56              push esi
    008D6441    51              push ecx
    008D6442    8D8C24 84000000 lea ecx,dword ptr ss:[esp+84]
    008D6449    C68424 FC080000>mov byte ptr ss:[esp+8FC],17
    008D6451    E8 1A380000     call SmALib50.008D9C70                              ; 试用版许可号比较
    008D6456    8B5424 1C       mov edx,dword ptr ss:[esp+1C]                       ; 将假码入寄存器
    008D645A    8B4424 24       mov eax,dword ptr ss:[esp+24]                       ; 将真码入寄存器(并非含日期的真码)
    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:[esp+8E4],17
    008D6471    85C0            test eax,eax
    008D6473    8D4C24 24       lea ecx,dword ptr ss:[esp+24]
    008D6477    0F85 AB000000   jnz SmALib50.008D6528                               ; 注册关键跳
    008D647D    E8 584A0000     call <jmp.&MFC42.#800>                              ; 可以看到这里也与上面过程完全相同
    008D6482    8D4C24 6C       lea ecx,dword ptr ss:[esp+6C]                       ; 所以这里破解就一样简单了
    008D6486    C68424 E4080000>mov byte ptr ss:[esp+8E4],13
    008D648E    E8 CD370000     call SmALib50.008D9C60
    ........

    ========================================================================
    AuxLicence50.dll
    修改后的代码(试用许可):
    ........
    008D63DC    8D4424 60       lea eax,dword ptr ss:[esp+60]
    008D63E0    8D4C24 34       lea ecx,dword ptr ss:[esp+34]
    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:[esp+6C]
    008D63FA    E8 E1370000     call SmALib50.008D9BE0
    ........
    008D6442    8D8C24 84000000 lea ecx,dword ptr ss:[esp+84]
    008D6449    C68424 FC080000>mov byte ptr ss:[esp+8FC],17
    008D6451    E8 1A380000     call SmALib50.008D9C70                              ; 试用版许可号比较
    008D6456    8B5424 24       mov edx,dword ptr ss:[esp+24]                       ; 改为将伪真码入寄存器
    008D645A    8B4424 24       mov eax,dword ptr ss:[esp+24]                       ; 还是伪真码入寄存器...
    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:[esp+8E4],17
    008D6471    85C0            test eax,eax
    008D6473    8D4C24 24       lea ecx,dword ptr ss:[esp+24]
    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   PUSH  00457074                  ; Title = 对话框的标题
    0040413D    68 54704500   PUSH  00457054                  ; 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:[esp+1C]                ; 假码“1234567890ABCDEF”入寄存器ecx
    008D6266    8B5424 24       mov edx,dword ptr ss:[esp+24]                ; 真码“XXXXXXXXXXXXXXXX”入寄存器edx
    008D626A    51              push ecx                                     ; 假码入栈
    008D626B    52              push edx                                     ; 真码入栈

        思路是在紧接下来的程序中修改一句 Call,让其指向我们新添加的代码,在新添加的部分读取堆栈中的真码并显示出来,再 RETN 回去继续执行,这样就在程序判断注册码正确与否之前弹出个 MessageBox 来显示真码了。
        下面简单说,首先在程序中找个 MessageBox 函数看其格式,记下后再看看上面那段程序把真假码入栈的位置以便读出,写出代码如下:

    MOV EAX,DWORD PTR SS:[ESP+20]            ; 读取堆栈中的假码
    MOV EBX,DWORD PTR SS:[ESP+28]            ; 读取堆栈中的真码
    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:[ESP+20]
    008E50E6    8B5C24 28             MOV EBX,DWORD PTR SS:[ESP+28]
    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:[EAX],AL

    将原先的跳转位置:
    008D6330    C3                    RETN
    008D6331    E8 A44B0000           CALL <JMP.&MFC42.#800_CString::~CString> ; 原先的跳转
    008D6336    8D4C24 60             LEA ECX,DWORD PTR SS:[ESP+60]
    008D633A    C68424 E4080000 13    MOV BYTE PTR SS:[ESP+8E4],13
    改为:
    008D6330    C3                    RETN
    008D6331    E8 ACED0000           CALL SmALib50.008E50E2                   ; 改为跳转到添加的代码段
    008D6336    8D4C24 60             LEA ECX,DWORD PTR SS:[ESP+60]
    008D633A    C68424 E4080000 13    MOV BYTE PTR SS:[ESP+8E4],13

        试用版的方式由于得到的也不是真正的许可码,在这种方法中就略去这一获取许可号的功能了。

    ========================================================================

    对于IS.NET 的 AuxLicence50.dll中,也可以这么改,但由于后台服务的缘故无法弹出 MessageBox ,我是没辙了:
    添加语句的代码及位置(即弹出MessageBox:在标题显示假码,在用户区显示真码)
    1000B45E    8B4424 20       MOV EAX,DWORD PTR SS:[ESP+20]
    1000B462    8B5C24 28       MOV EBX,DWORD PTR SS:[ESP+28]
    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:[EAX],AL

    将原先的跳转位置:
    10004360    C3                    RETN
    10004361    E8 A8610000           CALL <JMP.&MFC42.#800_CString::~CString> ; 原先的跳转
    10004366    8D4C24 60             LEA ECX,DWORD PTR SS:[ESP+60]
    1000436A    C68424 E4080000 13    MOV BYTE PTR SS:[ESP+8E4],13
    改为:
    10004360    C3                    RETN
    10004361    E8 F8700000           CALL AuxLicen.1000B45E                   ; 改为跳转到添加的代码段
    10004366    8D4C24 60             LEA ECX,DWORD PTR SS:[ESP+60]
    1000436A    C68424 E4080000 13    MOV BYTE PTR SS:[ESP+8E4],13

        同样不进行试用版的分析了,没意义。

    ========================================================================

        有关试用版的一个假想:就是在试用版情况下程序会先根据 License 文件中的许可号计算出到期日期并与系统日起比较,当没有过期的时候才会转入许可号的合法性验证,也就是说如果事先不准备一个到期日期比当前时间晚的假码的话,程序是不会运行到许可号的合法性验证部分,我们也就无法通过上述方法获得正确的许可号了。程序算出的那个所谓的试用真码估计(看好了,是猜想)是以时间 0001-01-01 来计算的,所以还原回去都是提醒过期。


    ========================================================================
    ========================================================================


    【破解总结】

        经过上面的分析(称不上分析啦,大家凑合看吧,别骂我啊),我们要坚定一个信念:行业软件有时候比共享软件更好破解,千万别被他们的各种花哨的许可方式给吓住。因为共享软件作者会更多考虑自己的软件被破解的问题,商业开发团队可不关心这个。破解时即使你是刚入门的菜鸟也没关系,只要有足够的耐心与信心(当然,还有运气),多观察,多注意程序进行的各个部分(比如寄存器,交换的代码,或者堆栈的变化),就一定能够找到关键的代码。最后还要勤记录,多发表破文,这样才能体验到作为一名 Cracker 的快乐。
        当然,最后还要强调一下,在你学会破解 XxxxxXxx 之后,希望你能够在24小时内忘掉该方法(汗...),并且千万不要在网上流传出去,仅供自己学习使用即可,更不要以营利为目的进行商业活动,产生的一切后果与本文作者及飘云阁无关。口袋富裕的兄弟们请用你的 Money 来支持国内 GIS 行业的发展,本文纯粹是为了学习技术,绝无其他目的,别有用心之人请勿另作他用。

    [ 本帖最后由 shenhaiyu 于 2007-3-8 11:10 编辑 ]

    评分

    参与人数 1威望 +20 收起 理由
    tigerisme + 20 精品文章

    查看全部评分

    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2019-3-15 21:05
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2007-3-3 12:18:36 | 显示全部楼层
    学习了,谢谢分享
    PYG19周年生日快乐!
  • TA的每日心情

    2016-6-2 20:34
  • 签到天数: 10 天

    [LV.3]偶尔看看II

    发表于 2007-3-3 12:37:31 | 显示全部楼层
    又是一篇好文,学习!
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-3-4 13:39:01 | 显示全部楼层
    精品文章,分析的非常不错,希望shenhaiyu兄弟会带给我们更多惊喜!:lol:
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2023-5-3 19:45
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    发表于 2007-3-6 11:05:21 | 显示全部楼层
    很不错~~
    赞一个~~~ :victory:
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    半小时前
  • 签到天数: 1826 天

    [LV.Master]伴坛终老

    发表于 2007-3-6 11:30:30 | 显示全部楼层
    :lol: 辛苦了,最需要这样的作品来学习。
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2021-11-1 00:43
  • 签到天数: 10 天

    [LV.3]偶尔看看II

     楼主| 发表于 2007-3-8 11:07:52 | 显示全部楼层
    谢谢大家的关注,也感谢斑竹给的置顶,不过这个软件有些太敏感了,我不得不再删去一些信息,也希望斑竹取消置顶,以免被一些别有用心的人利用,谢谢大家
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-1-19 16:12:17 | 显示全部楼层
    非常感谢shenhaiyu,好的示范,初学者的好帮手,非常感谢!
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2015-8-23 23:49
  • 签到天数: 27 天

    [LV.4]偶尔看看III

    发表于 2008-1-29 13:58:44 | 显示全部楼层
    写得好!
    学习了!!!
    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2017-4-21 10:43
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2008-2-28 11:09:19 | 显示全部楼层
    新建一个文本文件,写入如下内容:


    [Common]
    Description=XxxxxXxx GIS 5 License File
    Version=5.2
    [UserInfo]
    User=FreeUser
    Company=XxxxxXxx
    HardwareID=1234567890
    TrialVersion=0
    ExpiredDate=9999-12-31

    [XxxxxXxxDeskpro]
    LicenseData=1234567890ABCDEF
    [XxxxxXxxExpress]
    LicenseData=1234567890ABCDEF
    [XxxxxXxxDBuilder]
    LicenseData=1234567890ABCDEF
    [SmoDev3D]
    LicenseData=1234567890ABCDEF
    [SmoRt3D]
    LicenseData=1234567890ABCDEF
    [SmoDevCore]
    LicenseData=1234567890ABCDEF
    [SmoRtCore]
    LicenseData=1234567890ABCDEF
    [SmoDevLayout]
    LicenseData=1234567890ABCDEF
    [SmoRtLayout]
    LicenseData=1234567890ABCDEF
    [SmoDevAnalyst]
    LicenseData=1234567890ABCDEF
    [SmoRtAnalyst]
    LicenseData=1234567890ABCDEF
    [SmoDevTopology]
    LicenseData=1234567890ABCDEF
    [SmoRtTopology]
    LicenseData=1234567890ABCDEF
    [SmISNETProfessional]
    LicenseData=1234567890ABCDEF
    [SmISNETAdvanced]
    LicenseData=1234567890ABCDEF
    [SmISNETDevelop]
    LicenseData=1234567890ABCDEF
    [SmDevSDX]
    LicenseData=1234567890ABCDEF
    [SmRtSDX]
    LicenseData=1234567890ABCDEF


    楼主是怎么知道要新开个文本  和里面的内容的? 呵呵
    楼猪很强~~  支持~!
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表