您的位置:網(wǎng)站首頁(yè) > 電器維修資料網(wǎng) > 正文 >
Icesword列出隱藏進(jìn)程的方法
來(lái)源: 日期:2013-11-20 18:37:45 人氣:標(biāo)簽:
當(dāng)然了你也不能用調(diào)試器調(diào)試,因?yàn)閕cesword.exe會(huì)在一個(gè)timer中不停的重新設(shè)置int 1,int 3 的中斷處理函數(shù)。設(shè)置成windows ntoskrnl.exe 中的缺省處理函數(shù)。即使你用硬件斷點(diǎn)寄存器也是不管用的。那有的人就會(huì)說(shuō)既然設(shè)置成 windows ntoskrnl.exe中的缺省處理函數(shù)就可以使用 windbg 雙機(jī)調(diào)試.icesword 也做了處理,icesword 會(huì)通過(guò) KdDebuggerEnabLED 變量判斷是否允許內(nèi)核調(diào)試。如果允許調(diào)試的話. icesword 會(huì)調(diào)用 KdDISAbleDebugger 函數(shù)禁止內(nèi)核調(diào)試。
第一部分
(寫的太細(xì)了,因?yàn)榕卤?rootkIT 的作者利用.所以就把第一部分給去掉了.如果需要可以單獨(dú)和我聯(lián)系)
寫第二部分
這里順便在說(shuō)兩個(gè)分析 icesword 中遇到的反調(diào)試小陷阱 這里把代碼片段列出來(lái),希望作者原諒
.text:000xxxF0 mov [ebp+IoControlCode], eax
.text:000xxxF3 mov eax, [esp+5Ch-6Ch] ; 反調(diào)試代碼
.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 ; 如果沒(méi)有被調(diào)試則會(huì)跳轉(zhuǎn)
.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] 當(dāng)單步執(zhí)行到這條指令或者在這條指令上設(shè)置斷點(diǎn)的時(shí)候,因?yàn)楫?dāng)調(diào)試器在這條指令上彈出的時(shí)候會(huì)
用到被調(diào)試程序的堆棧來(lái)保存 EFLAGS,CS,EIP, (如果 int 1,或 int 3 處理函數(shù)用任務(wù)門就可以解決這個(gè)問(wèn)題。)例如 當(dāng)代碼執(zhí)行到這條指令時(shí)
ESP = 805E4320h 執(zhí)行完這條指令是 eax 的值為 [ESP+5Ch-6Ch]=[ESP-10h]=[805E4320h-10h]=[805E4310h] 的值。
當(dāng)單步執(zhí)行到 .text:000xxxF8 mov eax, [esp+60h-6Ch] 指令的時(shí)候 ESP=805E432Ch 以為其中入棧了一個(gè) eax 所以 ESP=805E432Ch,
執(zhí)行完 .text:000xxxF8 mov eax, [esp+60h-6Ch] 條指令的時(shí)候 eax = [ESP+60h-6Ch]=[ESP-Ch]=[805E432Ch-Ch]=[805E4310h]
如果不調(diào)試的情況下 讀的是同一個(gè)地址的值,所以兩個(gè)值比較應(yīng)該是相同的 也就是 .text:000xxxFD cmp eax, ebx 這條指令的比較結(jié)果
應(yīng)該是相同的。這個(gè)指令 .text:000xxxFF jz short loc_1240B 執(zhí)行后直接跳轉(zhuǎn)到。
如果是被調(diào)試器調(diào)試的情況下 .text:000xxxFF jz short loc_1240B 不會(huì)跳轉(zhuǎn)。 如果不跳轉(zhuǎn)時(shí)下面的代碼 會(huì)覆蓋掉系統(tǒng)的當(dāng)前 ETHREAD
指針。接下來(lái)在調(diào)用很多系統(tǒng)函數(shù)都會(huì)導(dǎo)致系統(tǒng)崩潰,并且是崩潰到系統(tǒng)模塊里面,這樣給你定位錯(cuò)誤帶來(lái)誤導(dǎo)。哈哈
.text:000xxx68 push 1 ; Alignment
.text:000xxx6A push 40h ; Length
.text:000xxx6C push CurrentEProcessObject ; Address
.text:000xxx72 call ds:ProbeForRead
這里是故意做個(gè)異常來(lái)實(shí)現(xiàn)跳轉(zhuǎn)。如果你在 .text:000xxx72 call ds:ProbeForRead 指令上單步執(zhí)行的時(shí)候調(diào)試器會(huì)跑飛了,
也就是說(shuō)從調(diào)試器退出了,沒(méi)有繼續(xù)跟蹤下去。
第三部分
接下來(lái)說(shuō)我們的 PspCidTable 我們找到了 PspCidTable 變量后, PspCidTable [這個(gè) HANDLE_TABLE 的句柄表中,保存著所有進(jìn)程和線程對(duì)象的指針。
PID(進(jìn)程ID)和 ThreadID(線程ID)就是在這個(gè)句柄表中的索引。這個(gè) HANDLE_TABLE 不屬于任何進(jìn)程,也沒(méi)有鏈在 HANDLE_TABLE 鏈上。全局變量
PspCidTable 中是指向這個(gè) HANDLE_TABLE 的指針。這個(gè) HANDLE_TABLE 還有一點(diǎn)和別的 HANDLE_TABLE 都不同,就是它的 HANDLE_TABLE_ENTRY 中的
第一個(gè)32bIT 放著的是對(duì)象體指針(當(dāng)然需要轉(zhuǎn)換)而不是對(duì)象頭指針(對(duì)象指針就是對(duì)象體指針)。] (特別注明 在[]的話不是俺寫的是在網(wǎng)上抄來(lái)的
這里特別感謝 “JIURL玩玩Win2k進(jìn)程線程篇 HANDLE_TABLE” 文章的作者:JIURL )
我們之要想到辦法遍歷這個(gè) PspCidTable 句柄表就可以遍歷到系統(tǒng)的所有進(jìn)程。icesword 為了遍歷這個(gè)表他使用了系統(tǒng)為公開的 ntoskrnl.exe的導(dǎo)出函數(shù) ExEnumHandleTable 。
icesword定位到ntoskrnl.exe導(dǎo)出的ExEnumHandleTable函數(shù)。
這個(gè)函數(shù)是未公開的函數(shù)。
這個(gè)函數(shù)的函數(shù)原形可能是 VOID STDCALL ExEnumHandleTable (PULONG HandleTable, PVOID Callback, PVOID Param, PHANDLE Handle OPTIONAL);
其中的參數(shù)PULONG HandleTable就可以用 PspCidTable 做參數(shù).
PVOID Callback的類型為 bool(*EXENUMHANDLETABLECALLBACK)(HANDLE_TALBE_ENTRY*,DWORD PID,PVOID Param)函數(shù)指針。
PVOID Param參數(shù)就是傳送給回調(diào)函數(shù)的參數(shù)。
PHANDLE Handle OPTIONAL 這個(gè)參數(shù)俺還沒(méi)搞懂什么意思。在說(shuō)俺也用不到他,所以也不管他了隨他去吧。
當(dāng)調(diào)用 ExEnumHandleTable 函數(shù)的時(shí)候 函數(shù)在每次枚舉到表中的一個(gè)句柄時(shí)都會(huì)調(diào)用一次回調(diào)函數(shù)。
當(dāng)調(diào)用的 Callback 回調(diào)函數(shù)返回值為 0 時(shí)繼續(xù)枚舉句柄表,如果返回 1 時(shí)則停止枚舉。
【看看這篇文章在百度的收錄情況】
相關(guān)文章
- 上一篇: 詳解ARP命令
- 下一篇: 美國(guó)宇航局發(fā)布史上 清晰地球夜景圖