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