• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            Windows體系結構: 


            Windows內核結構:



            Windows關鍵組件:
            hal.dll: 處于內核中,硬件抽象層, 隔離各種硬件平臺
            ntoskrnl.exe: 操作系統(tǒng)內核, 下層是微內核(提供線程調度,中斷異常等), 上層是執(zhí)行體(在微內核的基礎上實現(xiàn)基本的對象管理和功能組件的封裝)
            win32k.sys: Windows子系統(tǒng)內核,提供窗口管理和圖形設備輸出, 上層的GDI/User32在內核的實現(xiàn)。
            User32/GDI32/Kenel32: Windows子系統(tǒng)應用層API接口

            Windows進程創(chuàng)建過程: 



            下面介紹Windows進程中比較關鍵的幾個數(shù)據結構: EPROCESS, KPROCESS, PEB, CSR_PROCESS, W32PROCESS。



            上面我們可以看到KPROCESS(PCB)是EPROCESS的一部分, EPROCESS存在于內核上層的執(zhí)行體中, KROCESS(PCB)存在于內核下層的微內核中, 各施其職。
            每個進程都在內核中都有一個EPROCESS, 所有進程共享同一個內核空間, 內核通過一個鏈表把所有的進程內核塊(EPROCESS)串連起來。
            EPROCESS包含了很多重要的進程信息: PCB, 進程ID, 進程token, 進程句柄表, 進程環(huán)境塊(PEB), Win32進程塊(W32PROCESS)。



            上面的是PEB的結構圖, PEB即進程環(huán)境塊,存在于用戶空間(非內核), 所以我們應用層可以直接訪問(先通過FS寄存器訪問TEB, 在通過TEB成員訪問PEB), PEB也包含了很多有用的信息: 模塊列表, 進程參數(shù)信息, 線程本地存儲(TLS), 堆信息, 進程的GDI table等

            我們每個Windows進程在創(chuàng)建和退出的時候都要通知Windows子系統(tǒng), 在應用層csrss.exe負責管理所有的windows進程, 除了少數(shù)幾個系統(tǒng)進程(sms.exe), 其他所有進程在csrss.exe中都有自己的一份CSR_PROCESS數(shù)據。



            每個窗口進程在Windows子系統(tǒng)內核(win32k.sys)中都有一個W32PROCESS數(shù)據結構, 這個結構包含很多窗口和GDI相關的數(shù)據結構。
            下面再介紹下線程相關的數(shù)據結構: ETHREAD, KTHREAD, TEB, CSR_THREAD, W32THREAD.

            ETHREAD和KTHREAD分別在內核的執(zhí)行體層和微內核層。


            TEB(線程環(huán)境塊)存在于用戶層, 我們可以直接通過FS寄存器直接訪問。


            CSR_THREAD存在于csrss.exe進程中, 每個Windows進程創(chuàng)建線程后都會在這里登記。


            W32THREAD, 存在于win32k.sys內核中, 每個UI線程在這里都有對應的結構。
            我們可以看到Windows的整個系統(tǒng)各組件相互獨立和協(xié)助的過程, 他們之間各個關鍵的數(shù)據結構又可以直接通過指針相互訪問,有些存在于后臺內核(ntoskrnl.exe), 有些存在于界面內核(win32k.sys), 有些又存在于每個進程的用戶空間。
            這樣我們也明白了為什么內核對象(kernel object)句柄是每個進程獨立, 但是內核對象本身又是各個進程都可以訪問的?
            因為內核對象句柄表存在于EPROCESS, 是每個進程都獨立持有的, 但是內核對象本身又存在于內核, 是每個進程都可以通過指針直接訪問的(需要open object)。

            為什么GDI對象是每個進程獨有的, 其他進程沒法訪問? 
            因為GDI對象表存在于PEB中, 每個進程都有自己的一份, 其他進程沒法訪問。

            為什么User object只要得到句柄,就可以直接夸進程訪問?
            User object(如window, menu, hook)明明在內核中,為什么叫用戶對象, 因為在NT4.0之前他們是被放在csrss.exe中的,但是后來因為跨進程性能太低,微軟把他們移到了內核(win32k.sys)中, 每個session共享同一用戶對象列表, 所以它們以同樣的句柄值, 可以跨進程直接訪問。 
            TLS(線程本地存儲)又是怎么實現(xiàn)的? 
            在每個進程的用戶空間的PEB和TEB中分配存儲空間。

            怎么實現(xiàn)進程隱藏? 
            我們既可以直接通過Hook API實現(xiàn), 也可以通過直接修改進程列表實現(xiàn), 我們看到CSR_PROCESS, W32PROCESS, EPROCESS 其實都是list, 我們只要修改這些列表,尤其是EPROCESS列表, 就可以實現(xiàn)徹底的進程隱藏。

            SetWindowsHookEx是怎么實現(xiàn)的?
            Windows子系統(tǒng)內核(Win32k.sys)在對消息進行處理前對用戶態(tài)設置的回調函數(shù)進行調用。
            posted on 2016-03-16 22:03 Richard Wei 閱讀(2731) 評論(0)  編輯 收藏 引用 所屬分類: windows desktop
            7777久久亚洲中文字幕| 无码精品久久久天天影视| 91久久精品国产成人久久| 99精品伊人久久久大香线蕉| 国内精品久久久久久麻豆| 亚洲精品午夜国产va久久| 日本人妻丰满熟妇久久久久久| 久久er国产精品免费观看2| 久久丝袜精品中文字幕| 久久久久人妻精品一区| 日本精品一区二区久久久| 久久久久久久人妻无码中文字幕爆 | 国产亚洲色婷婷久久99精品91 | 色综合久久88色综合天天| 亚洲国产日韩欧美综合久久| 久久午夜电影网| 久久久久久国产精品无码超碰| 欧美日韩成人精品久久久免费看| 国产精品视频久久久| av色综合久久天堂av色综合在| 精品久久人人妻人人做精品| av无码久久久久久不卡网站| 性欧美丰满熟妇XXXX性久久久| 亚洲人成电影网站久久| 伊人久久大香线蕉影院95| 久久久免费精品re6| 国产成年无码久久久免费| 一本久久综合亚洲鲁鲁五月天| 久久97久久97精品免视看| 久久国产亚洲精品麻豆| 精品国产乱码久久久久久郑州公司| 久久涩综合| 色狠狠久久综合网| yy6080久久| 狠狠综合久久综合88亚洲| 亚洲人成无码网站久久99热国产| 久久涩综合| 欧美亚洲国产精品久久| 综合网日日天干夜夜久久| 亚洲精品乱码久久久久久自慰| 一本一本久久aa综合精品 |