国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 基礎常識 > 正文

Icesword 是如何列出隱藏進程

2019-11-01 00:10:13
字體:
來源:轉載
供稿:網友

   icesword 是通過 PspCidTable 這個表來遍歷進程的, PspCidTable 是一個沒有被 ntoskrnl.exe 導出的。這就涉及到如何定位

  PspCidTable 的問題。icesword 是通過搜索特征串的方式定位 PspCidTalbe. PspCidTable 是一個 HANDLE_TALBE 結構.

  PsLookupProcessByProcessId 函數中會引用 PspCidTalbe 變量。icesword 從 PsLookupProcessByProcessId 函數的前幾十個字節

  內搜索 PspCidTalbe 變量。在icesword 里面是不能調試的即使是用 windbg , softice,syser 調試器下斷點調試,也是斷不住的。

  當然了你也不能用調試器調試,因為 icesword.exe 會在一個timer 中不停的重新設置 int 1,int 3 的中斷處理函數。設置成

  windows ntoskrnl.exe 中的缺省處理函數。即使你用硬件斷點寄存器也是不管用的。那有的人就會說既然設置成 windows ntoskrnl.exe

  中的缺省處理函數就可以使用 windbg 雙機調試.icesword 也做了處理,icesword 會通過 KdDebuggerEnabled 變量判斷是否允許內核

  調試。如果允許調試的話. icesword 會調用 KdDisableDebugger 函數禁止內核調試。

  第一部分

  (寫的太細了,因為怕被 rootkIT 的作者利用.所以就把第一部分給去掉了.如果需要可以單獨和我聯系)

  寫第二部分

  這里順便在說兩個分析 icesword 中遇到的反調試小陷阱 這里把代碼片段列出來,希望作者原諒

  .text:000xxxF0 mov [ebp+IoControlCode], eax

  .text:000xxxF3 mov eax, [esp+5Ch-6Ch] ; 反調試代碼

  .text:000xxxF7 push eax

  .text:000xxxF8 mov eax, [esp+60h-6Ch]

  .text:000xxxFC pop ebx

  .text:000xxxFD cmp eax, ebx

  .text:000xxxFF jz short loc_1240B ; 如果沒有被調試則會跳轉

  .text:000xxx01 mov eax, 200EDBh

  .text:000xxx06 not eax

  .text:000xxx08 push eax

  .text:000xxx09 pop edi

  .text:000xxx0A stosd

  .text:000xxxF3 mov eax, [esp+5Ch+6Ch] 當單步執行到這條指令或者在這條指令上設置斷點的時候,因為當調試器在這條指令上彈出的時候會

  用到被調試程序的堆棧來保存 EFLAGS,CS,EIP, (如果 int 1,或 int 3 處理函數用任務門就可以解決這個問題。)例如 當代碼執行到這條指令時

  ESP = 805E4320h 執行完這條指令是 eax 的值為 [ESP+5Ch-6Ch]=[ESP-10h]=[805E4320h-10h]=[805E4310h] 的值。

  當單步執行到 .text:000xxxF8 mov eax, [esp+60h-6Ch] 指令的時候 ESP=805E432Ch 以為其中入棧了一個 eax 所以 ESP=805E432Ch,

  執行完 .text:000xxxF8 mov eax, [esp+60h-6Ch] 條指令的時候 eax = [ESP+60h-6Ch]=[ESP-Ch]=[805E432Ch-Ch]=[805E4310h]

  如果不調試的情況下 讀的是同一個地址的值,所以兩個值比較應該是相同的 也就是 .text:000xxxFD cmp eax, ebx 這條指令的比較結果

  應該是相同的。這個指令 .text:000xxxFF jz short loc_1240B 執行后直接跳轉到。

  如果是被調試器調試的情況下 .text:000xxxFF jz short loc_1240B 不會跳轉。 如果不跳轉時下面的代碼 會覆蓋掉系統的當前 ETHREAD

  指針。接下來在調用很多系統函數都會導致系統崩潰,并且是崩潰到系統模塊里面,這樣給你定位錯誤帶來誤導。哈哈

  .text:000xxx68 push 1 ; Alignment

  .text:000xxx6A push 40h ; Length

  .text:000xxx6C push CurrentEProcessObject ; Address

  .text:000xxx72 call ds:ProbeForRead

  這里是故意做個異常來實現跳轉。如果你在 .text:000xxx72 call ds:ProbeForRead 指令上單步執行的時候調試器會跑飛了,

  也就是說從調試器退出了,沒有繼續跟蹤下去。

  第三部分

  接下來說我們的 PspCidTable 我們找到了 PspCidTable 變量后, PspCidTable [這個 HANDLE_TABLE 的句柄表中,保存著所有進程和線程對象的指針。

  PID(進程ID)和 ThreadID(線程ID)就是在這個句柄表中的索引。這個 HANDLE_TABLE 不屬于任何進程,也沒有鏈在 HANDLE_TABLE 鏈上。全局變量

  PspCidTable 中是指向這個 HANDLE_TABLE 的指針。這個 HANDLE_TABLE 還有一點和別的 HANDLE_TABLE 都不同,就是它的 HANDLE_TABLE_ENTRY 中的

  第一個32bIT 放著的是對象體指針(當然需要轉換)而不是對象頭指針(對象指針就是對象體指針)。] (特別注明 在[]的話不是俺寫的是在網上抄來的

  這里特別感謝 “JIURL玩玩Win2k進程線程篇 HANDLE_TABLE” 文章的作者:JIURL )

  我們之要想到辦法遍歷這個 PspCidTable 句柄表就可以遍歷到系統的所有進程。icesword 為了遍歷這個表他使用了系統為公開的 ntoskrnl.exe

  的導出函數 ExEnumHandleTable 。

  icesword 定位到 ntoskrnl.exe 導出的 ExEnumHandleTable函數。

  這個函數是未公開的函數。

  這個函數的函數原形可能是 VOID STDCALL ExEnumHandleTable (PULONG HandleTable, PVOID Callback, PVOID Param, PHANDLE Handle OPTIONAL);

  其中的參數 PULONG HandleTable 就可以用 PspCidTable 做參數.

  PVOID Callback 的類型為 bool (*EXENUMHANDLETABLECALLBACK)(HANDLE_TALBE_ENTRY*,DWORD PID,PVOID Param) 函數指針。

  PVOID Param 參數就是傳送給回調函數的參數。

  PHANDLE Handle OPTIONAL 這個參數俺還沒搞懂什么意思。在說俺也用不到他,所以也不管他了隨他去吧。

  當調用 ExEnumHandleTable 函數的時候 函數在每次枚舉到表中的一個句柄時都會調用一次回調函數。

  當調用的 Callback 回調函數返回值為 0 時繼續枚舉句柄表,如果返回 1 時則停止枚舉。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 北票市| 宿州市| 托克托县| 江川县| 静宁县| 屯门区| 甘谷县| 五大连池市| 永年县| 宣城市| 大丰市| 南康市| 福贡县| 盐亭县| 山东| 庄河市| 琼中| 淮南市| 乌鲁木齐市| 临城县| 休宁县| 潮州市| 武山县| 伊通| 库车县| 铜山县| 泾川县| 格尔木市| 博野县| 安康市| 巴塘县| 普宁市| 锡林郭勒盟| 兴安县| 广宗县| 通榆县| 安庆市| 东辽县| 大厂| 蓬安县| 旌德县|