您现在的位置: 中国教师站 >> 教师关注 >> 电脑技术 >> 网络安全 >> 黑客攻防 >> 正文

Google
黑客技巧之安全稳定的实现进线程监控(1)
作者:佚名 文章来源:不详 点击数: 更新时间:2007-4-20 21:48:43
    虚拟主机 域名注册
    

用PsSetCreateProcessNotifyRoutine,PsSetCreateThreadNotifyRoutine来进行进程线程监控我想大家已经都非常熟练了。前一段时间看到网上有人在研究监视远线程的文章,比较有意思。就写代码玩一玩。这之中就出现了一些问题,比方说直接用sinister的代码的话,是不能动态卸载的,因为他在安装了进线程监视函数后没有进行清除动作,造成在动态卸载时蓝屏。

BUGCHECK为0x000000ce,错误码为:

DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS

很显然,在驱动退出后,一些进线程操作仍然在访问原来的地址,造成出错。在XP后,微软给出了一个函数PsRemoveCreateThreadNotifyRoutine用来清除线程监视函数(清除进程监视的就是PsSetCreateProcessNotifyRoutine)。我一直奇怪ICESWORD在Windows2000中是怎么做到进线程监视的。后来才发现,在运行icesword后释放出一个detport.sys文件,然后一直在系统中存在着没有卸载掉。只是把它隐藏了而已。这不是个好消息,难道我为了测试一个驱动,测试一次就得重启一次吗?呵呵,肯定不是啊,所以想办法搞定它。

我们来看一下进线程监视在底层是如何实现的,在Windows2000源代码中先找到创建线程的函数实现:

//////////////////////////////////////////////////////////////////////////////////////////

//

//   \win2k\private\ntos\ps\create.h

//

//////////////////////////////////////////////////////////////////////////////////////////

NTSTATUS

PspCreateThread(

    ...

    ...

    )

{

    ...

        if (PspCreateProcessNotifyRoutineCount != 0) {        //首先调用进程监控函数

            ULONG i;

            for (i=0; i<PSP_MAX_CREATE_PROCESS_NOTIFY; i++) {

                if (PspCreateProcessNotifyRoutine[i] != NULL) {

                    (*PspCreateProcessNotifyRoutine[i])( Process-

>InheritedFromUniqueProcessId,

                                                         Process->UniqueProcessId,

                                                         TRUE

                                                       );

                    }

                }

            }



        }

    ...

    ...

    if (PspCreateThreadNotifyRoutineCount != 0) {

        ULONG i;



        for (i=0; i<PSP_MAX_CREATE_THREAD_NOTIFY; i++) {    //再调用线程监控函数

            if (PspCreateThreadNotifyRoutine[i] != NULL) {

                (*PspCreateThreadNotifyRoutine[i])( Thread->Cid.UniqueProcess,

                                                    Thread->Cid.UniqueThread,

                                                    TRUE

                                                   );

            }

        }

    }

    ...

    ...

}

从上面可以看到,在每创建一个线程后会调用PspCreateProcessNotifyRoutine[i]地址指向的函数。而PsSetCreateThreadNotifyRoutine的作用就是将PspCreateThreadNotifyRoutine[i]数组设置值,该值就是监视函数的地址。

NTSTATUS

PsSetCreateThreadNotifyRoutine(

    IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine

    )

{

    ULONG i;

    NTSTATUS Status;



    Status = STATUS_INSUFFICIENT_RESOURCES;

    for (i = 0; i < PSP_MAX_CREATE_THREAD_NOTIFY; i += 1) {

        if (PspCreateThreadNotifyRoutine[i] == NULL) {

            PspCreateThreadNotifyRoutine[i] = NotifyRoutine;

            PspCreateThreadNotifyRoutineCount += 1;

            Status = ST

[1] [2] [3] [4] [5] [6] [7] [8] [9] 下一页

相关专题:
 
 网友评论:(评论内容只代表网友观点,与本站立场无关!)
GOOGLE广告

阅读排行

| 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 |
中国教师站

中国教师站 版权所有 Copyright © 2006-2020 All Rights Reserved 站长:Sina & Siny
[备用域名:www.JXZYW.Com] 有事请留言有事请留言
【实力成就精品 诚信呵护品牌】

信息产业部备案
苏ICP备06018635号