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

溫馨提示×

溫馨提示×

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

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

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

發布時間:2020-06-11 18:48:40 來源:網絡 閱讀:1128 作者:長路慢 欄目:系統運維

?好久沒有寫博客了,最近抽時間把這些雜碎零散的知識梳理下來,分享給更多朋友去找樂子,在草稿箱里面仍了好幾天忘發了。
接下來談談本篇主題,隱藏兩字。
一、隱藏意味著什么?
?不想被人發現唄,人性如此,亦是如此。
二、為什么要隱藏?
? 其實個人覺著這是根本,好好寫個程序你為什么要隱藏自己的進程、線程?為啥?無非你不想讓別人知道,或者不該讓別人知道。windwos下有很多未公開的東西,這是隱藏。面對對象程序設計封裝性,這也是隱藏。有些病毒,其實叫惡意代碼更為親切一些,更喜歡隱藏或者依附正常的進程來達到欺騙電腦,欺騙殺毒軟件,這都是隱藏。對有些不可告人的秘密。
三、對于進程隱藏能欺騙殺毒軟件?或者系統監控工具?
? 至少目前我沒有見過靠隱藏進程就可以瞞天過海,不代表沒有,格局有限.....,隱藏進程后,windows系統自帶的任務管理器已經看不到進程的身影,但是隨便找一個ARK就可以看到隱藏的進程,還可以使用procexp或者火絨劍等工具去查看,為什么隱藏了進程這些工具仍然可以找到?
四、淺談隱藏進程
? 因為windows用戶層,就是任務管理器是依賴于鏈表結構(_LIST_ENTRY)遍歷操作系統下有哪些進程,其實早些時候不懂widnows下鏈表重要性(當時自己學數據結構都說windows下雙向鏈表、樹很重要),后來才知道,嗯其實不依賴winAPI來做自己想做的事情,真的很重要。雙向鏈表請看以前的博客雙向鏈表:https://blog.51cto.com/13352079/2128624
?創建進程的時候會填充結構體_EPROCESS(看雪論壇搜索一下有詳細的創建過程),這樣我們_EPROCESS里面就有數據與內容了,關于這個結構體不同操作系統數據有可能會不一樣,windbg里面輸入: dt _EPROCESS 即可查看結構體內容與偏移。
? windows內核分為、執行體、微內核、HAL(最底層),_EPROCESS是屬于執行體層,包含進程創建信息、I/O、安全、句柄表、虛擬內存等等,有意思的是里面內嵌了一個(偏移0)_KPROCESS,他屬于微內核層,用來線程配額、調用還有優先級等信息。
? 我們重點來說一下_EPROCESS中的ActiveProcessLink,光看名字就知道活動進程鏈,如下圖所示。
說說windows內核中為什么要隱藏進程?
?這個就是隱藏進程的關鍵,他是一個雙向循環鏈表,我們可以通過鏈表去遍歷整個系統進程,對就是呢么簡單,如下圖所示:
說說windows內核中為什么要隱藏進程?
?更多結構體信息請看(我非常喜歡的一位筆者,他翻譯國外一些文章很嚴謹且詳細),貼下地址:https://bbs.pediy.com/thread-223858.htm 里面有對EPROCESS等常用的結構體詳細介紹,強烈推薦,也許你有些疑惑,如果你認真看完上面鏈接知識,你的疑惑將在他的文章里找到答案。
五、實現?為什么要實現?
?其實我以前也這思考、這些東西你為什么要去學?為什么要去做?我無從答案。好奇心?專研?熱愛?但是不可否認當你認真的做了這些事情之后,你有所收獲,有所進步。也許當你再一次看到procexp或者火絨劍可以把那些隱藏的進程遍歷出來的時候,你心里知道可以暴力枚舉或者檢測恢復斷鏈自己也可以實現,原來這些都是可能的,這樣做都是可以的。
?如果你會雙向鏈表,刪除一個節點對你來說不值一提,如果不會我希望你們去好好學習一下,學而用,這才是知識。如果你想恢復隱藏的進程(原來的節點位置),記得保存“鄰居的指針地址”。
?最后2019年,祝大家新的一年新生活,19年愿世人都能喝上一碗熱粥。

源代碼展示如下:
用戶層與驅動層頭文件都需要包含:

#define CTL_PROCESS_HIDE \
    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_NEITHER, FILE_ANY_ACCESS)
#define CTL_PROCESS_REST \
    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x802, METHOD_NEITHER, FILE_ANY_ACCESS)

以上是定義的控制碼,用于3環到零環內核編程功能控制
驅動層:

#include "HideHeader.h"

VOID UnLoadDriver(PDRIVER_OBJECT pDriverObj);

/*----------------聲明---------------------*/
NTSTATUS DefualtFunCtion(DEVICE_OBJECT* pDeviceObj, IRP* irp);
NTSTATUS ControlCode(DEVICE_OBJECT* pDeviceObj, IRP *irp);
NTSTATUS HideProcess(char* HideName);
NTSTATUS RestoreProcess(char* RestorName);

/*---------------入口點---------------------*/
NTSTATUS DriverEntry(DRIVER_OBJECT* pDriverObj, UNICODE_STRING* RegistryPath)
{
    UNREFERENCED_PARAMETER(RegistryPath);
    // DbgBreakPoint();
    // 初始化設備對象與符號對象(暴露給3環使用)
    UNICODE_STRING DeviceName;
    UNICODE_STRING SymbolicLinkName;
    DEVICE_OBJECT* pDeviceObj = NULL;
    NTSTATUS nStatus = STATUS_SUCCESS;

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

    // 創建設備對象
    nStatus = IoCreateDevice(pDriverObj, 0, &DeviceName, FILE_DEVICE_UNKNOWN, 0, 0, &pDeviceObj);

    if (FALSE == NT_SUCCESS(nStatus))
    {

        KdPrint(("IoCreateDevice Failuer!"));

        return nStatus;
    }

    // 設置通訊方式(0~3環),這里使用直接IO
    pDriverObj->Flags = DO_DIRECT_IO;

    // 創建符號對象
    nStatus = IoCreateSymbolicLink(&SymbolicLinkName, &DeviceName);

    if (FALSE == NT_SUCCESS(nStatus))
    {

        KdPrint(("IoCreateSymboLicLink failuer!"));

        return nStatus;

    }

    // 初始化派遣函數
    for (ULONG i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; ++i)
    {
        pDriverObj->MajorFunction[i] = DefualtFunCtion;
    }

    // 處理派遣函數及卸載
    pDriverObj->MajorFunction[IRP_MJ_DEVICE_CONTROL] = ControlCode;
    pDriverObj->DriverUnload = UnLoadDriver;

    return STATUS_SUCCESS;
}

/*----------------實現---------------------*/
NTSTATUS ControlCode(DEVICE_OBJECT* pDeviceObj, IRP *irp)
{ 
    DbgBreakPoint();
    UNREFERENCED_PARAMETER(pDeviceObj);

    NTSTATUS nStatus = STATUS_SUCCESS;

    // 獲取irp棧信息
    PIO_STACK_LOCATION pIrpStack = IoGetCurrentIrpStackLocation(irp);
    DbgBreakPoint();

    // 獲取控制碼
    ULONG uControlCode = pIrpStack->Parameters.DeviceIoControl.IoControlCode;

    // 獲取Out緩沖區
    // pOutBuffer = MmGetSystemAddressForMdlSafe(irp->MdlAddress, NormalPagePriority);

    switch (uControlCode)
    {
    case CTL_PROCESS_HIDE:
    {
        /*兼容性有欠缺,因為沒有檢測當前運行環境,PEPROCESS結構體偏移可能不準確*/
        HideProcess("notepad.exe");
    }
    break;
    case CTL_PROCESS_REST:
    {
        RestoreProcess("notepad.exe");
    }
    break;
    default:
        break;
    }

    irp->IoStatus.Information = 0;

    irp->IoStatus.Status = STATUS_SUCCESS;

    IoCompleteRequest(irp, IO_NO_INCREMENT);

    return nStatus;
}
NTSTATUS DefualtFunCtion(DEVICE_OBJECT* pDeviceObj, IRP* irp)
{
    UNREFERENCED_PARAMETER(pDeviceObj);
    // 完成狀態
    irp->IoStatus.Status = STATUS_SUCCESS;

    // 完成字節
    irp->IoStatus.Information = 0;

    // 處理irp
    IoCompleteRequest(irp, IO_NO_INCREMENT);

    return STATUS_SUCCESS;

}
VOID UnLoadDriver(PDRIVER_OBJECT pDriverObj)
{
    // 寫成PDRIVER_OBJECT 強轉的時候方便
    UNICODE_STRING DeleteSymName;
    PDEVICE_OBJECT NextDriverObj = NULL;
    PDEVICE_OBJECT CurrDriverObj = NULL;

    // 先刪除符號對象刪除設備對象
    RtlInitUnicodeString(&DeleteSymName, L"\\DosDevices\\SymbolicLinkName");

    // 刪除符號對象
    IoDeleteSymbolicLink(&DeleteSymName);

    CurrDriverObj = pDriverObj->DeviceObject;

    // 可能有多個設備對象
    while (CurrDriverObj != NULL) {

        NextDriverObj = CurrDriverObj->NextDevice;

        IoDeleteDevice(CurrDriverObj);

        CurrDriverObj = NULL;

        CurrDriverObj = NextDriverObj;
    }

    return;
}

// 隱藏進程
NTSTATUS HideProcess(char* HideName)
{
    // 用到的變量
    LIST_ENTRY* ListCurrProc = NULL;
    LIST_ENTRY* LinkListTemp = NULL;
    PEPROCESS pEprocess = NULL;

    // 獲取到EPROCESS結構體中ActiveProcessLink 本機環境win7 x64 偏移為0xb8
    // 其實調用的IoGetCurrentProcess
    pEprocess = PsGetCurrentProcess();  

    // 獲取ActiveProcessLinks
    ListCurrProc = (LIST_ENTRY *)((ULONG)pEprocess + 0xb8);

    // 下一個指針賦值
    LinkListTemp = ListCurrProc;

    // ULONG Te = 0;  測試使用臨時變量

    // 循環找到隱藏進程
    while (ListCurrProc != LinkListTemp->Flink)
    {
        // 調試信息輸出
        // Te = ((ULONG)LinkListTemp - 0xb8 + 0x16c);
        // KdPrint(("%s\n\n\n", Te));

        // 本該是0x16c是ImageFileName 但是用的鏈表位置 所以是 0x16c - 0xb8
        if (0 == strcmp((char *)((ULONG)LinkListTemp - 0xb8 + 0x16c), HideName))
        {
            // DbgBreakPoint();
            // 雙向鏈表應該很熟悉了  Previous  <-->  Curr  <--> Next  變成 Previous <--> Next
            (LinkListTemp->Blink)->Flink = ListCurrProc->Flink;

            (LinkListTemp->Flink)->Blink = ListCurrProc->Blink;

            LinkListTemp->Blink = NULL;

            LinkListTemp->Flink = NULL;

            KdPrint(("Sucess Hide Process!"));

            break;

        }
        LinkListTemp = LinkListTemp->Flink;
    }

    return STATUS_SUCCESS;

}
// 恢復進程(沒有去實現)
NTSTATUS RestoreProcess(char* RestorName)
{
    UNREFERENCED_PARAMETER(RestorName);
    // 枚舉當前進程名稱,獲取到進程,判斷鏈表中是否存在(循環),否則插入鏈表之中
    return STATUS_SUCCESS;
}

用戶層:

int main()
{
    HANDLE hDriver = INVALID_HANDLE_VALUE;

    hDriver = CreateFile(L"\\??\\SymbolicLinkName",
                        GENERIC_READ | GENERIC_WRITE,
                        FILE_SHARE_READ,
                        0,
                        OPEN_EXISTING,
                        FILE_ATTRIBUTE_NORMAL,
                        0);

    if (hDriver == INVALID_HANDLE_VALUE)
    {
        if (GetLastError() == 2)
            printf("錯誤碼(2):系統找不到指定的文件\n");
    }   
    else
        printf("驅動成功加載\n");

    DWORD dSize = 0;

    // 發送隱藏進程信息到零環 這里可以三環控制因為測試方便就不進行測試,所以參數為NULL
    // 如果使用控制碼 第三個參數傳入驅動層的緩沖區指針(需要傳入什么),第四個參數是傳入大小
    // 第5個參數是接收(0環發來的信息),大小,dSize是0環返回的大小
    DeviceIoControl(hDriver, CTL_PROCESS_HIDE, NULL, 0, NULL, 0, &dSize, NULL);

    system("pause");

    CloseHandle(hDriver);

    return 0;
}
向AI問一下細節

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

AI

南昌县| 霍林郭勒市| 黎川县| 翁牛特旗| 利津县| 珲春市| 五河县| 行唐县| 昌宁县| 灌云县| 祥云县| 郑州市| 彭山县| 锡林郭勒盟| 西城区| 莒南县| 广东省| 当雄县| 镇沅| 喀喇| 宜兰市| 广宗县| 望奎县| 新沂市| 武义县| 晋中市| 赞皇县| 香港| 奉化市| 呼和浩特市| 阜南县| 铁力市| 深泽县| 铜梁县| 宁海县| 平凉市| 唐河县| 古浪县| 溧水县| 咸宁市| 石河子市|