原创干货 | 【恶意代码分析技巧】05-exe_Delphi

  • A+

1.Delphi的介绍

Delphi曾经是一种很流行的语言,但由于Borland公司(Delphi语言的母公司)连续决策失误,使得delphi衰落。如今还在使用Delphi的程序员凤毛麟角,奇怪的是,使用Delphi编写的恶意程序却层出不穷。大概是因为Delphi比C++易学,比VB强大。

Delphi比C++易学,主要是因为Delphi是可视化开发的,这点和VB类似。如图所示,Delphi程序在开发的时候,需要写的代码并不多,拖动拖动鼠标,一个窗口就出现了:

图片 4.png
由此也能判断出,Delphi程序也是事件驱动的,而事件驱动的程序在分析的时候关键就是定位事件处理的过程。

本文我们讨论的是Delphi7及之前的Delphi版本,在推出Delphi7之后不久,Borland公司也走向衰败,之后版本的Delphi基本不受Delphi开发者关注。

2.分析工具

2.1.DeDe

DeDe(Delphi Decompiler),最经典最好用的Delphi程序逆向工具。它能迅速定位Delphi程序的事件处理过程:

图片 5.png

这款软件使用起来非常简单,直接将Delphi程序拖进DeDe就可以了,然后就可以结合OD和IDA进行逆向分析了。需要注意的是,你将Delphi程序拖进DeDe的时候,DeDe会主动运行一次Delphi程序,所以请在虚拟机中使用此软件。

2.2.IDR

IDR是一款开源的Delphi反编译软件,你可以在https://github.com/crypto2011/IDR找到它。IDR的设计目的是能够从编译文件中恢复大部分初始Delphi源代码的程序,但目前IDR还无法做到这一步。因为编译链接生成exe时,程序中使用的大多数名称都将转换为地址。这种名称丢失意味着反编译器必须为所有常量,变量,函数和过程创建唯一的名称。即使取得了一定程度的成功,生成的“源代码”也缺少有意义的变量和函数名称。

尽管反编译出来的源代码在可读性上仍有待提高,但不能否认IDR的强大功能。你只需要将Delphi程序拖进IDR,就能得到Delphi源码,加快分析的速度:

图片 6.png

IDR反编译分析出来的是Delphi代码,这和IDA有所区别,IDA反编译得到的是C代码:

图片 7.png

3.修改事件处理过程

事实上,关于Delphi恶意代码分析的部分已经讲解完了,接下来介绍一些有趣的东西,通过两种方式修改Delphi的事件处理过程。

3.1.修改DFM

编写一个Delphi程序时,我们会用到以下两种类型的文件:源代码文件(.pas,.dpr)和资源文件(.res,.rc,.dfm,.dcr)。

DFM文件描述FORM中的每个组件的详细属性信息,当然也包括其中的事件处理函数。

图片 14.png

Delphi源码编译链接生成exe时,Delphi将DFM文件中的信息明文保存到.exe的rsrc节中。于是我们就能直接从exe中读取DFM,然后从DFM中读取FORM的信息,包括事件处理的函数名。

Delphi程序在进行事件响应时,就是从DFM中找到事件处理函数,然后调用的。如果我们修改了DFM中事件处理函数名称,也就改变了Delphi程序的事件处理过程。

在上图示例中,有两个事件处理:Button1Click和Button2Click,如果我们将”Button1Click”修改为”Button2Click”,就会能发现点击Button1的效果和点击Button2的效果是一样的。

图片 15.png

3.2.修改类信息

在3.1节中,我们只是修改了字符串,但是程序执行肯定需要用到地址,exe是如何从根据字符串(事件处理函数名)找到函数地址的呢?Delphi使用的方式很简单,那就是把地址和名称保存在一起。

在exe的code节中保存着Delphi程序的类信息,这里就有事件处理函数名和事件处理函数地址,其保存方式就是“RVA地址+字符串名称”:

图片 17.png

如图所示的两个事件处理函数,Button1Click的地址0x0044168C,Button2Click的地址0x0044186C。而你执行要修改0x0044168C和0x0044186C的值,就能让Delphi程序执行到任意地址处。

参考资料:

http://www.woodmann.com/fravia/dafix_t1.htm
https://www.thoughtco.com/delphi-reverse-engineering-3972290

相关推荐: Hack The Box - OpenAdmin

0x00 目标 Kali: 10.10.16.242 靶机地址:10.10.10.171 目标:user blood and root blood 0x01 信息收集 端口: 使用nmap对目标进行端口扫描: 开放端口:22、80 说明开放ssh和web。 常…