病毒如何隐藏自身及应对策略详解

分类: 365bet国内 发布时间: 2025-07-10 01:35:33 作者: admin

作者:非著名, 纳税人,转载于:http://www.bypassav.online/hide-process/

一、R3思路1、将进程注册为系统服务(针对 win9x 系统)win9x(win95、win98等)系列的操作系统中,系统进程列表不能看到任何系统服务进程,因此只需要将病毒自身进程注册为系统服务,便可以从系统进程列表中消失。利用的是 RegisterServiceProcess 函数,NT架构下用不了。

2、Hook 系统遍历进程的 API一旦系统调用扫描进程列表的API,监控其参数,若包含到自身进程名 or PID,可直接 return 使其本次调用失败。Ring3 or Ring0 原理相同。

3、DLL注入主动注入DLL:比如将恶意代码写为 DLL 文件,通过远线程注入的方式将 DLL 主动注入到其他进程实现隐藏;关于DLL注入的手段搜索本站文章(主要是忘了URL (╯—﹏—)╯┷━━━┷)。

被动注入DLL:或者可以劫持某些常见进程的DLL 文件,被动加载实现隐藏,但可能导致进程崩溃,如果用被动的手段,推荐是用 procmon 看一下这个进程,哪些 DLL 是执行时尝试进行了加载,但是在电脑上又没找到这个 DLL 文件,此时将恶意DLL 改名放到对应路径即可。

4、代码注入思路同远线程 DLL 注入,直接将代码拷贝到远线程内存空间执行。

二、R0思路内核级木马的特点:无进程、无DLL、无启动项、集多种rootkit技术特征、有多种独立功能。内核级木马在进程隐藏上,不断发展了好多方法,但是从根本上来说,主要是通过挂钩内核函数、修改内核返回信息(文件链表或句柄表)来实现进程隐藏的。主要的有内核挂钩、DKOM技术、抹掉进程句柄等。

1、内核挂钩SSDT HookSSDT 实现了从用户态函数到内核态函数的引导。当挂钩了SSDT之后,进程枚举、查询类函数(多为挂钩 ZwQuerySystemInformation)对应的内核服务函数在 SSDT 表中的地址被修改。

当产生进程枚举的调用时,就会运行修改后的函数,接着在修改后的函数中首先获取完整的进程信息,然后查找需要隐藏的进程信息,对其进行过滤,再把处理后的结果返回给上层,这样就可以使最终的用户层的用户看不到隐藏后的进程。

IDT Hook挂钩 IDT 中断调度表(Interrupt Dispatch Table),在windows 系统中,用户层的 API 函数都是通过软中断进入内核的。当软中断出现的时候,系统就会从 IDT 表中调用相应的中断处理例程,对应 INT 2E 中断的服务处理函数为 KiSystemService()。该函数又会调用 SSDT 表中的函数实现最终的调用。因此挂钩 IDT 修改中断响应过程,就可以实现对进程信息的监视、修改,达到隐藏的目的。

2、DKOMDKOM(Direct Kernel ObjectManipulation, 直接内核对象操作)是另外一种实现进程隐藏的机制。跟之前提到的所有钩子相比,隐藏性更好,更不容易被检测到。该机制跟进程的一个数据结构 EPROCESS 相关。

在 Windows 中,使用双向链表的典型示例就是进程和线程的数据结构。每个进程都有 EPROCESS 结构体,其中的 ActiveProcessLinks 成员是一个 LIST_ENTRY 结构,所有进程的 EPROCESS 结构被 LIST_ENTRY 链接成一个双向链表。因此通过该结构,可以很容易地遍历该链表,找到需要的 LIST_ENTRY 结构。

但是 EPROCESS 结构在内存中的位置,在几乎每个 OS 都不同,如何寻找呢?好在通过 PsGetCurrentProcess() 函数可以始终找到指向当前运行的进程的指针,进而找到当前进程的 EPROCESS 结构。然后以当前进程指针为终止判断条件,遍历 EPROCESS 双向链表,就一定可以定位到需要进行隐藏的进程。

当找到了需要隐藏的进程的结构之后,通过修改其 LIST_ENTRY 中的 Flink 和 Blink 的值,将待隐藏的进程的前一个 LIST_ENTRY结构(Previous Entry)的 Flink 指针指向下一个 LIST_ENTRY结构(Next Entry),而下一个结构的 Blink 指向前一个结构。另外,为了防止因指针指向无效内存区域导致系统崩溃,将待摘除的进程的 LIST_ENTRY 结构中的 Flink 和 Blink 指向自身。这样就完成了脱链,系统就无法通过这种方法列举被隐藏进程的信息。

摘除进程链表中的被隐藏进程的结构后,并不会影响进程的调度执行,这是由Windows是基于线程来实行任务调度的。

(简单总结:在Windows操作系统中,系统会为每一个活动进程创建一个进程对象EPROCESS,为进程中的每一个线程创建一个线程对象 ETHREAD。在 EPROCESS 进程结构中有个双向链表 LIST_ENTRY,LIST_ENTRY结构中有FLINK 和BLINK 两个成员指针,分别指向当前进程的前驱进程和后继进程。如果要隐藏当前进程,只需把当前进程的前驱进程的BLINK 修改为当前进程的BLINK,再把当前进程的后继进程的FLINK修改为当前进程的FLINK。)

3、抹掉进程句柄有两种常用的抹掉进程句柄的做法。

抹掉 CSRSS 句柄表中的进程句柄一个进程在创建的时候,系统会为其分配一个句柄表。句柄表主要供内核对象调用。实际上,其是一个结构体数组,数组中的每个元素包括:

① 指向一个内核对象的指针

② 访问掩码

③ 与对象句柄的继承相关的一些标志

对于进程对象来说,其对象指针也放在句柄表中,通过遍历 CSRSS 句柄表,可以根据需要过滤的特定进程的信息,实现进程的隐藏。

抹掉 PspCidTable 中的进程句柄PspCidTable 是一个特殊的句柄表,跟普通的句柄表相比,主要区别在于该句柄表中存放的是系统中的进程对象体 EPROCESS、线程对象体 ETHREAD 等。因而通过该句柄表可以遍历系统中的所有进程(比如 IceSword工具枚举进程的原理)。但 该句柄表并未导出,因而使用该方法隐藏进程需要自己定位 PspCidTable 的地址。

一般是通过 PsLookupProcessByProcessId() 进行搜索定位,定位之后,可以从中过滤掉待隐藏进程的句柄,需要注意的是若被隐藏的进程退出时,需要重新恢复原先的进程对象(恢复原先的表的结构),否则,当调用 ExDestroyHandle() 销毁句柄,若遇到不存在的句柄(内核中访问未知的内存地址),就会导致 BSOD——蓝屏死机。

三、杀软的应对策略由于大多是通过 Hook 的操作,因此杀软在驱动级进行了监控 hook 的操作时,可以成功防御。

(每一种检测方法,对应的都是一种隐藏方式,看链接-3)

参考进程隐藏的各种方法 以及分析比较以及实现链接

https://www.cnblogs.com/lvdongjie/p/4794872.html

什么是内核级木马?

https://www.freebuf.com/articles/system/209735.html

检测隐藏进程

https://blog.csdn.net/liuhaidon1992/article/details/104018730

上一篇: 1986德国世界杯阵容,1986年世界杯决赛德国队阵容 下一篇: 大唐无双阵营塔怎么打

相关文章

野生松鼠如何训练

野生松鼠如何训练

铛字的意思解释,铛的读音怎么读,部首,笔顺,笔画

铛字的意思解释,铛的读音怎么读,部首,笔顺,笔画

SEO优化哪家便宜?选择最具性价比的SEO服务,助力网站高效排名!

SEO优化哪家便宜?选择最具性价比的SEO服务,助力网站高效排名!

道教符咒介绍,符脚在符中的位置及作用,几种常见的符脚介绍

道教符咒介绍,符脚在符中的位置及作用,几种常见的符脚介绍

魔兽怀旧服:盗贼最强开锁攻略!开锁技能4小时快速冲1-300

魔兽怀旧服:盗贼最强开锁攻略!开锁技能4小时快速冲1-300

苹果电脑如何退出邮箱登录账号

苹果电脑如何退出邮箱登录账号