找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 201|回复: 0

HOOK SwapContext来检测隐藏进程

[复制链接]

210

主题

371

回帖

0

积分

管理员

积分
0
发表于 2013-10-12 23:15:51 | 显示全部楼层 |阅读模式


最近一直在找一些关于查找隐藏进程的资料,比较靠谱的方法有以下几种
   
1.通过遍历系统的活动线程链表,在WIN2K下,系统调度线程是通过三个链表KiWaitInListHead,KiWaitOutListHead和         KiDispatcherReadyListHead来完成的。其中前两个链表是处于等待状态的线程的链表(也就是线程由于在线程函数中调用了XXXWait函数而处于等待状态),第三个链表KiDispatcherReadyListHead,是准备好了等待执行的线程的链表。要遍历这三个链表,那么必须得到这三个链表在内核中的地址。很遗憾,这三个链表都是系统未导出的变量,那么要么通过硬编码的方式在自己的程序中给这三个变量赋予常量;这样虽然可行,但是写出来的程序不具备可移植性,因为在不同的SP版本下这三个变量的地址是有可能改变的!!!
  还有得到这三个变量的办法就是借助WINDBG对内核函数进行逆向分析,来从汇编代中利用类似反病毒常用的“特征码”检索的技术来查找这三个变量的地址。具体的代码可以GOOGLE之,关键字KiDispatcherReadyListHead,Detect Hidder Process 可以查找到一篇俄罗斯人写的关于查找隐藏进程的办法。
  然而XP系统之下,系统调度线程指通过两个链表KiWaitListHead和 KiDispatcherReadyListHead。那个俄罗斯大牛也给出了查找这两个链表地址的代码,但是不知道为什么我实践之之后发现,在XP系统下只可以得到KiWaitListHead的地址,利用这个地址可以遍历在这个链表上的线程的进程
     算法是这样的
     PLIST_ENTRY KiWaitListHead;
     PLIST_ENTRY temp;
     PEPROCESS   process;
     temp = KiWaitListHead->Flink;
     while(KiWaitListHead != temp)
     {
        process = (PEPROCESS)((ULONG)temp+EPROCESS_OFFSET_IN_ETHREAD);
        //得到了EPROCESS的地址,就可以读取进程的ID和映像文件路径
        id = *(DWORD*)((ULONG)process+PROCESS_ID_OFFSET_IN_EPROCESS);
         temp = temp->Flink;
     }
    但是很遗憾,KiDispatcherReadyList的地址却没有把法获得!!
    所以这个办法也就放弃了

2、HOOK SwapContext
   CONTEXT被翻译为上下文,线程再迁换的时候,必须也要切换线程运行的上下文,SwapContext这个函数使用汇编代码完成的,其中esi寄存器中传入的是要被换入的线程的ETHEAD结构体的地址,edi寄存器是要还出的线程的ETHREAD结构体的地址。得到了ETHREAD结构体地址,就可以通过EPROCESS结构体在ETHREAD中的偏移地址算出该线程所属进程的EPROCESS结构体的地址!
   所有的进程,只要要执行就必定有线程!线程上下文的交换必定通过这个函数,那么可以HOOK这个函数,对传入函数的保存在esi的参数读取分析之后,再调用原SwapContext进行线程上下文的交换。
   有关怎样hook swapcontext的代码和方法网上有介绍,GOOGLE之,我的驱动中就照办了一位大牛的代码。关键字:HOOK SWAPCONTEXT
   绿盟有个叫TombKeeper的在一份介绍检测ROOTKIT的技术报告中称,这种HOOK SWAPCONTEXT的方发是检测隐藏进程的终极方法,所谓终极,是指能够检测出目前大部分的ROOTKIT(不管是HOOK API还是直接修改内存,也就是修改PsActiveListHead活动进程链表)。但是TOMBKEEPER却说这种方法不稳定,容易引发系统崩溃。但是我在虚拟机上试验感觉没有这么夸张,没有什么异常反应。再说一句,在TOMBKEEPER的技术报告里,他说遍历KiDispatcherListHead的方法在XP下不可行!!!
   关于这种方还有一种需要补充的就是,这种方法得到的进程,只能是在某一段事件内其线程的上下文被交换的进程。如果某个进程,其线程的上下文一直没有被交换过,也就是说这个进程的线程一直没有参加过线程调度,那么将不会检测到这个进程的存在。但这好像也是不可能的

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

果子博客
扫码关注微信公众号

Archiver|手机版|小黑屋|风叶林

GMT+8, 2026-2-1 04:42 , Processed in 0.073472 second(s), 20 queries .

Powered by 风叶林

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表