软件的简单介绍:
“天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
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
在看看这两句:
1C022F44 3D 05B43201 cmp eax, 132B405 1C022F49 7E 30 jle short 1C022F7B
应此这两句的意思就是如果系统时间小于等于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
因此只需把1C0233A9处机器码都改成90即可。
打开软件,终于可以使用软件了。