首页
社区
课程
招聘
[原创]某行业软件许可文件验证分析(高手勿进)
发表于: 2007-3-3 10:14 34898

[原创]某行业软件许可文件验证分析(高手勿进)

2007-3-3 10:14
34898
【破文标题】某GIS行业软件菜鸟级破解(高手勿进)(后面有人提意见了,我想还是强调一下吧,这篇文章一点技术含量都没有,请高手勿进勿看勿批评,还有斑竹去了加精吧,我不想看雪因为我这篇文章被人看不起。我可一点炫耀的意思都没有,我反复在强调这是菜鸟级的文章,如果高手们连一个菜鸟都容忍不了,我想我还是永远潜水的好)。
【破文主页】http://www.pediy.com
【破解工具】OD,W32Dasm,UEStudio '06,Resource Hacker
【破解平台】XP SP2,Visual Studio 6.0
【软件名称】XxxxxXxx x.x.x(全系列)
【软件大小】965M
【原版下载】http://www.XxxxxXxx.com.cn
【保护方式】单机加密狗/网络加密狗/许可文件
【软件简介】
    *********************

【破解声明】
    虽然这是一款行业软件,但对于从事******开发的人员来说并不陌生,在行业中应用非常广泛,可以称得上是国内 *** 行业标准之一。但是同其他行业软件一样,其高额的许可费用让许多开发初学者望而却步,从而无缘接触该软件。对于***行业全球的 ****** 系列产品早已被破解得到处都在用,虽然都是用盗版,但毕竟大量的用户为他们带来了丰富的反馈信息与技术交流。为了让所有人都能用得起这款软件,为中国的 *** 行业发展添一份力(似乎说大了,呵呵),研究了数天(对于我这个菜鸟不少了),终于搞定了全系列软件的许可。
    我感觉这是一个很不错的练手例子,它采用 单机加密狗/网络加密狗/许可文件 的方式进行许可的授权,对于我这个菜鸟来说把狗爆掉简直比登天还难,无奈之下只好研究 许可文件 这种破解方式了。许可文件 的受权方式是一机一号,序列号与硬件有关,还有正式版与试用版(有时间限制)之分,因此非常适合拿来练手

========================================================================
【破解过程】
    首先到 *** 下载(免费下载,大概60M左右,速度还可以),并安装到任意目录下(经过长时间研究,发现除了 .NET 许可方式稍有不同以外,其它产品完全一致,这为我们的破解带来了很大方便)。安装完成后会自动运行“*******工具”,软件列表中选择 xxxxxx,许可方式选择“****”,单击下一步,上面的“硬件ID”和“计算机名”任选其一,但许可信息文件需要我们手工建立:
    新建一个文本文件,写入如下内容:

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

[XxxxxXxxXxxxxxx]
LicenseData=1234567890ABCDEF
[XxxxxXxxXxxxxxx]
LicenseData=1234567890ABCDEF
[XxxxxXxxXXxxxxxx]
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 Xxxxxxx 5.2 快捷方式看看,怎么样,会铛的一声拒绝你运行该程序。对话框上的“无效的运行许可”正是我们下手的好把柄。打开软件安装路径下的 bin 文件夹,发现了几个 exe 文件和众多 dll 文件,使用 Resource Hacker 挨个过滤(好在没加壳,不然....),终于在 XxxXxx50.dll 的字串表资源中发现了猫腻(1960号资源含如下字串:“XxxxxXxx Xxxxxxx软件不能从您的计算机上或网络上获得合法的使用许可,这可能因为....”),看来关键部分在这个文件中。
        启动OD,挂上 XxxxxXxxXxxxxxx.exe(天啊,那个启动窗口居然挡在屏幕中间,你可以把OD设为最前端显示,或者将 XxxxxXxx\bin\Logo.bmp 换成个很小的图片来消除它的影响),切入 XxXXxx50 模块中,在字符串参考中赫然发现了“Invalid license”、“LicenseData”等字串,跳过去、下断点,跟踪......
        整个跟踪过程我就不详细描述了,不说大家也应该体会到了,玩破解关键在这里看你的耐力与运气,对于我这个菜鸟来说整整1天时间全耗在这猫捉老鼠的“游戏”里了。功夫不负有心人,终于在如下代码处让我给跟出来一些关键性的东西(当然这也需要经验和运气),接下来看无比简单的代码分析吧:

    ========================================================================
    XxXXxx50.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 来支持国内 *** 行业的发展,本文纯粹是为了学习技术,绝无其他目的,别有用心之人请勿另作他用。

    [课程]Android-CTF解题方法汇总!

    收藏
    免费 7
    支持
    分享
    最新回复 (53)
    雪    币: 86
    活跃值: (1043)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    2
    好文,不过老兄还是去掉一些重要的信息,免得给一些人以营利为目的进行商业活动
    2007-3-3 12:36
    0
    雪    币: 208
    活跃值: (10)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    3
    好文章~我以前也研究过 不过看他用加密狗加密 自己比较菜 觉得估计比较难下手 放弃了~
    2007-3-3 15:45
    0
    雪    币: 208
    活跃值: (10)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    4
    提醒下楼主 最好还是抹掉一些敏感消息 以免给自己带来不必要的麻烦
    2007-3-3 15:48
    0
    雪    币: 773
    活跃值: (315)
    能力值: ( LV9,RANK:150 )
    在线值:
    发帖
    回帖
    粉丝
    5
    好好学习,天天向上
    2007-3-3 15:55
    0
    雪    币: 331
    活跃值: (56)
    能力值: ( LV13,RANK:410 )
    在线值:
    发帖
    回帖
    粉丝
    6
    我就是学GIS的,支持LZ
    2007-3-3 15:57
    0
    雪    币: 244
    活跃值: (28)
    能力值: ( LV8,RANK:130 )
    在线值:
    发帖
    回帖
    粉丝
    7
    谢谢大家关心,我已经再次把一些比较敏感的东西换掉了
    Isaiah也是学GIS的?看来我们应该多交流一下了,呵呵,我正研究
    ArcEngine 9.2 的破解呢,不知道可不可以帮助我一下
    2007-3-3 17:56
    0
    雪    币: 175
    活跃值: (2331)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    8
    好文,学习。
    2007-3-3 21:52
    0
    雪    币: 331
    活跃值: (56)
    能力值: ( LV13,RANK:410 )
    在线值:
    发帖
    回帖
    粉丝
    9
    Arc用的是flexlmv
    2007-3-3 22:51
    0
    雪    币: 219
    活跃值: (1634)
    能力值: ( LV9,RANK:410 )
    在线值:
    发帖
    回帖
    粉丝
    10
    学习了,分析的非常不错,另该软件是采用Sentinel Protection的,加密锁方式不知容易解决否!
    2007-3-4 12:21
    0
    雪    币: 208
    活跃值: (10)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    11
    想不到学GIS的这么多,我的专业也是GIS
    2007-3-4 13:01
    0
    雪    币: 195
    活跃值: (10)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    12
    我也是学GIS的!
    SM以前也破过,MAPGIS70也完美破解了。
    没有发表过!
    没有研究过AE破解,有时间看看!
    2007-3-4 18:42
    0
    雪    币: 207
    活跃值: (12)
    能力值: ( LV4,RANK:50 )
    在线值:
    发帖
    回帖
    粉丝
    13
    谢谢楼主,学习,学习...
    2007-3-5 01:40
    0
    雪    币: 244
    活跃值: (28)
    能力值: ( LV8,RANK:130 )
    在线值:
    发帖
    回帖
    粉丝
    14
    原来学GIS的这么多阿!!谢谢大家关心了,不知哪位高手帮我解决一下试用版的破解方法呗,实在是被搞糊涂了,怎么也没看明白为什么试用的方式跟不到真吗,还是我疏忽一些其他问题,希望搞明白的高手根贴共享一下,先谢谢了
    2007-3-5 09:30
    0
    雪    币: 195
    活跃值: (10)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    15
      
    2007-3-5 16:37
    0
    雪    币: 195
    活跃值: (10)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    16
    建议将标题中 "xxx(全系列) "版本号去除!
    2007-3-5 16:38
    0
    雪    币: 200
    活跃值: (10)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    17
    居然在这里看到这么多做GIS的兄弟,高兴Ing.
    我这个超级菜鸟 以后多向各位学习、请教 关于PE和GIS方面的问题了。

    另外 建议楼主这个帖子最好把 "依托中国科学院的科技优势"和版本号等敏感词汇去掉,我想国内GIS圈这么小,可能大家都知道你说的这个软件。

    同时我发现了楼主分析的这个软件的“克隆”版本的一个软件,简直可以是一个模子出来的,软件的名字XxxxxXxx改成了XxxxxEngine,大家有兴趣可以练练手,交流交流。
    2007-3-6 20:29
    0
    雪    币: 244
    活跃值: (28)
    能力值: ( LV8,RANK:130 )
    在线值:
    发帖
    回帖
    粉丝
    18
    谢谢大家关注,既然根贴里都暗示了,我就再去一些敏感信息
    2007-3-8 10:58
    0
    雪    币: 244
    活跃值: (28)
    能力值: ( LV8,RANK:130 )
    在线值:
    发帖
    回帖
    粉丝
    19
    感谢lsrh的共享,可是我的问题是在试用版的情况下跟到的真码不能用,而且发现无论怎样改变系统日期或者许可文件中的日期,跟到的真码都不发生变化,因此想到了试用版真码的算法与本地许可文件或者计算机日期无关,所以不知道如何得到想要的期限的试用码,大家再帮助分析一下呗
    2007-3-8 11:04
    0
    雪    币: 200
    活跃值: (10)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    20
    感谢。。。。。。支持。。。。
    2007-3-8 11:44
    0
    雪    币: 195
    活跃值: (10)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    21
      
    2007-3-8 11:54
    0
    雪    币: 215
    活跃值: (10)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    22
    楼主,按你的方法不行,不过你还是辛苦了
    2007-3-8 16:29
    0
    雪    币: 200
    活跃值: (10)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    23
    好文,支持,思路很清晰
    2007-3-8 22:46
    0
    雪    币: 244
    活跃值: (28)
    能力值: ( LV8,RANK:130 )
    在线值:
    发帖
    回帖
    粉丝
    24
    感谢 lsrh 的帮助,在试用状态下无限期使用软件在原贴中我已经做到了,关键是我想得到真正的试用版许可号该怎么跟呢?
    2007-3-9 09:19
    0
    雪    币: 195
    活跃值: (10)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    25
    见21楼说明!
    2007-3-9 10:30
    0
    游客
    登录 | 注册 方可回帖
    返回
    //