Windows运维之说说windows内核中为什么要隐藏线程?
小标 2019-05-20 来源 : 阅读 2460 评论 0

摘要:本文主要向大家介绍了Windows运维之说说windows内核中为什么要隐藏线程?通过具体的内容向大家展现,希望对大家学习Windows运维有所帮助。

本文主要向大家介绍了Windows运维之说说windows内核中为什么要隐藏线程?通过具体的内容向大家展现,希望对大家学习Windows运维有所帮助。

Windows运维之说说windows内核中为什么要隐藏线程?

#include "HideThreadHeader.h"

VOID UnLoad(PDRIVER_OBJECT pDriverObj)
{
    UNICODE_STRING DeleteSymbolicLinkName;
    RtlInitUnicodeString(&DeleteSymbolicLinkName, L"\\DosDevices\\SymbolicLinkName");

    IoDeleteSymbolicLink(&DeleteSymbolicLinkName);
    IoDeleteDevice(pDriverObj->DeviceObject);

    KdPrint(("UnLoad Sucess"));
}

NTSTATUS DefaultFun(DEVICE_OBJECT* pDeviceObj, IRP* irp)
{
    UNREFERENCED_PARAMETER(pDeviceObj);

    irp->IoStatus.Information = 0;

    irp->IoStatus.Status = STATUS_SUCCESS;

    IoCompleteRequest(irp, IO_NO_INCREMENT);

    return STATUS_SUCCESS;
}

NTSTATUS onCreate(DEVICE_OBJECT* pDeviceObj, IRP* irp)
{
    UNREFERENCED_PARAMETER(pDeviceObj);

    irp->IoStatus.Information = 0;

    irp->IoStatus.Status = STATUS_SUCCESS;

    IoCompleteRequest(irp, IO_NO_INCREMENT);

    return STATUS_SUCCESS;
}

NTSTATUS onClose(DEVICE_OBJECT* pDeviceObj, IRP* irp)
{
    UNREFERENCED_PARAMETER(pDeviceObj);

    irp->IoStatus.Information = 0;

    irp->IoStatus.Status = STATUS_SUCCESS;

    IoCompleteRequest(irp, IO_NO_INCREMENT);

    return STATUS_SUCCESS;
}

// 遍历属于某个进程所有线程 通过断链实现隐藏线程
VOID HideThreadListLink()
{

    CLIENT_ID* ThreadId = NULL;
    PEPROCESS pkProcess = NULL;
    PKTHREAD pkThread = NULL;
    PETHREAD pEthread = NULL;
    LIST_ENTRY* pEthreadNext = NULL;
    LIST_ENTRY* pEthreadCurrent = NULL;

    pkProcess = PsGetCurrentProcess();

    // 获取_KPROCESS->ThreadListHead(_LIST_ENTRY)
    pEthreadCurrent = (LIST_ENTRY *)((ULONG_PTR)pkProcess + 0x02c);

    /* 注:

            1. _KPROCESS.ThreadListHead->Flink指向的是一个_KTHREAD.ThreadListEntry
            2. _KTHREAD.ThreadListEntry - 偏移ThreadListEntry获取到KTHREAD地址,其实也就是ETHREAD地址.

    */

    KdPrint(("ThreadListHead.Flink = %p\n", pEthreadCurrent->Flink));
    KdPrint(("ThreadListHead.blink = %p\n", pEthreadCurrent->Blink));

    // 这个 (PETHREAD)(PEPROCESS + 0x2c)
    pEthreadNext = pEthreadCurrent->Flink;

    DbgBreakPoint();

    while (pEthreadCurrent != pEthreadNext)
    {
        pkThread = (PKTHREAD)((ULONG_PTR)pEthreadNext - 0x1e0);

        // pKthread->Teb 偏移 0x88
        // KdPrint(("pKThread->Teb = %p , %s \n", (ULONG_PTR)pkThread + 0x88, (((ULONG_PTR)pKThread + 0x88) == NULL || pkThread->Teb > 0x80000000 ? "System Thread" : "Non System Thread")));
        // 转换成EPROCESS
        pEthread = (PETHREAD)pkThread;

        DbgBreakPoint();

        // pEthread->Cid  偏移0x22c 
        ThreadId = (CLIENT_ID *)((ULONG_PTR)pEthread + 0x22c);

        KdPrint(("ThreadId = %d, ProcessId = %d\n\n", ThreadId->UniqueThread, ThreadId->UniqueProcess));

        // 这个地方也可以使用断链 伪代码
        if (ThreadId->UniqueThread == "隐藏的线程id")
        {
            // 与进程隐藏断链方式一样
        }

        pEthreadNext = pEthreadNext->Flink;
    }
}

// 驱动对象入口点
NTSTATUS DriverEntry(DRIVER_OBJECT* pDriverObj,  UNICODE_STRING* RegistryPath)
{

    UNREFERENCED_PARAMETER(irp);

    DbgBreakPoint();

    for (int i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; ++i) {
        pDriverObj->MajorFunction[i] = DefaultFun;
    }

    pDriverObj->DriverUnload = UnLoad;
    pDriverObj->MajorFunction[IRP_MJ_CREATE] = onCreate;
    pDriverObj->MajorFunction[IRP_MJ_CLOSE] = onClose;

    UNICODE_STRING DeviceName;
    UNICODE_STRING SymbolicLinkName;
    DEVICE_OBJECT* DeviceObj;
    NTSTATUS nStatus = STATUS_SUCCESS;

    RtlInitUnicodeString(&DeviceName, L"\\Device\\DeviceName");
    RtlInitUnicodeString(&SymbolicLinkName, L"\\DosDevices\\SymbolicLinkName");

    nStatus = IoCreateDevice(pDriverObj, 0, &DeviceName, FILE_DEVICE_UNKNOWN, 0, 0, &DeviceObj);

    if (!NT_SUCCESS(nStatus))
        return nStatus;

    nStatus = IoCreateSymbolicLink(&SymbolicLinkName, &DeviceName);

    if (!NT_SUCCESS(nStatus))
        return nStatus;

    DbgBreakPoint();

    // 没有使用控制码等处理  伪代码进行测试
    HideThreadListLink();

    return STATUS_SUCCESS;
}
   

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注系统运维windows频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程