您的位置:網站首頁 > 電器維修資料網 > 正文 >
Icesword列出隱藏進程的方法
來源: 日期:2013-11-20 18:37:45 人氣:標簽:
當然了你也不能用調試器調試,因為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 時則停止枚舉。
【看看這篇文章在百度的收錄情況】
相關文章
- 上一篇: 詳解ARP命令
- 下一篇: 美國宇航局發布史上 清晰地球夜景圖