静态分析基础技术
一、反病毒引擎扫描
在分析一个可疑的恶意代码样本时,第一步就最好是拿多个反病毒软件扫描下这个文件,看是否有哪个引擎已经能够识别它。
反病毒扫描网站:VirusTotal
二、哈希值:恶意代码的指纹
使用哈希来识别恶意代码。
命令行工具:md5deep
图形化工具:winmd5
三、查找字符串
Strings程序:搜索可执行文件中的可打印字符串。
四、加壳与混淆恶意代码
加壳和混淆代码通常至少会包含LoadLibrary和GetProcAddress函数,它们是用来加载和使用其他函数功能的。
- 加壳后的恶意程序会被压缩,并且难以分析。所有加壳文件的字符串列表、导入表和其他信息都被压缩了,对大部分静态分析工具都是不可见的。
PEiD工具:检测加壳器的类型,或者用来链接应用程序的编译器类型。
五、PE文件格式
可移植执行(PE)文件格式是Windows可执行文件、对象代码和DLL所使用的标准格式。几乎每个在Windows系统中加载的可执行代码都使用PE文件格式。PE文件以一个文件头开始,其中包含代码信息、应用程序类型、所需的库函数与空间要求。
六、链接库与函数
静态链接、运行时链接与动态链接
- 静态链接:当一个库被静态链接到可执行程序时,所有这个库中的代码都会被复制到可执行程序中,这会让可执行程序增大许多,但是在分析代码时,很难区分静态链接的代码与可执行程序自身代码,因为在PE文件头中没有迹象表明这个文件含有链接代码。
- 运行时链接:运行时链接在合法程序中不流行,但是在恶意代码中是常用的,特别是加壳或者混淆时。两个常见的链接函数:LoadLibrary和GetProcAddress,允许一个程序访问系统上任何库中的任何函数。
- 动态链接:当代码库被动态链接时。宿主操作系统会在程序被装载时搜索所需的代码库。
使用Dependency Walker工具探索动态链接函数。
常见的DLL程序:
-
kernel32.dll:
kernel32.dll是Windows 9x/Me中非常重要的32位动态链接库文件,属于内核级文件。它控制着系统的内存管理、数据的输入输出操作和中断处理,当Windows启动时,kernel32.dll就驻留在内存中特定的写保护区域,使别的程序无法占用这个内存区域。 -
user32.dll:
user32.dll是Windows用户界面相关应用程序接口,用于包括Windows处理,基本用户界面等特性,如创建窗口和发送消息。
在早期32-bit 版本的Windows中,用户控件是在ComCtl32中实现的,但是一些控件的显示功能是在User32.dll中实现的。例如在一个窗口中非客户区域(边框和菜单)的绘制就是由User32.dll来完成的。User32.dll 是操作系统的一个核心控件,它和操作系统是紧密联系在一起的。也就是说,不同版本的Windows中User32.dll 是不同。因此,应用程序在不同版本的Windows中运行的时候,由于User32.dll的不同,会导致应用程序的界面通常会有微小的不同。
-
gdi32.dll:
gdi32.dll是Windows GDI图形用户界面相关程序,包含的函数用来绘制图像和显示文字 -
comdlg32.dll:
comdlg32.dll是Windows应用程序公用对话框模块,用于例如打开文件对话框。 -
advapi32.dll:
advapi32.dll是一个高级API应用程序接口服务库的一部分,包含的函数与对象的安全性,注册表的操控以及事件日志有关。 -
shell32.dll:
shell32.dll是Windows的32位外壳动态链接库文件,用于打开网页和文件,建立文件时的默认文件名的设置等大量功能。
严格来讲,它只是代码的合集,真正执行这些功能的是操作系统的相关程序,dll文件只是根据设置调用这些程序的相关功能罢了。 -
ole32.dll:
ole32.dll是对象链接和嵌入相关模块。 -
odbc32.dll:
odbc32.dll是ODBC数据库查询相关文件。
导入函数、导出函数
导出函数在DLL文件中是最常见的,而EXE文件是提供功能的,很少会有导出函数。
七、PE文件头与分节
.text:包含可执行代码
.rdata:包含程序中全局可访问的只读数据
.data:存储程序中都可以访问的全局数据,有时会显示和存储导入函数信息,如果这个节不存在时,导入函数信息会存储在.rdata节中。
.idata
.edata:有时会显示和存储导出函数信息,如果这个节不存在时,导出函数会存储在.rdata节中
.pdata:只在64位可执行文件中存在,存储异常处理信息
.rsrc:存储可执行文件所需的资源
.reloc:包含用来重定位库文件的信息
网友评论