Trao đổi với tôi

http://www.buidao.com

5/20/10

[Rootkit] Detect Hide Processes

Link: http://virusvn.com/forum/showthread.php?p=14364#post14364
Tham khảo từ : http://www.hvaonline.net/hvaonline/posts/list/767.hva

Đầu tiên tui xin nói sơ qua về phương pháp hide process của hide tool.Tui tham khảo phương pháp này từ bài viết của Thung4lift3,với một chút hiểu biết ít ỏi xin viết một tut có gì sai xót mong các bác chỉ bảo thêm.

Tool này hook một số hàm trong System Server Table:
NtClose(CloseHandle )kernel32.dll
NtDuplicateObject(DuplicateHandle) kernel32.dll
NtInitiatePowerAction
NtMapViewOfSection(NtMapViewOfSection)ntdll.dll
NtOpenThread(OpenThread) kernel32.dll
NtQueryInformationProcess(NtQueryInformationProces s) ntdll.dll
NtQuerySystemInformation(NtQuerySystemInformation) ntdll.dll
NtRaiseHardError
NtResumeThread(ResumeThread) kernel32.dll
NtSetInformationThread
NtSetSystemPowerState
NtShutdownSystem
NtTerminateProcess(TerminateProcess) kernel32.dll
NtWriteFile
NtWriteFileGather

Và tool này không sửa struct _LIST_ENTRY ActiveProcessLinks; mà tôi sẽ dùng để dò tất cả các đối tượng EProcess của các Process Active tham khảo từ bài viết của Thug4lift3 ở link trên .

Cách thứ nhất Ta sẽ unhook tất cả các hàm trên,để Process hide show trở lại ta chỉ cần unhook hàm NtQuerySystemInformation.Để unhook ta chỉ cần sửa lại address của hàm trong System service của System Server Table.

Trong cuốn undocument win2k secret có định nghĩa 2 cấu trúc sau:
Code:
typedef _SERVICE_DESCRIPTOR_TALBE
{
_SYSTEM_SERVICE_TABLE ntoskrnl;//ntoskrnl.exe (native api)
_SYSTEM_SERVICE_TABLE win32k;//win32k.sys (gdi,user suport)
_SYSTEM_SERVICE_TABLE table3;//not user
_SYSTEM_SERVICE_TABLE table 4;//not user
}

typedef _SYSTEM_SERVICE_TALBE
{
PNTPROC ServiceTable;//array of entry points
PDWORD CounterTable;//
DWORD ServiceLimit;//number of table entries
PBYTE ArgumentTable//array number byte of argument
}
Cấu trúc _SERVICE_DESCRIPTOR_TALBE lưu 4 cấu trúc _SYSTEM_SERVICE_TABLE đó ntoskrnl table lưu thông tin về cac native api
Và ID lưu trong EAX trước khi gọi ngắt từ user mode chuyển vào Kernel mode trong khoảng -0x0000 -> 0x0FFF (table 1 ntoskrnl.exe)
Tiếp theo ta có ID dispatch của các cấu trúc _SYSTEM_SERVICE_TABLE kế tiếp:
-0x1000 -> 0x1FFF (table 2)
-0x2000 -> 0x2FFF (table 3)
-0x3000 -> 0x3FFF (table 4)

Đề dò đúng _SYSTEM_SERVICE_TABLE trong _SERVICE_DESCRIPTOR_TALBE sẽ kiểm tra bit 12 và 13

Bit 0 đến 11 để tham chiếu đến address của hàm native API trong ServiceTable của cấu trúc _SYSTEM_SERVICE_TALBE.


Cách 2 cách tui đã đề cập ở trên dựa vào _LIST_ENTRY ActiveProcessLinks trong Eprocess.

Cấu trúc của một EPRPCESS trong Win XP SP3
http://www.msuiche.net/msdn/winxpsp3_x86/EPROCESS.php
Đặc biết cấu trúc này không được định nghĩa trong DDK có thể Microsoft không muốn ta can thiệp sâu vào nó nên bạn cần phải định nghĩa một con trỏ của cấu trúc này để sử dụng

Địnhg nghĩa một cấu trúc _LIST_ENTRY

typedef struct _LIST_ENTRY {
struct _LIST_ENTRY *Flink;
struct _LIST_ENTRY *Blink;
} LIST_ENTRY, *PLIST_ENTRY;

Flink là con trỏ lưu address của cấu trúc _LIST_ENTRY kế tiếp.Còn Blink là con trỏ lưu cấu trúc _LIST_ENTRY phía trước.Bạn xem hình sau sẽ thấy rõ tui sẽ không cần phải giải thích thêm.



Từ address ActiveProcessLinks ta trừ đi offset 0x88 sẽ tìm được address của một struct EPROCESS.Từ đây bạn sẽ lấy được Image File Name (UINT8 ImageFileName[16]; trong struct EPROCESS) ngoai ra bạn có thể dựa vào PID của Process (VOID* UniqueProcessId .v.v. để detect process hide bởi HideToolz.

Source Example:
ExDetectProcHideToolz.c

Code:
#include 

void MyDriverUnload (IN PDRIVER_OBJECT DriverObject);
void LinkGetNext(PLIST_ENTRY *pCurLstEn);
void GetImgFileNameFormListEntry(PLIST_ENTRY pCurLstEn);

NTSTATUS DriverEntry (PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
{
PLIST_ENTRY pCurLstEn;
PLIST_ENTRY LBreak;

LBreak=pCurLstEn=(PLIST_ENTRY)((ULONG)PsInitialSystemProcess+0x88);
GetImgFileNameFormListEntry(pCurLstEn);
LinkGetNext(&pCurLstEn);

while (pCurLstEn->Flink!=LBreak)
{
GetImgFileNameFormListEntry(pCurLstEn);
LinkGetNext(&pCurLstEn);
}

DriverObject-> DriverUnload = MyDriverUnload;
return STATUS_SUCCESS;
}

void MyDriverUnload (IN PDRIVER_OBJECT DriverObject)
{
DbgPrint ("Driver Unload \n");
}

void LinkGetNext(PLIST_ENTRY *pCurLstEn)
{
PLIST_ENTRY LstEnTemp;
LstEnTemp=*pCurLstEn;
*pCurLstEn=LstEnTemp->Flink;
}

void GetImgFileNameFormListEntry(PLIST_ENTRY pCurLstEn)
{
DbgPrint("ImgFileName:%s\n",(PUINT8)((ULONG)pCurLstEn-0x88+0x174));
}
Build source trên và dùng KmdManager.exe để nap driver hoặc bạn có thể code riêng để nạp driver . Sau đó mở Dbgview.exe rồi run driver sau đó xem string Dbgview đã capture được.


Kết quả test trên winxp SP3






File được đính kèm
Kiểu file:  rar HideToolz_v2.2.rar‎ (201,9 KB, 11 xem)
Kiểu file:  rar Example.rar‎ (170,7 KB, 9 xem)