91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

說說windows內核中為什么要隱藏線程?

發布時間:2020-07-15 15:44:41 來源:網絡 閱讀:899 作者:長路慢 欄目:系統運維

一、論:
?接著上一篇來談談,進程都能隱藏,單獨隱藏進程中的某一個線程干啥?
二、需求:
?需求源動力,就是有需求,除了正兒八經熱愛喜歡專研的朋友,無利無名、無食而學日不思,真的讓人很尊敬。
三、打個比方:
?當你想要去實現隱藏線程的時候你有可能在干什么?做一個工具?或者說是學習?通過隱藏線程可以更深入理解windows內部原理?進程與線程之間的關系?一個正常進程里面包含惡意線程?這是一個很棒的學習方式。也許你會用它來做一些事情,以前想寫過一個類似于ARK的工具,才有了學習的需求及動力。但是還沒有實際的環境去應用隱藏線程,沒有需求,但還是把代碼認真的寫出來,分享一些知識,知識在于分享。
四、還是那些結構體:
?有時候我在想,不用winAPI我能做什么事?也許我還能做很多的事情,因為有足夠的結構體我就不慌、但是,如果沒有了結構體我能做什么事情?這個還真不好說,其實相對于windows我更為喜歡Linux那種自由。
?介紹主人公_ETHREAD與_KTHREAD:
??1、_EPROCESS.ThreadListHead ---> _ETHREAD
??2、_KPROCESS.ThreadListHead ---> _KTHREAD
?線程屬于進程,一個進程由多個線程、那么同一個進程的多個線程使用的是相同的進程空間,線程也叫做輕量級進程。線程掛靠技術,也可以本線程使用其他進程的空間。
?windows下線程是最小執行單位,每個進程至少會有一個主線程去響應執行。同樣_ETHREAD屬于執行體層,內嵌偏移0是_KTHREAD(微內核層),異曲同工之妙,windows的管理不得不說很優秀,可以用藝術來形容。
? _KPROCESS中會有一個成員叫做ThreadListHead字段是進程所有線程的鏈表。指向的位置是_KTHREAD.ThreadListEntry,這個地方當時異或了好久,為啥?為啥這個鏈表指向的就是這個結構體這個位置,其實我現在也很糾結.
說說windows內核中為什么要隱藏線程?
?_KPROCESS.ThreadListHead指向 -----> _KTHREAD.ThreadListEntry
說說windows內核中為什么要隱藏線程?
?就是這個情況.內核就是通過這個來遍歷屬于某一個進程空間的所有線程。詳細資料還是參考:https://bbs.pediy.com/thread-223858.htm 個人感覺翻譯過來的文章質量五星好評。
五、貼上源碼
注:
?用戶層與頭文件源碼與隱藏線層套路一樣,代碼可復用(改一下控制碼的宏定義即可)
以下測試代碼沒有到三環進行通訊,在0環進行的測試(主代碼斷鏈部分與進程斷鏈一樣,這里給出偽代碼及思路)

驅動層:

#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;
}
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

鸡西市| 巴林左旗| 五莲县| 台东市| 沈丘县| 靖西县| 连城县| 山西省| 揭西县| 当涂县| 南部县| 辽宁省| 龙州县| 家居| 台湾省| 蒙城县| 罗甸县| 永年县| 望谟县| 洛扎县| 延庆县| 长宁区| 苍南县| 固镇县| 建瓯市| 芜湖市| 长兴县| 德惠市| 文化| 黑水县| 盐边县| 青州市| 扶余县| 招远市| 五台县| 长治县| 临澧县| 凉城县| 茂名市| 大城县| 萍乡市|