原理:程序静态分析(Program Static Analysis)是指在不运行代码的情况下,通过词法分析(Lexical analysis)、解析(Parsing)、控制流分析(Control flow)、数据流分析(Data-flow analysis)等技术对程序代码进行扫描,以验证代码是否符合标准、安全性、可靠性、可维护性等指标的一种代码分析技术。该技术可用于验证软件是否存在病毒,一般从以下几个方面进行分析:
字符串检查
在程序未运行的情况下,使用一些工具提取程序字符串,查看是否有可疑信息,以确定是否为病毒,其原理和分析方法如下:
- 定义:字符串或字符串(String)是由数字、字母、下划线等组成的字符串。它主要用于编程、概念描述、函数解释等。
- 补充知识:字符串类似于存储中的字符数组,因此其位中的每个单独元素都是可提取的。
- 常用于:输出信息、URL 地址、文件名、路径信息等。
由于计算机只能识别 0 和 1 的数字,因此通常使用编码技术来解决这一问题,以便使用输入所指定的字符串。
- 定义:编码是将信息从一种形式或格式转换为另一种形式或格式的过程,也称为计算机编程语言的代码。使用预先确定的方法将文本、数字或其他对象编码成数字,或将信息或数据转换成确定的电脉冲信号。编码广泛应用于电子计算机、电视、遥控和通信领域。编码是将信息从一种形式或格式转换成另一种形式或格式的过程。解码是编码的反向过程。
常见的编码技术
ASCII:基于拉丁字母的计算机编码系统,主要用于显示现代英语和其他西欧语言。
Unicode:统一码 Unicode 是计算机科学领域(包括字符集和编码方案)的行业标准,它的创建是为了解决传统字符编码方案的局限性,为每种语言中的每个字符设置统一、唯一的二进制编码,以满足跨语言、跨平台文本转换和处理的要求。
GB 2312:用于汉字处理系统和汉字通信系统之间的信息交换,在中国大陆普遍使用,在新加坡等地也有使用。中国大陆几乎所有的中文系统和国际化软件都支持 GB 2312。
GBK 编码:GBK 编码标准与 GB2312 兼容,包含 21,003 个汉字和 883 个符号,提供 1,894 个字符码位,并将简繁体字符整合到一个数据库中。
要从计算机二进制代码中提取字符串,可以使用以下工具:
Strings
官方网站:https://docs.microsoft.com/zh-cn/sysinternals/downloads/strings
功能: 查找对象文件或二进制文件中的可打印字符串。
缺点:但会忽略上下文格式。它可以搜索:内存地址、CPU 指令序列、数据等。
限制:它只会搜索以终止符结尾的连续三个或更多 ASCII(2 个零端点)或 Unicode(4 个零端点)字符的可打印字符串。
目标:计算机病毒可以利用这一搜索限制,使字符串搜索有用的字符串(例如,在拼接前将所有字符变成两个字符)。
提示: 搜索时更改文件后缀,以避免运行。
举个例子:
- SDL Passolo
网址:SDL PASSOLO 2022 v22.0.74.0 本地软件界面汉化工具中文版
功能:软件本地化工具,可搜索字符串。
缺点:程序体积大 - Resource Hacker
网址:Resource Hacker (angusj.com) - Lingobit Localizer
网址:http://www.lingobit.com/zh/index.html - Resource Tuner
网址:http://www.restuner.com/ - Restorator
网址:https://www.bome.com/products/restorator - Sisulizer
网址:https://www.sisulizer.com/ - 一般搜索到的网址或其他 IP 地址要小心,很可能是病毒,在访问验证时做好防护,避免网页挂马。
PE 检查
大多数感染性病毒都会感染 PE 文件,因为这样可以在 PE 文件运行时运行自己的病毒代码。这样,病毒就能继续感染其他正常文件,从而传播自己。因此,从杀毒软件的角度来看,首先应确定文件是否为 PE 结构,然后再决定使用哪种方法扫描文件。那么,如何判断一个文件是否是 PE 结构的文件呢?
- PE 概念:PE(可移植执行)文件是 Windows 下可执行文件的总称,通常称为 DLL、EXE、OCX、SYS 等。
适用范围:Windows可执行程序和动态链接库。
包含信息:有关Windows如何将文件从硬盘加载到内存中执行的必要信息。
文件是否是 PE 文件与扩展名无关,PE 文件可以有任何扩展名。那么 Windows 如何区分可执行文件和非可执行文件呢?我们调用 LoadLibrary 并传递文件名,系统如何确定该文件是合法的动态链接库?这就是 PE 文件结构的作用所在。
PE 结构
本规范描述了 Windows 系列操作系统下可执行(映像)文件和对象文件的结构。这些文件分别称为可移植可执行文件(PE)和通用对象文件格式(COFF)文件。
https://learn.microsoft.com/en-us/windows/win32/debug/pe-format
常用PE分析工具
PE-bear:https://github.com/hasherezade/pe-bear
PEview(roguekillerpe):https://www.adlice.com/download/roguekillerpe/
PPEE:https://mzrst.com/
CFF Explorer:https://ntcore.com/?page_id=388
PE Explorer:http://www.heaventools.com/overview.htm
查杀技巧
判断PE文件中的程序入口点是否异常
许多病毒在感染PE文件后,通常会在PE文件中添加一部分代码,然后更改PE头中的AddressOfEntryPoint,以定位病毒插入的代码的地址,以便每当文件运行时,病毒代码将首先运行。
一般来说,很多病毒会将插入PE文件的代码放在PE文件的后面,然后在代码的末尾放置一条语句,跳回到原始PE文件的真实的入口点。这使得用户可以在不被注意的情况下执行病毒代码。杀毒软件可以根据PE文件的入口点是否异常来判断文件是否疑似感染病毒。如果一个PE文件的入口点指向的不是这个,那么这个文件就被怀疑感染了病毒。当然,这种主观判断并不总是准确的,但它可以被认为是判断的基础。我们在上一期中提到的启发式扫描使用这些功能来帮助确定未知病毒。
一些病毒还想出了许多方法来改变程序流而不修改入口点,以防止防病毒软件的检测。比如改变原来入口点程序的代码,然后跳转到病毒体。
基于PE结构的特征码提取
特征码的提取是将文件分成不同的部分,然后从每个部分提取一定长度的内容作为特征码。这种方法的问题在于,很多病毒都有相似的特征,比如我们讨论的PE结构,很多PE文件的开头有很大一部分是相同的,所以通过将文件等分来提取特征并不理想。这就是我们考虑使用PE结构从每个部分中提取一定量的内容作为特征代码,或者使用各种关键点作为参考来查找附近的特征代码。这样,就可以大大避免上述等分文件提取特征码方法的缺点,增强不同病毒特征码的变异性。例如,对于CIH病毒的检测,检查PE报头附近和入口点附近的特征。
Demo
CIH病毒的鉴定
有三个特点:第一个是如果PE头的第一个字节是非零的,它很可能被感染,CIH本身使用它来确定这一点。
但是,这个特性并不总是可靠的,因为没有感染CIH病毒的程序也可能因为各种原因在这个区域变成非零,所以增加了两个额外的代码特性。
CIH会将代码入口点改为指向自身,基于此,我们取了入口点偏移量特性,并使用siddt动作和在其后面挂起文件系统钩子的两个动作作为特性,使其更加可靠。
当然,所有3个特征都集中在病毒头中,如果我们想更可靠并避免家族内的误报,我们还可以在病毒体后面添加一些代码。
链接库和函数
当链接库和函数可以为病毒分析带来如此多的有用信息时,它们是如何成为计算机病毒的目标的?
针对原因:病毒利用PE结构中的导入表,将计算机病毒需要的链接库、函数等含有恶意内容的东西导入到计算机内存中,并调用动态链接库中的函数(通过链接库将计算机病毒代码链接到动态链接库中),做好准备工作。
- 引导性问题:什么是链接,有哪些链接方法?
链接解决的问题是将我们自己的代码与别人编写的库整合在一起。 - 静态链接:这是 Windows 平台上最不常用的链接代码库的方法,但在 UNIX 和 Linux 程序中较为常见。
- 内容:在生成可执行文件时(链接时间),所有所需功能的二进制代码都包含在可执行文件中。因此,链接器需要知道参与链接的目标文件需要哪些功能,以及每个目标文件中都有哪些功能,这样链接器才能知道目标文件所需的每个功能是否都能正确链接。
如果目标文件所需的函数在参与的目标文件中找不到,链接器就会报错。
目标文件中有两个重要接口可以提供这些信息:一个是符号表,另一个是重定位表。
当一个库被静态链接到一个可执行文件时,该库中的所有代码都会被复制到可执行文件中。 - 优点:发布时不需要依赖库,即不需要发布更多的库,应用程序可以独立执行。
- 缺点:但 PE 文件头中没有链接库的信息。这种方法会导致可执行文件变大,占用更多内存空间;如果静态库更新,所有可执行文件都必须重新链接以使用新的静态库。计算机病毒通常不会使用这种链接方法来减小病毒的体积。
- 链接时间:在生成可执行文件时(在编译期间完成链接)。
动态链接:动态链接是最常见的,也是恶意代码分析师最关心的。动态链接信息被写入导入表中,并且当代码库被动态链接时,主机操作系统将在加载程序时搜索所需的代码库。
- 特点:在编译时不直接复制可执行代码,而是通过记录一系列符号和参数,在程序运行或加载时将这些信息传递给操作系统。操作系统负责将所需的动态链接库加载到内存中,然后程序在运行到指定代码时,去共享执行已经加载到内存中的动态链接库可执行代码,最终达到运行时连接的目的。
- 优点:多个程序可以共享同一段代码,而无需在磁盘上存储多个副本。
- 缺点:由于它是在运行时加载的,可能会影响程序的预执行性能。
- 链接时间:程序运行或加载时。
- 当应用程序调用LoadLibrary或LoadLibraryEx函数时,系统尝试以加载时动态链接搜索顺序定位DLL(请参阅加载时动态链接);如果找到,系统将DLL模块映射到进程的虚拟地址空间并增加引用计数。如果调用LoadLibrary或LoadLibraryEx时指定的DLL代码已映射到调用进程的虚拟地址空间,则该函数仅返回DLL的句柄,并增加DLL引用计数。注意:两个具有相同文件名和扩展名但不在同一目录中的DLL不被视为同一DLL。
注意事项:虽然运行时链接在合法程序中并不流行,但它通常用于恶意代码,特别是当恶意代码被大小写或混淆时。由于脱壳或混淆破坏了计算机病毒的导入表,没有它Windows系统将无法帮助病毒完成其链接工作,因此需要使用运行时链接作为一种方法,在运行时将所需的链接库和函数加载到内存空间中。
- 特点:仅在需要时才链接。
- 优点:使用运行时链接的可执行程序只在需要某个功能时链接到程序库,而不是像动态链接模式那样在程序启动时链接到程序库。
- 缺点:需要使用相关函数才能调用。
- 链接时间:遇到函数调用时。
基于链接的分析:
PE文件头列出了计算机病毒代码所需的所有动态链接库和函数。
动态链接库和函数名可以用来分析计算机病毒的功能。
有关常用动态链接库的信息。
常用分析工具:
Dependency Walker:包含在某些版本的 Visual Studio 和其他 Microsoft 开发包中,用于支持列出可执行文件的动态链接功能。
病毒的常见功能:
- LoadLibrary:将动态链接库从硬盘动态载入计算机病毒内存空间。
- GetProcAddress:查找 DLL 中相应函数的地址。
- URLDownloadToFile():将从互联网下载文件。
导入功能:
PE文件头中还包含了可执行文件所使用的具体函数的信息,由于只能在导入函数中看到函数的名称,为了了解函数的参数、函数和用法,可以在Microsoft的MSDN中找到这些信息,当然也可以使用搜索引擎。
导出函数:
与导入函数类似,DLL和EXE的导出函数用于与其他程序和代码交互。
通常,DLL将实现一个或多个函数,然后导出它们,以便其他程序可以导入和使用它们。
PE文件还包含有关在文件中导出哪些函数的信息。
辅助杀伤探测
杀毒软件、恶意软件查杀平台和恶意软件分析平台是常用的辅助查杀工具,它们具有以下优势:
- 拥有病毒特征数据库:一个包含已知病毒的各种“类似物”的数据库,根据这些专有特征,软件可以被识别为病毒,主要是已知病毒。
- 病毒的针对性:计算机病毒的编写者可以很容易地修改其代码,以改变这些病毒的各种特性,通常使用以下技术来避免反病毒软件的检测。
多态技术:语义不变性、语法混淆、增加逆向分析难度。
变形技术:功能不变,语义模糊,增加逆向分析的难度。
单向执行技术:无法破译的数字猜测、哈希值,增加了逆向分析的难度。
垃圾指令:使用大量对分析无用的指令,增加反向分析的难度。
- 有启发式规则:因为特征库中没有病毒特征,杀毒软件没有查杀这些未知病毒,它是根据已知病毒的分析经验总结出一些规则来识别软件是否有病毒,主要针对未知病毒。
- 病毒用于:开发新型病毒,不使用杀毒软件也能知道其特征和行为,已避免杀毒软件的检测。
当本地没有杀毒软件,流量不存在限制等很多情况下,可以通过输入文件计算Hash值,对一些网站使用Hash值进行查杀,原理和常见的查询平台如下:
原理:哈希值是一种计算文件唯一标识符的独特算法(哈希函数),不同文件的哈希值不同,影响因素可能是文件大小、内容、创建日期等。…… 计算哈希值,利用这些特征了解文件是否被破坏或修改,也可用于在查询平台中查询分析结果。
计算工具:
Hasher Pro:http://www.den4b.com/
HashOnClick:https://www.2brightsparks.com
Hash Generator Pro:http://insili.co.uk/
MD5 File Hasher Pro:http://www.digital-tronic.com/md5-file-hasher/
Advanced Hash Calculator:http://www.filesweb.com/
Virus Toal:https://www.virustotal.com/gui/home/search
道高一尺,魔高一丈
病毒通常使用脱壳和混淆技术来避免被静态分析技术分析
- 目的:避免被防病毒软件检测到,并使病毒分析更加困难
混淆:隐藏有关计算机病毒程序的信息
常用工具:
DotFuscator:https://www.preemptive.com/
DashO Pro:https://www.preemptive.com/
ProGuard:https://www.guardsquare.com/en/proguard
Virbox Protector:https://shell.virbox.com/
Code Virtualizer:https://www.oreans.com/
Skater .NET obfuscator:http://www.rustemsoft.com/ - 加壳:压缩计算机病毒文件大小,使用加密技术保护病毒核心代码
常用工具:
UPXShell:http://upxshell.sourceforge.net/download.html
DRMsoft EncryptEXE:http://www.drmsoft.com/
Vmproject:https://vmpsoft.com/
针对病毒的保护策略,通常借助加壳和反混淆技术进行分析
- 脱壳:脱壳是指清除软件外壳,有手动脱壳和自动脱壳两种方式
常用工具:
QuickUnpack:http://qunpack.ahteam.org/?p=458#more-458
frida-unpack:https://github.com/WeiEast/frida-unpack
de4dot:https://github.com/0xd4d/de4dot
drizzleDumper:https://github.com/DrizzleRisk/drizzleDumper
de4js:https://github.com/lelinhtinh/de4js
wxappUnpacker:https://github.com/gzh4213/wxappUnpacker
Android_unpacker:https://github.com/CheckPointSW/android_unpacker
unpacker:https://github.com/malwaremusings/unpacker - 反混淆:使代码恢复到美观、高可读性的状态
常用工具:
simplify:https://github.com/CalebFenton/simplify
de4dot:https://github.com/0xd4d/de4dot
flare-floss:https://github.com/fireeye/flare-floss
Tigress_protection:https://github.com/JonathanSalwan/Tigress_protection
VTIL-Core:https://github.com/vtil-project/VTIL-Core
dex-oracle:https://github.com/CalebFenton/dex-oracle
malware-jail:https://github.com/HynekPetrak/malware-jail
de4js:https://github.com/lelinhtinh/de4js
dnpatch:https://github.com/ioncodes/dnpatch
etacsufbo:https://github.com/ChiChou/etacsufbo
samsung-firmware-magic:https://github.com/chrivers/samsung-firmware-magic
JRemapper:https://github.com/Col-E/JRemapper
暂无评论内容