发布时间:2025-12-09 16:29:13 浏览次数:3
基于病毒特征码的检测方法,是目前反病毒软件最常用的检测技术。经过长时间的收集与积累,反病毒软件建立了庞大的已知病毒的特征数据库。在对可疑软件进行检测时,会从特征数据库中匹配已有特征。这种方法相对比较准确、快速,而且可以很容易地通过快速分析,结合新的模板,添加新的病毒文件特征。
特征码可以是一个简单的字符串或者代码字节序列,也可以是包含了已知恶意文件各项特点的模板
基于特征码的检测优点是可以达到100%的检测正确率,没有误报,但缺点是检测依赖于特征库,无法检测出未知的恶意程序
启发式检测主要是为了弥补特征码检测的不足,可以在反病毒厂商未发现某个恶意软件和发布恶意软件特征码之前,阻止未知恶意软件对用户的侵害,防止造成不必要的损失
启发式检测可分为静态与动态两种方式:
通常,反病毒软件收集一些已知开发者签名的应用软件、系统组件等,对其相应文件使用MD5、SHA-2等哈希算法进行计算,并对计算结果进行保存
云查杀技术是在云计算的基础上发展起来的,其实质是将病毒库由客户端移至服务器,基至是将某些检测过程也移植到服务器上。云查杀的原理是将在客户端提取特征上传到云端,或者将被扫描文件上传至云端,在云端通过大量服务器对被扫描软件进行检测,并将结果返回给客户端。在云端的检测过程中,仍然综合地使用了一些在本地检测中使用的技术,云查杀的优势是,病毒库处于云端,弥补了由于反病毒软件没有及时更新特征库、查杀策略,导致不能查杀最新病毒的缺陷。同时,突破了单机检测时的计算资源限制
在木马的实现过程中,经常要用到文件系统路径、文件名称、事件名称、注册表项等敏感项,如果直接使用字符串常量表示这些事项,会导致这些敏感字符串出现在可执行文件的数据段中。因此,必须对敏感字符串进行变形。变形的主要思想是将程序里面的字符串常量转换为指令的操作码,使程序不再具有可显示字符串
通常,木马程序会操作一些系统路径下的文件或文件夹,这不可避免地需要使用系统文件夹和文件路径的名称作为字符串常量。针对此类查杀,开发过程中可以手工构造字符串,不再使用字符串常量,而是将字符串常量拆分成一个一个的字节存在一个字符数组中
Dropper 是个比较特殊的可执行程序,它一般执行完释放和植入任务后就会将自身删除掉,不会在目标系统留下痕迹。但木马不可能在其外部再另外附带各种配置信息和需要释放的木马常驻组件,这些内容往往需要被附加到 Dropper 对应的可执行文件中
根据这类信息附加到Dropper中的位置,可以分为以下方式
在可Dropper文件的尾部添加需要包含的内容,这种方式不修改PE结构,在PE文件后面添加的内容,常常被称为附加数据
利用可执行文件的结构,添加需要包含的内容,如使用PE文件资源保存要添加的内容、使用PE文件数据段保存要添加的内容等方式
通常,木马隐藏导入表需要使用动态调用的方式使用系统API函数,即先使用 LoadLibray 了函数得到 API 所在模块的句柄,再使用 GetprocAddress 函数得到要调用 API 函数的地址,在程序中直接使用这个函数地址来替代该 API 函数的静态调用。更进一步的做法是,木马程序会自行实现 LoadLibrary 和 GetprocAddress 两个函数。这样处理能很好地隐藏导入表,但造成了一定的代码混乱,每次动态获取该函数的时候,都需要确保该函数所在的模块句柄是否有效,这在一些较为复杂的逻辑中,会经常因模块句柄未获取或者模块未加载而导致函数地址获取失败,而多次对 DLL 模块的加载,则会导致 DLL 的引用计数增加,使 DLL 不能完整释放,浪费系统资源
泛型(Generic)是现代高级程序设计语言的一种重要特性,是指编写的代码可以在不同的数据类型上重用,允许程序开发人员在静态类型的程序设计语言中,编写代码时预先定义数据类型可变,而在具体调用时,可以手工或者通过编译器确定具体对应的数据类型。代码中函数或者变量类型参数化是提高代码复用性和提高软件开发工作效率的一种重要方法
在 C++ 语言中称泛型为模板(template),模板由函数模板和类模板两部分组成,使用可变类型作为参数的函数叫做函数模板,而具有可变类型数据成员的类叫做类模板
GetProcAddressEx 的实现思路时间:获取并使用全局变量记录主要模块的地址,如 kernel32.dll、Shell32.dll 的模块地址,然后从 PE 格式得到 DLL 的导入表,使用 API 名称的哈希值从导入表中找到具体的 API 地址
反病毒软件的查杀是非常费时的一个过程,如果查杀对系统产生大的影响,会影响用户的体验。因此,査杀不可能在单个文件的处理上无限制地消耗检测时间。针对这二个特点,最简单的动态免杀方式是消耗虚拟执行的时间。在木马核心代码被执行之前,使得反病毒软件的模拟环境花费大量的时间执行无用的代码,从而使得反病毒软件没有时间再检测后续的敏感代码
时间延迟的方式有很多。在反病毒虚拟机发展的初期,简单地使用 sleep 函数就可绕过动态查杀。目前大多数反病毒软件已经对该函数做了特殊处理,遇到此类情况会立即跳过
反病毒软件动态査杀时,它的模拟器或者沙盒资源是有限的,不可能虚拟全部的真实环境。针对这个局限性,木马在核心功能之前,请求使用大量系统资源(如内存等),就有可能迫使反病毒软件模拟器或沙盒无法虚拟执行核心的木马功能,从而绕过动态查杀。同时,这种资源的需求需要有一定的尺度,不能影响木马在实际环境中执行
需要注意的是,穿透模拟器或沙盒的代码中不能使用敏感的 API,以防止反病毒软件对绕过动态查杀的代码进行查杀
一般情况下,反病毒软件的虚拟环境不会给予被模拟执行的程序访问网络的权限。例如,当在反病毒软件的虚拟环境中运行的代码需要访问 Web 页面时,虚拟环境仅仅会提供一个自己产生的页面,如果被扫描程序访问一个不存在的域名,在真实环境下,该访问会失败;但在反病毒软件的模拟环境中,该访司依然有效,这是因为反病毒软件提供了自己产生的页面
反病毒软件在动态查杀时,会模拟执行被检查的程序。在模拟执行过程中,木马程序进程由反病毒软件创建,其父进程是反病毒软件的组件,故通过分析木马的父进程可以检测是否运行在模拟环境中。具体的,判断父进程是否是一些常见程序,如 explorer.exe、cmd.exe 等,或是预定的特定程序等;如果是,表示运行环境正常,可以启动真正的木马程序;否则,则当前进程可能运行在虚拟环境,木马代码不执行并退出,从而绕过反病毒软件的査杀
随着反病毒软件对这一漏洞的修复,无法仅依靠父进程来判断木马是否运行在反病毒软件的虚拟环境中。但该方法可以略作改变,以绕过反病毒软件查杀。通常,反病毒软件只会将被查杀程序运行一次,若程序多次嵌套运行,反病毒软件的虚拟环境会因为资源受限等原因,放弃整个分析过程。此时,再执行真正的木马代码,则能顺利突破反病毒软件的动态査杀
调用 AllocateUserPhysicalPagesNuma() 函数进行环境判断。该函数在反病毒软件的虚拟环境中执行时,返回为 FALSE ,而在真实系统环境中返回值为 TRUE
木马植入后通常会掌握了目标机器上的某些信息,如目标机器的用户名、安装的软件等,基于这些信息进行一些特定的操作,可以更容易地绕过反病毒软件的查杀。例如,如果已知上的用户名,则可以在该用户目录下创建并写入一个文件。这一操作在真是系统环境中能够正常执行,但是在反病毒软件的虚拟环境中,则会执行失败
代码注入是指将特定的代码段加载到目标进程中去执行。通常,木马程序将一个标准的 DLL 文件注入目标进程中,也可以是将一段代码和数据写入到目标进程中,需要注意的是这段注入的代码需要是地址无关代码(position-independent code),即该段代码在任意内存可以执行,不受绝对地址的影响,也可以是根据写入的目标进程内存重定位的代码
代码注入要解决两个问题:
- 如何将代码和数据写入到目标进程的内存中
- 如何使得写入目标进程的代码被执行
Win32/Gapz 木马利用共享内存注入目标进程,修改目标进程(Explorer.exe)所创建窗口的处理过程;向目标窗口发送消息,使得被修改后的窗口处理过程得以执行,进而使得木马的代码能够顺利在目标进程中执行。该方法很好地完成了向系统关键进程Explorer.exe的代码注入,还能绕过反病毒软件的检测
傀儡进程的方法是指创建一个处于系统白名单或反病毒软件白名单中的进程,使用木马的可执行文件(EXE)的内存镜像替换进程原始主模块的内存镜像,并代替进程原始主模块执行。由于在替换之前,系统已经完成了对进程信息的初始化,而且替换过程只是替换镜像内容,没有修改和影响保存该进程信息的相关数据结构,因此反病毒软件得到的信息是一个正常系统中正常的信息
傀儡进程的方法可以隐藏木马进程,使任务管理器、进程查看工具和反病毒软件看到的是一个正常的系统进程。同时,也能够欺骗反病毒软件,绕过反病毒软件的拦截和监控
傀儡进程的主要思路是以阻塞的方式启动一个系统进程,如 svchost.exe、services.exe 等。然后将父进程主模块的代码替换成木马代码,对替换进去的代码根据目标进程主模块基址进行重定位,再恢复被阻塞进程,使得替换后的木马代码得以执行,具体执行过程如下:
Windows 应用程序启动时,一般需要加载多个DLL。Windows 镜像加载器可以通过 DLL 的完整路径或者使用 manifest 文件来加载指定 DLL。如果指明了 DLL 路径,Windows 镜像加载器会根据一定的顺序从不同目录搜索加载 DLL 文件
DLL 劫持的方法,是针对 Windows 镜像加载器加载 DLL 时的搜索顺序有先后,将 DLL 置于应用程序相同的目录或系统加载器搜索路径上优先的目录中,使得木马 DLL 替代正常 DLL 被加载,从而达到运行木马的方法。该方法不需要额外进程操作,如打开进程、向远程进程写入数据等,只需要将木马 DLL 写入到特定位置(一般是 EXE 文件的目录),等待应用程序启动时加载自己