• 标 题:不脱壳破解ACDSee v3.0 trial build 1209(SMC初步,很详细,国外文章) (8千字)
  • 作 者:大波罗
  • 时 间:2001-10-4 18:24:17
  • 链 接:http://bbs.pediy.com

破解ACDSee v3.0 trial build 1209

由于本人英语水平有限,文中不懂之处请参见原文:http://users.belgacom.net/blackb/acdsee.html

                                                                                            翻译:大波罗

标题: Cracking
题目:Cracking
目标: ACDSee v3.0 trial build 1209
地址: http://www.acdsystems.com
作者: BlackB
日期: 2000-03-05
所用工具: SoftICE, Regmon, RegView, HIEW, Procdump
难度级别 (1-5): 3

写在开始之前:
这篇文章仅以教授知识为目的。软件生产者们花费大量时间用于编写他们的程序。他们依靠卖软件所得的钱生活,请购买正版软件吧!!!

I. 导言:
嗨!又一篇文章。这次是ACDSee。注意在这篇文章中用到了一些更高级的Cracking技巧。更深的Cracking知识和Hiew的用法是必须的。如果你是一个新手,我建议你先读一下这个站点的其它文章,如果你想做这些,那么继续吧。再次声明,这篇文章是面向高级cracker们的!也就是需要有高深的crack知识。
II. 关于它的保护:
30天试用期/NAGscreen/ ASpacked/ anti-w32dasm
III. 让我们开始吧:
好的,这将会是一段比较长而且不太容易的文章,我会尽力解释。首先我来对要接触的这的软件作个小小的总结。
1.这个软件被ASPack压缩,所以我们必须手工解压
2.不能用W32dasm发现它的保护,所以我们要用SoftICE对付它
3.EXE文件在解压后太大了,我将告诉你在不解压的情况下打补丁的方法

安装和运行程序。你会注意到无法输入序列号,也就是,你无法注册它,我们叫它试用版。当用反汇编时,W32dasm死锁了…mmmm.。如果我们看一眼十六进制编辑器,能发现(在开头部分)一个.aspack的段!那告诉我们程序被压缩了,所以让我们来解开它。但是!!!等等!在你开始之前我将告诉你如何做。用SoftICE的symbol loader装入压缩的程序(它在装入程序后就直接中断了),开始通过代码跟踪,直到你看到‘ret’指令和新的入口点(这点我将以后解释)。然后让程序无限循环,退出SoftICE和用prodump把整个过程dump下来。然后修复PE-header,意思是:将oep(原始入口点)写入到你在解压的过程之后发现的入口点。如果你没弄清,没有关系,以后我会做详细解释。

让我们开始做吧。单击“Open map”图标,双击ACDsee.exe,然后点击“Load”…什么!!??SoftICE没有拦住!不要紧,可能是段已经设置了属性为C00000020。那些在决定段属性是只读,可写等方面有一定的意义,总之,要使ACDSee中断,我们要改变.text段的属性为C00000040,怎么做?启动prodump,单击“PE-editor”,装载“acdsee.exe”,点击“sections”。右键点击.text段,点击“edit section”,改变C00000020为C00000040。点击ok退出。

现在可以用symbol loader装入并且被中断了,现在我们来通过解开的代码来跟踪直到出现‘ret’指令。注意,我们将设置一些断点离开SoftICE,直到再次被中断,以便更好的跟踪。否则那样花费大量时间在跟踪上。如果你还是不懂,那就先读一下Volatility的关于手工脱壳的文章吧。

好了,当看到了‘ret’,你将看到:

0137:005554B4  OR        EBX,EBX
0137:005554B6  MOV      [EBP+00442E5C],EAX
0137:005554BC  POPAD
0137:005554BD  JNZ      005554C7              ß总是会跳
0137:005554BF  MOV      EAX,00000001
0137:005554C4  RET      000C
0137:005554C7  PUSH      004A33BF              ß这就是真正程序的开始处
0137:005554CC  RET

如果在执行完popad后你看一眼EAX,会是00555001。那就是我们的新入口点。注意,当你停在‘ret’指令上…停止跟踪!现在我们要对程序脱壳了。这时如果退出SoftICE,ACDSee将运行,我们便不能脱壳了…所以让我们在这里作一些改动,如果退出ICE程序永远循环。如何做到?输入以下指令

a eip 按回车键
jmp 5554CC按两次回车键

现在按ctrl-d,启动procdump,卷动应用程序列表滚动条,你在列表末尾会看到ACDSee。在它上面单右键,再点击Dump full。取名为ACDunp.exe存盘,然后用PE-edit修改它的原来的入口点为新的入口点…但是…它已经是00555001…,那么,我们不得不再作一些改变。不要忘记ACDSee仍然在循环…让我们返回上一步吧:按ctrl-d,sice窗口又弹出,你将看见我们仍停在退出sice的位置,现在输入:

a eip  按回车键
ret 按两次回车键

按ctrl-d,ACDSee开始运行了,关闭它,运行ACDunp.exe。如果你每一步都做得很好,它将和ACDSee运行的结果一样,注意到它比原始的.exe大了不少。

我试着反汇编解压的.exe文件,但是不行。让我们再次拿出SoftICE来crack它吧。第一件要做的是破解它的试用版限制。我花了一段时间搜索在那里作比较,终于找到了。我不想告诉你其它许多没有用的方法,但正确的方法是这样:设断点bpx getsystemtime,运行ACDSee,被SoftICE中断,按F12五次就可得到比较点,可以看到下面:

:0137:00433A85 CMP EAX,-04 [<- 错误检查]
:0137:00433A88 JNZ 00433AB4 [<-如果正确则跳]
..........
:0137:00433AB4 CMP EAX,-05[<- 过期了?]
:0137:00433AB7 JNZ 00433ACC [<- 如果过期了,不要跳,这里让它跳]
.........
[继续跟踪一段代码,直到…]
:0137:004045AD ADD ESP,04
:0137:004045B0 TEST EAX,EAX [<- 过期了?]
:0137:004045B2 JNZ 004045C6 [<- 如果过期了,不要跳]

因为要将JNZ 00433ACC 和 JNZ 004045C6 改为 JMP 00433ACC 和 JMP 004045C6。所以必须知道真实的偏移量。运行HIEW,装入ACDunp.exe,按F4,按F3,向下移直到偏移量为401000.按F3你将看风401000变成了真实的偏移量:600。为了得到偏移00433AB7的真正偏移,让我们来做些计算:43AB7-401000+600=330B7.所以真正的偏移量是3300B7。按F5,输入330B7,就在这里了,把JNZ改成JMP,将下一个也做同样的改动。

哇!没有过期提示了!

现在你是否注意到第一次运行ACDSee时,会显示一个提示试用版本的对话框?而且如果你在同一天内运行多次,它也不再显示?好吧,至少我是注意到了。打开Regview看看注册表里有没有象“remind”的键值。ACDSee的键值在HKLM\SOFTWARE\ACD Systems\ACDSee\。让我们来看一下。哈!看到了:EvalRemind!它的值代表了一月中的哪一天。它是这样工作的:ACDSee存储了你上一次使用它的时间。假设你在1-01-2000用了它,在EvalRemind存储为‘01’。你睡一觉醒来再用它,就是2-01-2000,ACDSEE比较存储的值‘01’和今天的日期‘02’…,当它不等的时候就会跳出“提示”窗口。 让我们想想,更深地想想。我们可以在RegQueryValueExa上设断点,但那将在等待这个进程被呼叫上千次上浪费许多时间,我们永远找不到在何处读EvalRemind。但是我以前说了什么?每次你用了ACDSee后它将存储天数在EvalRemind的值里面…所以,大概用了RegSetValueExa来存储。让我们试一下:用symbol loader装载ACDunp.exe,载入后设断点在RegSetValueExa上。你能注意到这个API函数被呼叫了5次!其中有一次就是将日期存在了EvalRemind键上。我们如何找到的?用Regmon.运行Regmon,设置过滤器排除下列进程:iexplore;explorer;regmon。然后在运行ACDunp.exe,看看注册表的修改动作。到冗长的列表开头(大约4500条动作,知道为什么windows会这么慢了吧?)查找“setvalue”。你可以发现有五次……看看….第五次就是我们的EvilRemind键!!

再装入ACDunp.exe,在RegSetValueExa上设断点,当SoftICE窗口弹出第五次的时候,按F12两次,退出子程序,你会看到:

:0137:00407BF2 CALL 00498670
:0137:00407BF9 JNZ 00407C12 <- 你在这里

如果这里跳了,就不在显示提示框了。你能找得出来吗?用跟踪整个CALL和试着读懂代码(正如我那样),或在跳转上设置断点,改变系统时钟再重新运行ACDunp.exe再看看发生了什么吗(将不会跳转)?将JNZ改也为JMP,工作完成了!
做完了?好的,文件尺寸现在变得很大,我们能否修改压缩的文件?是的,我们能!
让我想想……!我们在程序解压以前不能更改它,因为程序在压缩时,我们要修改的指令不在那儿。没问题,我们知道已解压的程序的末尾(看看文章的前面),然后我们在ACDSee.exe发现一些空的区域以便来插入我们的补丁代码。你可以这样做:用HIEW装入ACDSee,exe,往下翻页,再往下翻页,再往下翻页直到你发现你认为没有用到的空间(象许多0000000十六进制值)。现在小心了,因为一些这样的“空间”是用来存储没有压缩的数据。总之,我用了偏移量00556C25来插入补丁代码(真实偏移量是88025).怎么做?

在解压缩程序的末尾我们跳到00556c25(等于插入我们补丁代码的地方)
补丁代码被执行,让它跳回解压缩程序的末尾。
插入的代码象这样:

PUSH 4A33BF //我们将不得不在解压程序的末尾用NOP填充完这个指令,所以我们在这里插入
PUSH EAX //保存EAX寄存器
MOV AL, 0EB //把JMP的十六进制代码(EB)放入AL
MOV [00433AB7], AL //改JNZ为JMP
MOV [004045B2], AL
MOV [00407BF9], AL
POP EAX //恢复EAX的值
JMP 005554CC //跳回解压程序的末尾(我们将跳回‘ret’指令)

好了,这是第一次你开始用这种方法来crack,我能想象这有相当难度,跟我一步步的做:

用HIEW装入ACDSee,exe

按F4,然后再按F3

按F5然后输入“868BD”(到解压代码末的JNZ,你在本文的开头可出看到)

按F3(编辑)

按F2(插入汇编代码)

输入“JMP 88025”(跳到我们插入代码的地方,注意要用真实的偏移地址)

输入“NOP”

输入“NOP”

按escape,按F9存盘

按F5输入“88025”

按F3,然后按F2插入我上面的写的代码(我们的补丁代码呈蓝色)

再次注意:你要键入“JMP 868CC”而不是JMP 005554CC因为你必须用真实的偏移量!

按escape,按F9存盘。

为了让事情更加清楚,这里对以上步骤做个总结:
[end of unpacker code]

jmp inserted_code
back: ret
......(其它代码)......
inserted_code:
PUSH 4A33BF
PUSH EAX
MOV AL, 0EB
MOV [00433AB7], AL
MOV [004045B2], AL
MOV [00407BF9], AL
POP EAX
JMP back

很不错,你成功了,如果你把每一件我告诉你的事做了,运行程序,它应该运行得很好:没有过期提示,也没有显示提示对话框了!又一个目标被破解了!如果你发现了任何问题,不要犹豫写信给我!


转载请保持完整
大波罗
http://wdfdiablo.myetang.com
2001.10.3