热搜词
发表于 2020-1-17 00:54:51 | 显示全部楼层 |阅读模式
Delphi程序常见破解过程

破解前的准备工作
虚拟机:为啥要使用虚拟机?因为 OD只能在XP下运行  WIN7无法正常的跟踪。
因为有些程序会在系统中放入文件或是注册表,有时需要还原 虚拟机快照,也就是比如你未安装、未运行那个程序之前的状态。
SPY工具
主要有三种 注册表监视、文件监视、网络监视。
因为程序要想保存以判断到的注册或是未注册,或是时间限制。
只有2种可能,就在在注册表中保存信息,在文件中保存信息,通过以上2项监视可以看到操作那里,便于提供信息。

网络监视,有些程序会有网络验证,比如心跳服务器,比如一些数据,通过网络监视,大概的看一下,操作了那些,也方便下断。网络上断 BP send,rev。文件和注册表下断找本文。

查壳工具,看看程序使用的编写工具,以及是否加壳
算法查看工具,可以看是否使用了加密算法,然后搜索相关知识。

Delphi破解流程
1、        先查壳,如果PEID发现是borland 之类的字样就是delphi程序
2、        工具脱壳,ASP用工具程里面的asp 2.1.2中文可脱EXE  DLL用asp 1.3.1可脱,BPL改成dll用1.3.1脱
3、        测试是否正常运行。
4、        打开IDA 程序,跟着向导,基本默认选项即可,程序会在上面的指示器上自动的分析。
5、        分析完毕,使用camelu的插件,shift-p 自动导出一个lu文件,里面包含着OD可用的函数名。
6、        OD载入程序,插件菜单使用camelu导入lu文件,很快完成,就是给程序加了函数名和一些少量的注释,方便理解。
7、        即此就可以用OD破解了。
8、        破解方向
8.1找到注册码使程序变成正式版,使用内存注册机或是制作独立的注册机。
8.2爆破法,找到各种限制的关键判断跳,然后改啊改。
8.3 KEY文件破解法,这个相对是难一些,一般只能爆破或是找到一个可用的key文件,然后改判断机器码是否正确的跳来实现简单爆破。

9、        如何找断点
8.1字符串法,一般先看能不能使用内存注册机,直接使程序变成正版。Keymake使用方法搜索本文。在CPU窗口,右键,中文搜索引擎->智能搜索。找程序中相关的提示。比如,未注册  注册  过期  联系 到期 或是看程序一些可见的限制提示做为下手点。双击来了CPU窗口的断点处,F2下断。

8.2按钮法
比如某个按钮有功能限制,假如一个 保存 按钮,未破解程序就不过,或是提示注册或是提示出错。那就要先找到这个按钮的 rva中断地址。

怎么找?先用晨风星号显示器,这个程序有一个功能,在相关的控件上,会显示其类名,在窗口上会显示其窗口类名。在一些控件上会显示其使用的控件名。

使用DEDE载入脱壳好的 程序,然后开始处理,过程完毕有两个分析对话框,都点yes进行方法查找和扩展分析。

然后先找到 窗体名,然后找事件名,也就是对应的子方法method。找到相关的可以双击直接看DEDE的反汇编,有参考串,方便分析其功能。

有时还是不好找,这时可以使用dede的‘项目’,导出整个工程,然后将出来的dfm文件和pas文件,放置到一个新建的delphi 程序中,对原程序进行替换。然后打开工程,会显示出程序的控件名之类的。 但是程序通过会使用一些自装的控件,这时要么就装控件,要么只能跳过。

当看了这一些后,找到了控件相对应的事件,右键 copy  rva  ,这就是OD中的断点。回到OD中ctrl +G 跳到相关代码处。一般都是push ebp XX之类的字样,同时左边会有大的框线,有一个$标志,这就是method头了,可以F8步进下断。

8.2备注(commen)和标签(label)  使用分号和冒号可以给一些call加上备注方便后来跳来跳去的时候综合分析。冒号加的标签一般加在函数第一句上,这样被call的时候,就会显示你或OD载入的那个函数功能,方便理解。
8.3PE EXPLOERE资源法,delphi的程序,有些窗体或是控件是带着默认属性的,这种东西你如何寻找字符串,也不可能找到,因为不在那个范围。
使用PE EXPLOERE打开EXE后,点击上面 工具栏中的查看资源,就会看到程序完整的窗口控件什么的,还能ctrl F进行搜索,可搜索网址(比如程序要访问网络),一般使用tro开头的一个控件,有网址,有timeout超时时间。

至此结合着DEDE和 PE EX 和IDA的分析,三种工具就可以比较容易的对代码进行理解了。

关于破爆中的跳,怎么跳?
这种跳一般要结合上下文。比如右边注释中看到一些  要过期、请注册之类的备注后。一定是要出提示框或是紧跟着什么操作了,通常上面有CALL,用来返回是否注册的结果 跟着就是一般会有 cmp判断,然后就是跳,这种跳指令不一定,但通常都会指出要跳到那里,如果发现跳了就跳过了下面的提示或是CALL就使用jmp了。使用空格键改 成jmp 下面的 nop填充通常要打开。使指令长度合理,不改变位置。
如果程序对grid类控件进行行数限制,那么通常会执行VCL标准库中的动作以实现对控件的行数更改  一般使用IDA反编译后,有一堆 BPL的程序,就是动态库,这种会直接识别出vcl相应的函数名,比较好找。如果是独立的EXE文件,也就是将库打包到EXE中的情况,这时就识别不好了。就要F7跟进去看看到底干了什么。

然后会终于找到操作控件的CALL也就是函数,在运行过程中,CPU下面的窗口会显示有多少地方CALL了这个函数,这时使用CTRL K查看调用树,但通常没有太多的参考价值,无奈的情况下,可以在左边,将所有的CALL点全部F2下断后,一个个的断着看,到底干了什么。

函数的参数
比如一个函数对行数或是其他进行限制,那么上面都会有参数 就是MOV  寄存器的形式。那就要识别那些参数是用来控制数据量的,比如好找,有些时候会压入字符串指令,运行到这行时候,下面的窗口会显示字符串的内容。

如何修改一些常量,比如到期时间,比如试用版之类的。
不用在运行状态,在那条指令选中后,下面的窗口,中会显示ASCII “字符串”在上面右键 floow value in dump(跟随值到镜像)在第三层窗口会出现字符串,选中了要改的内容  空格键更改,在最上面的 框中会显示乱码,直接中文输入就会更改,会在补丁patch窗口,查看到更改的字句。(ctrl P),可选中后使用空格键来控制是否patch。
有时程序push的常量是直接声明的,就是一个 HEX值,这时没法fllow 就在那条指令上直接右键。FOLLOW in dump,就会出现在下面的数据窗口中了。

如何保存破爆结果?
改了后,在cpu窗口,右键。Copy to exe  (复制到EXE)然后了菜单中selection(选择)
和ALL MODIFY(全部更改)点全部更改,在出现一些对话框,然后选择copy all,
有些修改了mov指令之类的会提示可能出错的一个长对话框,不怕他,点YES,YES YES
然后会出现一个新的file窗口,在窗口点击键 save file可保存。

最后是否成功,完全取决下断点的水平。有些使用加密算法的程序不能无全变成正式版,或一定能爆跳。

以上文本水平较低,本人手打,欢迎各位达人指正,让我进一步的提高。
注册论坛好多年,可惜一直没有时间深入学习逆向,水平有限欢迎拍砖。
全部评论0
回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|手机版|小黑屋|管理员之家 ( 苏ICP备2023053177号-2 )

GMT+8, 2024-11-25 14:54 , Processed in 0.203158 second(s), 34 queries .

Powered by Discuz! X3.5

Cpoyright © 2001-2024 Discuz! Team