1. 程式人生 > >PsGetCurrentProcess為什麼能定位活動程序鏈(轉)

PsGetCurrentProcess為什麼能定位活動程序鏈(轉)

以前看某些文章的時候,知道可以利用“活動程序鏈”隱藏或者檢測程序。對於如何定位活動程序鏈一直沒搞清楚,在看Rootkit那本書上說,通過PsGetCurrentProcess函式可以獲得EPROCESS,但是書中解釋的很模糊,一直沒看明白。
今天利用WinDbg查看了各個結構,終於把疑問搞清楚了。
PsGetCurrentProcess函式反彙編後是這樣:

lkd> u nt!PsGetCurrentProcess
nt!PsGetCurrentProcess:
8052b52c 64a124010000         mov          eax,dword ptr fs:[00000124h]
8052b532 8b4044                   mov          eax,dword ptr [eax+44h]
8052b535 c3                          ret


在使用者模式下,FS指向TEB結構,而在核心模式下FS卻指向KPCR(Kernel's Processor Control Region)結構。那麼可以看到FS:[0x120]處就是KPRCB(Kernel's Processor Cotrol Block)結構(看下圖紅色高亮處)

lkd> dt nt!_kpcr
nt!_KPCR
        +0x000 NtTib                 : _NT_TIB
        +0x01c SelfPcr               : Ptr32 _KPCR
        +0x020 Prcb                  : Ptr32 _KPRCB
        +0x024 Irql                  : UChar
        +0x028 IRR                   : Uint4B
        +0x02c IrrActive             : Uint4B
        +0x030 IDR                   : Uint4B
        +0x034 KdVersionBlock        : Ptr32 Void
        +0x038 IDT                   : Ptr32 _KIDTENTRY
        +0x03c GDT                   : Ptr32 _KGDTENTRY
        +0x040 TSS                   : Ptr32 _KTSS
        +0x044 MajorVersion          : Uint2B
        +0x046 MinorVersion          : Uint2B
        +0x048 SetMember             : Uint4B
        +0x04c StallScaleFactor : Uint4B
        +0x050 DebugActive           : UChar
        +0x051 Number                : UChar
        +0x052 Spare0                : UChar
        +0x053 SecondLevelCacheAssociativity : UChar
        +0x054 VdmAlert              : Uint4B
        +0x058 KernelReserved        : [14] Uint4B
        +0x090 SecondLevelCacheSize : Uint4B
        +0x094 HalReserved           : [16] Uint4B
        +0x0d4 InterruptMode         : Uint4B
        +0x0d8 Spare1                : UChar
        +0x0dc KernelReserved2       : [17] Uint4B
   +0x120 PrcbData              : _KPRCB

展開KPRCB結構繼續觀察可以看到FS:[0x124]指向了KTHREAD結構

lkd> dt nt!_kprcb
nt!_KPRCB
        +0x000 MinorVersion          : Uint2B
        +0x002 MajorVersion          : Uint2B
   +0x004 CurrentThread         : Ptr32 _KTHREAD
        +0x008 NextThread            : Ptr32 _KTHREAD
        +0x00c IdleThread            : Ptr32 _KTHREAD
......本結構更多成員省略

繼續檢視KTHREAD結構可以看到KTHREAD+0x44處成員就是KPROCESS指標

lkd> dt nt!_kthread -v -r
Matched nt!_KTHREAD
nt!_KTHREAD
struct _KTHREAD, 73 elements, 0x1c0 bytes
        +0x000 Header                : struct _DISPATCHER_HEADER, 6 elements, 0x10 bytes
           +0x000 Type                  : UChar
           +0x001 Absolute              : UChar
           +0x002 Size                  : UChar
           +0x003 Inserted              : UChar
           +0x004 SignalState           : Int4B
           +0x008 WaitListHead          : struct _LIST_ENTRY, 2 elements, 0x8 bytes
              +0x000 Flink                 : Ptr32 to struct _LIST_ENTRY, 2 elements, 0x8 bytes
              +0x004 Blink                 : Ptr32 to struct _LIST_ENTRY, 2 elements, 0x8 bytes
        +0x010 MutantListHead        : struct _LIST_ENTRY, 2 elements, 0x8 bytes
           +0x000 Flink                 : Ptr32 to struct _LIST_ENTRY, 2 elements, 0x8 bytes
              +0x000 Flink                 : Ptr32 to struct _LIST_ENTRY, 2 elements, 0x8 bytes
              +0x004 Blink                 : Ptr32 to struct _LIST_ENTRY, 2 elements, 0x8 bytes
           +0x004 Blink                 : Ptr32 to struct _LIST_ENTRY, 2 elements, 0x8 bytes
              +0x000 Flink                 : Ptr32 to struct _LIST_ENTRY, 2 elements, 0x8 bytes
              +0x004 Blink                 : Ptr32 to struct _LIST_ENTRY, 2 elements, 0x8 bytes
        +0x018 InitialStack          : Ptr32 to Void
        +0x01c StackLimit            : Ptr32 to Void
        +0x020 Teb                   : Ptr32 to Void
        +0x024 TlsArray              : Ptr32 to Void
        +0x028 KernelStack           : Ptr32 to Void
        +0x02c DebugActive           : UChar
        +0x02d State                 : UChar
        +0x02e Alerted               : [2] UChar
        +0x030 Iopl                  : UChar
        +0x031 NpxState              : UChar
        +0x032 Saturation            : Char
        +0x033 Priority              : Char
  +0x034 ApcState              : struct _KAPC_STATE, 5 elements, 0x18 bytes


           +0x000 ApcListHead           : [2] struct _LIST_ENTRY, 2 elements, 0x8 bytes
              +0x000 Flink                 : Ptr32 to struct _LIST_ENTRY, 2 elements, 0x8 bytes
              +0x004 Blink                 : Ptr32 to struct _LIST_ENTRY, 2 elements, 0x8 bytes
   +0x010 Process               : Ptr32 to struct _KPROCESS, 29 elements, 0x6c bytes

至此,我們已經搞清了PsGetCurrentProcess的流程
通過查DDK DOC發現MS對PsGetCurrentProcess函式是這樣描述的:

PsGetCurrentProcess returns a pointer to the process of the current thread.
PEPROCESS
       PsGetCurrentProcess(
         );

該函式的返回值是EPROCESS指標。但是我們分析的結果是函式的返回值是KPROCESS的指標。
這樣的話難道PsGetCurrentProcess 函式返回值既是EPROCESS的指標又是KPROCESS的指標?
帶著疑問我們繼續往下看:

lkd> dt nt!_eprocess
nt!_EPROCESS
   +0x000 Pcb                   : _KPROCESS
        +0x06c ProcessLock           : _EX_PUSH_LOCK
        +0x070 CreateTime            : _LARGE_INTEGER
        +0x078 ExitTime              : _LARGE_INTEGER
        +0x080 RundownProtect        : _EX_RUNDOWN_REF
   +0x084 UniqueProcessId       : Ptr32 Void
        +0x088 ActiveProcessLinks : _LIST_ENTRY

可以看到EPROCESS的第一個成員就是KPROCESS,這樣我們就明白了為什麼PsGetCurrentProcess 函式返回值既是EPROCESS的地址又是KPROCESS的地址了。在EPROCESS偏移0x84是程序的PID,偏移0x88(我的系統是XP SP2)就是我們要找的活動程序鏈了。

以上是我今天學習的一些收穫,如果大家認為有哪些不對的地方,請指正。

相關推薦

PsGetCurrentProcess為什麼定位活動程序

以前看某些文章的時候,知道可以利用“活動程序鏈”隱藏或者檢測程序。對於如何定位活動程序鏈一直沒搞清楚,在看Rootkit那本書上說,通過PsGetCurrentProcess函式可以獲得EPROCESS,但是書中解釋的很模糊,一直沒看明白。 今天利用WinDbg查看了各個結構,終於把疑問搞清楚了。 Ps

用C++設計一個不被繼承的類

它的 設計 指定 基於 構造 重寫 rtu 構造函數、析構函數 析構函數 在Java 中定義了關鍵字final,被final修飾的類不能被繼承。 首先想到的是在C++中,子類的構造函數會自動調用父類的構造函數。同樣,子類的析構函數也會自動調用父類的析構函數。要想一個類不能

C++ 智指針詳解

include 復雜 測試類 信息 思想 編譯 應該 其他 eas C++ 智能指針詳解 一、簡介 由於 C++ 語言沒有自動內存回收機制,程序員每次 new 出來的內存都要手動 delete。程序員忘記 delete,流程太復雜,最終導致沒有 delete,異常導致程

Python語言在人工智(AI)中的優勢

巴西 luci ant p s 天使 不惜 ray 這也 招聘網站 本文探討了Python語言在AI領域的優勢與運用。 誰會成為AI 和大數據時代的第一開發語言? 這本已是一個不需要爭論的問題。如果說三年前,Matlab、Scala、R、Java 和 python還各有機

常見性優化策略的總結

觸發 air 技術 敏捷 返回 好的 依賴 pan 支付 看到一篇好文,轉過來好好學習 閱讀目錄 代碼 數據庫 緩存 異步 NoSQL JVM調優 多線程與分布式 度量系統(監控、報警、服務依賴管理) 案例一:商家與控制區關系的刷新job 案例二:POI緩存設計與實現

Python | 安裝和配置智提示插件Anaconda

主程序 content ima aid 默認 afa ssa 安裝路徑 建議 作為Python開發環境的Sublime Text 3,有了Anaconda就會如虎添翼。Anaconda是目前最流行也是最有威力的Python代碼提示插件。 工具/原料

js 原型

HA 函數傳參 raw users 復雜 部分 存在 name class 1.1 理解原型鏈 JavaScript中幾乎所有的東西都是對象,我們說數組是對象、DOM節點是對象、函數等也是對象,創建對象的Object也是對象(本身是構造函數),那麽有一個重要的問題:對象從哪

mysql性優化之索引優化

形式 字符串類 b樹索引 基礎 var 開發 null -- mysql服務器 作為免費又高效的數據庫,mysql基本是首選。良好的安全連接,自帶查詢解析、sql語句優化,使用讀寫鎖(細化到行)、事物隔離和多版本並發控制提高並發,完備的事務日誌記錄,強大的存儲引擎提供高效查

Redis(二十一):Redis性問題排查解決手冊

毫秒 直接 不包含 特定 命令 不用 超出 pip 過去 性能相關的數據指標 通過Redis-cli命令行界面訪問到Redis服務器,然後使用info命令獲取所有與Redis服務相關的信息。通過這些信息來分析文章後面提到的一些性能指標。 info命令輸出的數據可分為10個類

被swoole坑哭的PHP程序

邏輯 ber view ack class quest eve 什麽是 服務器 本文主要記錄一下學習swoole的過程、填過的坑以及swoole究竟有多麽強大! 首先說一下對swoole的理解:披著PHP外衣的C程序。很多PHPer朋友看到swoole提供的強大功

VMware虛擬機器不聯網的解決辦法

參考網址:https://blog.csdn.net/zhyulo/article/details/78730009 使用最後一種方法解決的: 1.關閉虛擬機器。在虛擬機器的編輯選單裡,點選"虛擬網路編輯器" 2.在虛擬網路編輯器介面,直接點選左下角的回覆預設預設設定,然後點選確定。

mysql程序命令

show OPEN TABLES where In_use > 0;檢視被使用的表,一般來看鎖死的表。 mysql> show processlist; +-----+-------------+--------------------+-------+--

想要人工智程序員該如何學習?

fontsize 高端 超過 雲計 mar 時間 遇到 插入 然而 對於程序員來說,碼農之路並不是一帆風順。對於每一個入行IT業的社會青年來說,誰不是抱著想要成為最高峰的技術大咖或者躍進管理崗的小目標?然而往往更多的人並非互聯網吹捧的如此耀眼,仿佛每一個程序員都是世界的領頭

關於長接,短接,異步,同步,單工,雙工的定義

ref duplex link targe href 超時 spa 數據包 影響 長連接:指在一個TCP連接上可以連續發送多個數據包,在TCP連接保持期間,如果沒有數據包發送,需要雙方發檢測包以維持此連接,一般需要自己做在線維持。 短連接:是指通信雙方有數

erlang程序優化點的總結

數據庫 機器 ria 嚴重 多線程 分別是 簡單 構造 代碼實現 註意,這裏只是給出一個總結,具體性能需要根據實際環境和需要來確定 霸爺指出,新的erlang虛擬機有很多調優啟動參數,今後現在這個方面深挖一下。 1. 進程標誌設置: 消息和binary內

靜態接庫與動態接庫的區別及動態庫的創建

相關 賦值 include ret sta 參數解析 span static 很好 一、引言通常情況下,對函數庫的鏈接是放在編譯時期(compile time)完成的。所有相關的對象文件(object file)與牽涉到的函數庫(library)被鏈接合成一個可執行文

關於區塊與比特幣 來源於嘶吼: http://www.4hou.com/info/news/6152.html

賬單 還要 號碼 news tar 參與 src 通知 都去 走近比特幣:一個故事看懂“區塊鏈” 2017年7月7日發布 首頁/新聞/正文 55,338 4 32 導語:本文是對區塊鏈原理極為通俗的解釋,適合剛接觸比特幣的小白們閱讀。 區塊鏈是比特幣的底層

高性、高可用的分布式架構體系

基礎上 keepal 第三方應用 備份 用戶 即時通訊 banner 協同辦公 產品 在2B企業服務、雲計算、移動互聯網領域,專業的雲平臺服務裏,分布式技術為支撐平臺正常運作關鍵性技術。從商業利潤和運維成本角度出發,千方百計榨幹服務器的每一分性能很大程度上影響著網站的

Sublime Text 3 使用 SublimeGDB 圖形化調試c/c++程序

系統設置 printf idt gin ref inline ctr ria 依次 本文介紹如何在sublime text中,通過安裝 SublimeGDB 插件,實現方便的圖形界面的調試。 在之前的文章 sublime text 3配置c/c++編譯環境

Sublime Text 3 配置java程序運行環境可進行控制臺輸入

tro [0 回車 enc str nbsp scan bsp source 博主配置前的情況1. 64位筆記本 2. win10系統 3. 已配置好java環境 4. 已安裝好sublime並配置好Package Control組件 具體過程:   1. Sub