首页
社区
课程
招聘
[求助]什么是可疑线程?
发表于: 2009-9-17 10:31 4522

[求助]什么是可疑线程?

2009-9-17 10:31
4522
最近在了解RKU相关模块的实现细节。
对于其中的Stealth Code 模块有一点想请教各位高手:
    在检测分内存时,RKU用到的众多方法之一是:检测可疑线程。而据我的分析,RKU对于可疑线程的定义是 “如果一个线程 在系统进程内部,却本身并不是系统线程,则定义此线程为可疑线程。”针对于系统线程、系统进程都有特定的判定标准。
    可是,为什么我按照这种思路去做,却始终检测不出“可疑线程”?此时,RKU本身已经检测出7个可疑线程。
    请各位高手多多指教。非常感谢!

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
2
http://hi.baidu.com/%5Fachillis/blog/item/77a35bfa1de09f6d034f56a0.html
2009-9-17 11:05
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
非常感谢achillis如此快速的回复。
    我看您提供这个网页提供的方法是针对ExAllocatePool、ExAllocatePoolWithTag、KeDelayExecutionThread进行的检测,来检测因为这些函数被hook而产生的无主的可执行代码,据我对RKU的分析,这只是他所用的众多方法中的一种,而我在问题里面所说的那个疑问是针对Stealth Code模块的最后一种方法。
    据我的理解,最后一种方法的思路如下:
    因为Windows内核模块一般都是由任务管理器中名为“System”的系统进程加载的,故而在DriverEntry函数执行时所对应的进程即为系统进程;
    另外,获取 RKU专门检测可疑线程的函数对应的线程。已知:若一个线程的teb为null,则该线程为系统线程。 若所获取的线程不符合上述条件,则该线程即为非系统线程。
    若一个非系统线程出现在系统进程内部,则定义该线程为可疑线程,并输出相应信息。
    具体汇编代码如下:
push    ebp
push    edi
call    ds:IoThreadToProcess
mov     ecx, g_Teb_offset_in_kthread
mov     ebp, eax
xor     eax, eax
cmp     [ecx+edi], eax  ; 判断teb的值是否为0,若为0 ,则说明该线程为系统线程
mov     ebx, 250h
setnz   al
xor     ecx, ecx
cmp     ebp, g_System_PEPROCESS
setz    cl
test    eax, ecx
jz      short loc_122C4

mov     eax, [esi]
imul    eax, 0B58h
add     eax, esi
lea     ecx, [eax+74Ch]
mov     edx, offset s->SuspiciousThread ; "suspicious thread"
mov     dword ptr [eax+130h], 3
mov     [eax+0FCh], edi
mov     [eax+104h], ebx
call    rk_RtlCopyWString
inc     dword ptr [esi]
上面的文字阐述是我自己对这个方法的理解,不知道对不对,请多多指教!
2009-9-17 20:46
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
4
你说的算是一种情况吧,我并没有详细分析RKU的检测方法,我文章中提到的检测线程StartAddress也算一种,记录那三个函数的返回地址并判断也算一种,都是黑盒来的~
2009-9-17 21:47
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
哦,是,RKU的Stealth Code模块确实用了那两种方法,但是,我就很奇怪,为什么我说的那种方法,执行结果与RKU的不一致呢?是不是我理解错了?
2009-9-18 10:06
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
还有,我想请问下achillis,您说的那个检测线程StartAddress方法是不是枚举出所有进程中的线程,判断每个线程是不是在制定模块内?
2009-9-18 10:12
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
7
是的~123456
2009-9-18 17:02
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
不好意思,achillis,还想请教您一个问题:为什么我按照你说的那种根据线程StartAddress判断其是否在指定的模块空间内时,应该被指明为“可疑线程”的线程结果却是正常的,反而正常的却被报错?
                        eThread = (PETHREAD)_obj;
                        KdPrint(("Thread: %X  , StartAddress: %X \n",eThread , *(ULONG *)((ULONG)eThread + 0x224)));//StartAddress地址
                        if (TheAddressIsInKernelPEBody(rCon, *(ULONG *)((ULONG)eThread + 0x224)))
                        {
                                KdPrint(("Suspicious Thread \n"));
                        }
多谢指教!
2009-9-25 11:34
0
游客
登录 | 注册 方可回帖
返回
//