软件的简单介绍:
“天x结构7.1”是土木工程专业同学进行结构设计的一款较有名的软件,它是AutoCAD二次开发的产物。

为什么要破解,破解什么:
选择“试用版”模式安装完成,使用软件时我们的系统时间得小于2010-01-01,否则直接弹出如下对话框:

第一次使用时必须进行注册,此时使用“天x结构7.1”安装压缩包中的注册机即可。

(成功安装后,就会有左边的工具栏,以后称此为T工具栏)
因此我们以后如果要使用,必须把时间调到2010-01-01之前。
我们要把它“变”成以后即使不调整时间也可使用:)

破解过程:

阶段一:

它是AutoCAD二次开发的产物,那我们得看看AutoCAD的帮助,了解下有哪些方式开发。
1.  ActiveX Automation
2.  AutoCAD VBA
3.  AutoLISP 和 Visual LISP
4.  ObjectARX
那是哪一种方式呢?我们看看它安装目录下的文件,可以发现有许多.arx扩张名的文件,还有一些.lsp的文件。应此我们认定它应该是3方式与4方式的结合。
我们要解决的矛盾是:时间判断在哪个地方呢?
3方式中?它的代码是以源代码的形式存在的,应该不会在这里面;而4方式开发的.arx其实是dll文件,应该这。所以我首先想到的是:对GetSystemTime函数下断点。
用OllyDbg打开软件,AutoCAD都还没加载完就出现错误了,不用说加载“天x”模块了,显然使用了反调试技术。既然这条大路行不通,那我得找其它的路了。

阶段二:

那我们看看加载了哪些模块,再看看AutoCAD帮助,可以知道:用“arx”命令可查看已加载的arx模块。可以发现“tch_initstart.arx - 支持 MDI”,这是“天x”加载的第一个模块,从字面也可以看出。所以主要研究这个文件。
可是tch_initstart.arx文件在好几个文件夹下都有啊!难道每个都要分析?那可不是一件轻松的事!抱着试一试的心情再重新打开软件,突然在状态栏下看到它的加载路径。这下让我松了口气。它加载的是sys16文件夹下的文件。所以应该就只研究它一个啦,哈哈……
用PEID查了下:Microsoft Visual C++ 7.0 DLL Method 3
没加壳!哈哈……马上用IDA打开,查找GetSystemTime函数,果然有调用。这下让我高兴了,马上用IDA的“交叉参考到” GetSystemTime功能,可看到好几个地方调用。那就配合HIEW一个个改咯,然而后面的努力……让我很失望,居然一点效果都没有!一气之下把它的OEP入口改成int 3,打开“天x”软件,然而在加载tch_initstart.arx的时候,它认为tch_initstart.arx 是无效 ARX 文件了。

阶段三:

这时我想到了OllyDbg的附加(attactch to process)功能。因为“天x”是AutoCAD的二次开发产品,所以我想可以自己手动加载:
首先,把系统时间调到2010-01-01以后
其次:打开AutoCAD,用arx把tch_initstart.arx加载
再次:它应该会弹出“软件已经过期!请……”对话框。
要是成功的话,我就在可以用OllyDbg的附加功能调试tch_initstart.arx(后面介绍)。
然而,并没有弹出“软件已经过期!请……”对话框,这肯定是之前还有东西要处理。
再次看看AutoCAD帮助,了解了它的启动过程:“如果打开文件目录下有AutoCAD三种用户可自定义的文件:acad.lsp、acaddoc.lsp 以及用于支持当前菜单的 MNL 文件,那么它会自动加载。”
我发现sys16目录下的确有acad.lsp文件,和菜单文件(非MNL文件)。
用“appload”命令直接加载acad.lsp,然而并没有正常的打开软件,命令行提示:TAsd.lsp加载失败;我在common文件夹下发现TAsd.lsp文件,再加载之。我再用“menuload”命令加载了sys16文件夹下的TCH.mnc文件。这时,我再用“arx”命令加载tch_initstart.arx成功的弹出了“软件已经过期!请……”对话框。这下好办了!

阶段四:

在阶段三中,我们知道了自己手动加载的方法!我们在自己加载tch_initstart.arx之前,一定要在用了“arx”命令的加载参数L弹出通用对话框时(这很重要),才能打开OllyDbg然后附加到acad.exe进程。我们要对user32!MesssageBoxA(W)入口下断点。至于怎么弄我不多说。
这时按F9运行,选择tch_initstart.arx加载!这时停在USER32!MessageBoxA入口处。
这时我们就要看堆栈了。此时堆栈是这样子的:

代码:
0271EED4   7C1CB311  /CALL 到 MessageBoxA 来自 MFC70.7C1CB30B
0271EED8   000F0118  |hOwner = 000F0118 ('AutoCAD 2004 - [Drawing1.dwg]',class='Afx:00400000:8:00010011:00000...')
0271EEDC   1C04B9FC  |Text = "软件已?,AD,"过期!请登?,BD,"天正网站:WWW.Tangent.com.cn 下载",D7,"钚率杂?,B0,"?"
0271EEE0   011D9FD0  |Title = "AutoCAD"
0271EEE4   00000030  \Style = MB_OK|MB_ICONEXCLAMATION|MB_APPLMODAL
…………
0271F024   012A5330
0271F028   1C022F64  返回到 tch_init.1C022F64 来自 <jmp.&MFC70.#1014>
0271F02C   1C04B9FC  tch_init.1C04B9FC
0271F030   00000000
0271F034   00000000
0271F038   012A5120  ASCII "Class"
0271F03C   012A5330
往回看,直到找到第一个返回tch_initstart模块的地址。可以找到:
0271F028   1C022F64  返回到 tch_init.1C022F64 来自 <jmp.&MFC70.#1014>
到tch_init.1C022F64看下:
代码:
1C022F0E    FF15 FC8B041C   call    dword ptr [<&tch_kernal.XAString::XAString>]   ; tch_kern.XAString::XAString
1C022F14    8D4C24 0C       lea     ecx, dword ptr [esp+C]
1C022F18    C68424 D0010000>mov     byte ptr [esp+1D0], 2
1C022F20    FF15 148C041C   call    dword ptr [<&tch_kernal.XAString::operator cha>; tch_kern.XAString::operator char *
1C022F26    50              push    eax
1C022F27    FF15 888E041C   call    dword ptr [<&tch_kernal.GetDate>]              ; tch_kern.GetDate
1C022F2D    83C4 04         add     esp, 4
1C022F30    8D4C24 0C       lea     ecx, dword ptr [esp+C]
1C022F34    FF15 148C041C   call    dword ptr [<&tch_kernal.XAString::operator cha>; tch_kern.XAString::operator char *
1C022F3A    50              push    eax
1C022F3B    FF15 6C87041C   call    dword ptr [<&MSVCR70.atoi>]                    ; MSVCR70.atoi
1C022F41    83C4 04         add     esp, 4
1C022F44    3D 05B43201     cmp     eax, 132B405
1C022F49    7E 30           jle     short 1C022F7B
1C022F4B    A1 A48B041C     mov     eax, dword ptr [<&tch_kernal.g_nProtectCode>]
1C022F50    6A 00           push    0
1C022F52    6A 00           push    0
1C022F54    68 FCB9041C     push    1C04B9FC
1C022F59    C700 00000000   mov     dword ptr [eax], 0
1C022F5F    E8 38050200     call    <jmp.&MFC70.#1014>
1C022F64    8D4C24 0C       lea     ecx, dword ptr [esp+C]
往上看,是不是这句最引人注目:
代码:
1C022F27    FF15 888E041C   call    dword ptr [<&tch_kernal.GetDate>]              ; tch_kern.GetDate
原来它是用它自己tch_kernal.arx模块中的GetDate函数获得系统时间的啊!
在看看这两句:
代码:
1C022F44    3D 05B43201     cmp     eax, 132B405
1C022F49    7E 30           jle     short 1C022F7B
其中132B405把它弄到计算器中,转化成十进制是:20090101
应此这两句的意思就是如果系统时间小于等于2009-01-01的话就转到1C022F7B继续执行,否则弹出:“软件已经过期!请……”对话框。
因此把1C022F49处把7E改成EB即:jle改成jmp
打开软件,顺利打开软件,也有T工具栏,哈哈……但是,功能却是没用啊!
用IDA打开tch_initstart.arx,找到GetDate函数,由“交叉参考”可以看到还有一个地方调用了此函数,双击另一个过程(ReVerifyUserRight),来到此处
代码:
.text:1C023387                 call    ds:?GetDate@@YAXPAD@Z ; GetDate(char *)
.text:1C02338D                 add     esp, 4
.text:1C023390                 lea     ecx, [esp+1B0h+var_1B0]
.text:1C023394                 call    ds:??BXAString@@QAEPADXZ ; XAString::operator char *(void)
.text:1C02339A                 push    eax             ; Str
.text:1C02339B                 call    ds:atoi
.text:1C0233A1                 add     esp, 4
.text:1C0233A4                 cmp     eax, 132B405h
.text:1C0233A9                 jg      short loc_1C023404
.text:1C0233AB                 lea     ecx, [esp+1B0h+var_10C]
.text:1C0233B2                 push    ecx
.text:1C0233B3                 call    sub_1C022530
映入眼帘的是这两句:
代码:
.text:1C0233A4                 cmp     eax, 132B405h
.text:1C0233A9                 jg      short loc_1C023404
它的意思是如果系统时间大于2009-01-01,那么跳到1C023404处,导致出错。
因此只需把1C0233A9处机器码都改成90即可。
打开软件,终于可以使用软件了。