几乎所有的软件都是程序员辛勤劳动的结晶,作者为了保护自己利益,通常都采用了这样那样的方式来限制未付费用户的使用,只有你向作者付费后才能无限制的使用该软件,通常采用的主要手段有:软件注册、密码保护、磁盘保护、加密狗、光盘保护、网络效验等。Crack所要做的就是不通过付费方式达到和付费用户一样自由使用软件的目的。我觉得可以认为这是逆向工程的初级阶段。通常软件的破解主要分为两类:暴力破解和注册机破解。随着软件保护技术的发展又出现了加壳保护技术。本文将逐渐的介绍这些内容。希望能对你有所帮助!
破解工具
正如做饭需要炊具一样,编程需要Virual C++、Delphi等编程工具;同样如果你想学习破解也得准备一些常用工具。
动态调试工具:softice、ollydbg、trw2000等;
静态分析工具:IDA pro、W32DASM、C32ASM、以及一些针对特定语言程序的反汇编工具
脱壳工具:Unaspack,Caspr,Upx,Unpecompact,ProcDump,PE-Scan等;
其他工具及知识:一定的汇编知识,MSDN等。至于工具的使用方法,网上有很多资料,这里不再熬述。
Crack起步――暴力破解
首先,什么是暴力破解呢?一般认为暴力破解,简称“爆破”,可以认为是破解技术的第一阶段,爆破相对比较简单但是并不是每个软件的爆破都很简单。指的是在不能通过注册机方式正常破解程序或者破解者功力不够时,通过直接修改欲破解程序的关键部分可执行代码,屏蔽或使软件的保护方式失效,从而达到破解软件目的的一种破解方式。
其次,什么情况下使用爆破较好呢?首先如果你的解密知识有限,或者软件的加密算法十分复杂超出你的分析能力;其次,随着网络的逐渐普及,网络效验的注册方式开始兴起,一般来说这时只能靠爆破来破解软件,因为您的数据并未被加入对方的数据库中,效验时必然失败;还有加密狗保护等。
最后,要想成功爆破一个软件需要哪些知识?第一、简单的汇编知识你的了解,例如JZ干什么的知道吗?第二、要会使用一些基本工具,例如W32ASM或Ollydbg以及HIEW等;第三、就是要找到所有需要爆破的地方,这一点通常是最难的,因为有的程序仅仅改一个地方是不能达到目的的。
下面通过《中华灯谜》作为例子来看看如何对程序进行暴力破解(这里只介绍简单的爆破知识)。这里只是抛砖引玉的作用,希望通过这个例子能使你初步了解破解的基本知识。
一般来说:拿到一个软件,首先要做的是“知己知彼,百战不殆”。首先利用fileinfo等工具检测程序是否加壳,如果加壳的话一般需要脱壳(壳是什么?请看后文);接下来检测一下软件是用什么语言编写的(常用工具有FILEINFO,language2000等);然后运行一下程序,试着注册一下看看当你注册失败时该软件的表现如何,能否为破解找出点蛛丝马迹!决定下一步破解步骤。例如如果你找不到注册码输入的地方那么该软件很可能就是利用keyfile或者其他方法来加密的。接下来要做的就是根据软件的编写语言选择相应的调试分析工具。一般通用的静态分析利用W32ASM或者IDA等,对应于具体的语言分析工具有VB――smartcheck wktvbde,DELPHI和BORLAND C用dede等。这里我选择较为常用的W32ASM来分析。
当我们通过上面检测发现,该程序没有加壳,利用DELPHI编写,可以用DEDE进行反汇编。我们来到程序主界面试着注册一下发现当输入错误的信息:订单号1234注册码123456时程序会“提示注册码错误,请重新输入”。记下它,下面有用。接着打开W32ASM中文版,反汇编该程序的可执行文件zhdm.exe。为什么这么做?因为你想破解他,首先你得知道对象是采用什么方法来判断你是否已经注册以及如何注册吧!我们打开W32ASM的“参考”菜单下的“串式数据参考”,你会发现很多字符串,耐心点看看有没有上面程序注册码错误时出现的字符串,一般的你会找到,但是随着软件作者越来越狡猾找到的可能性在降低。找到上面字符串后,双击该字符串回来到程序中出现该字符串位置的地方,一般这里就是程序执行时出现该串的地方。我们来到:
* Possible StringData Ref from Code Obj ->"注册码错误,请重新输入!"
:00506E26 B8886F5000 mov eax, 00506F88
:00506E2B E8A833F3FF call 0043A1D8
这时我们向上看,找找程序如何执行到这里的:
:00506D96 E825DEEFFF call 00404BC0
:00506D9B 0F8585000000 jne 00506E26
很明显当这个条件不成立时跳到00506E26注册失败。如果不跳走就会出现注册成功的信息。我们猜想这个跳转就是传说中关键的跳转,如果改成当上面的条件成立时跳走呢?那不就是当输入正确的注册码时,程序判断注册失败而当你输入错误的注册码时,呵呵!这是我们的猜想,因为现在软件的加密可谓是绞尽脑汁。我们猜想是否正确,我们要通过实践来检验。
* Possible StringData Ref from Code Obj ->"注册成功,谢谢你的注册!"
:00506DA1 B8EC6E5000 mov eax, 00506EEC
:00506DA6 E82D34F3FF call 0043A1D8
我们可以直接利用编辑工具来修改这个指令。这里建议先用动态调试工具OllyDBg来动态调试一下,看看你的猜想是否正确,然后再更改。通常在改跳转成功后,程序会将结果写在一个文件或者注册表中,来表示程序已经注册,这时你必须找到这个位置,然后将其恢复成未注册状态。我们用OD载入程序,我们再00506D96处设置断点,程序断下后,将506D9B处的jne改为je可看见程序能够注册成功。继续单步可以发现程序将注册结果保存在系统目录system32下的ilmCoIn_o_38.dll文件中。我们可以找到这个文件删去,程序又回到未注册版。
对于跳转指令的修改,你最好熟练掌握这些常见的指令。这里有句口诀“一条(跳)就死,九筒(90)就胡 。一条(跳)就胡,一饼(EB)伺候 。妻死(74)便妻无(75),爸死(84)便爸无(85)”以上仅介绍了爆破的一点基本知识,当然不可能一网打尽,所以有句话大家记住“无他,唯手熟尔!”
Crack进阶――注册机
注册破解是通过对程序的跟踪获得正确的注册码、序列号、密码、CD KEY、钥匙文件等,能够通过软件“正版”用户方式注册软件;注册机破解是在注册破解的基础上通过研究原程序的加密算法,然后逆向恢复算法过程,并通过写程序的方式得到一个通用的注册机,这种方式下破解者已经达到和软件公司或作者相同的地位,不但具有“正版”用户注册的能力,更是和软件公司一样具有发布、许可他人“正常”注册的能力。到达这一阶段需要较多的经验和知识。具体而言,包括比较坚实的汇编语言功底、一定的程序编写经验、一定的密码学知识、对windows程序一定的了解等。
对这阶段具体来说,具体步骤怎样呢?我想首先你拿到一个软件通过分析,必须找到程序加密算法的位置,即程序在什么地方计算注册码的,然后才是分析出注册码的计算过程。对于初学者来讲找到注册码计算的位置(即关键call)是个卡。那么如何快速定位呢?笔者有一点小小的心得愿与大家共享。首先对一般加密不太好的程序,关键的call会在关键跳转上面不远的地方,
你可以在用W32ASM反汇编时向上找找,找到你怀疑的地方,记下来。然后利用OD动态调试,开始时在可疑的地方设置断点后不防利用F8单步多走几遍,调试时注意各个寄存器的变化情况,这样你会对程序的流程有一个大致的了解,然后再锁定目标。
其次,有些程序可能加密做的好一些,采用了很多伪装,这时你可以利用消息断点或者内存断点来跟踪。大家知道windows是基于消息驱动方式的操作系统,当你按下鼠标或者击键时,就会传递一个消息,例如showwindow就是显示窗口函数,GetDlgItemText(A)就是获取对话框文本函数。对于DELPHI程序,利用DEDE反汇编后,你可以根据窗体来设置断点。具体使用大家可以再实用中体会。这里我再利用上面的例子简单讲解一下如何找到关键算法位置和对算法进行分析。
我们输入帐单号“1234”注册码“987654”,在反汇编后向上找到50606C处,打开OD,并且在50606C处设置断点。
00506D17 |. E8 AC25F0FF CALL zhdm.004092C8
这个函数将输入的帐单号转化成十六进制,这里注意EAX寄存器:
00506D1C |. B9 63000000 MOV ECX,63 将0x63赋给ECX
00506D21 |. 99 CDQ
00506D22 |. F7F9 IDIV ECX 整除指令EAX/ECX,商存在EAX中,余数在EDX中
00506D24 |. 8BC2 MOV EAX,EDX 赋值指令将余数作为下一个函数的参数
00506D26 |. 8D95 64FFFFFF LEA EDX,DWORD PTR SS:[EBP-9C]
00506D2C |. E8 3325F0FF CALL zhdm.00409264
这里将上面的十六进制转化成十进制的字符串1
00506D31 |. FFB5 64FFFFFF PUSH DWORD PTR SS:[EBP-9C]
00506D37 |. 8D95 54FFFFFF LEA EDX,DWORD PTR SS:[EBP-AC]
00506D3D |. 8B83 48040000 MOV EAX,DWORD PTR DS:[EBX+448]
00506D43 |. E8 9CA2F3FF CALL zhdm.00440FE4
00506D48 |. 8B85 54FFFFFF MOV EAX,DWORD PTR SS:[EBP-AC]
00506D4E |. E8 7525F0FF CALL zhdm.004092C8
00506D53 |. 8D95 58FFFFFF LEA EDX,DWORD PTR SS:[EBP-A8]
00506D59 |. E8 2ADDFFFF CALL zhdm.00504A88
这个函数是个关键,由于篇幅关系这里不再写出过程,大家试着自己跟踪一下。如不明白请到网上论坛探讨!这里会得到一个字符串:
00506D5E |. 8B85 58FFFFFF MOV EAX,DWORD PTR SS:[EBP-A8]
00506D64 |. E8 5F25F0FF CALL zhdm.004092C8
00506D69 |. 8D95 5CFFFFFF LEA EDX,DWORD PTR SS:[EBP-A4]
00506D6F |. E8 F4DDFFFF CALL zhdm.00504B68
将上面的字符串再次经过变换得到一个新串2,具体怎么改变请大家自己跟踪。
00506D74 |. FFB5 5CFFFFFF PUSH DWORD PTR SS:[EBP-A4]
00506D7A |. 68 E06E5000 PUSH zhdm.00506EE0; ASCII "3~"这里有一个固定的串3
00506D7F |. 8D85 68FFFFFF LEA EAX,DWORD PTR SS:[EBP-98]
00506D85 |. BA 03000000 MOV EDX,3
00506D8A |. E8 ADDDEFFF CALL zhdm.00404B3C将上面串123连接起来形成一个注册码
这里你能看见正确的注册码了,如果您想跟进一步那么上面的两个call你就必须搞明白:
00506D8F |. 8B95 68FFFFFF MOV EDX,DWORD PTR SS:[EBP-98]
00506D95 |. 58 POP EAX 至此计算注册码的函数进行完毕
总结一下:找到50606C后,可以多走几遍,初步了解各个函数大体起什么作用,然后对症下药。本程序关键在于00506D59和00506D6F这两个函数,你跟进后分析出他们的具体过程,然后用高级语言写出和他一样的算法就可以写出完美的注册机了。
当你自己能通过分析找到算法时,恭喜你!你的破解水平又上升了一个台阶!
Crack高级篇――脱壳和逆向工程
首先什么是壳?我们可以从它的名字知道,壳就是加在可执行程序或者dll文件上的另一个程序,它专门负责保护软件不被非法修改或反编译。
它们一般都是先于程序运行,拿到控制权,然后完成它们保护软件的任务。
如果要想破解加了壳的程序,首先要做的是脱壳。脱壳有自动脱壳和手动脱壳两种。对于一般很多常见的壳,很多自动脱壳工具例如procdump等等,他们可以帮你快速的脱掉壳,但是随着壳技术的逐渐发展,很多壳需要手动脱。
随着你破解技术的提高,会发现你必须掌握脱壳技术。现在壳的种类很多,按照加壳软件的目的和作用,可分为两类:压缩和保护。
这里的压缩不同于ZIP的概念,压缩程序这类壳主要目的是减小程序体积,例如ASPack、UPX等;保护程序用了很多反脱壳反破解的技术,给exe加上了一层保护膜。对于不同的壳,由于其实现方法不同,其脱壳方法也是不一样的,这里我不在举例说明,大家可以到看雪论坛或者各个破解组织的论坛找到相关资料。
我想破解一个软件并不是最终目的,如果你爱上了破解,我想不是它带给你多少经济利益,而在于你对技术的热爱和追求。这时你应该试着掌握软件的逆向工程。拿常用的QQ来说,一般QQ是不会显示好友IP的,是很多高手通过逆向工程实现了这个功能,你应该猜到逆向工程是干什么的了!
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!