Sau loạt bài về Ịnect code và User Hook (DLL và Thread), tôi đang nghiên cứu về Dectect User Hook. Ở đây tôi không bàn về các dò tìm hook sử dụng code trong kernel mode vì có rất nhiều tài liệu về nó. Tôi chỉ muốn nghiên cứu về cách dò tìm hook hoàn toàn bằng code trong user mode. Tài liệu thì tôi search chưa ra. Tôi đã thử code một đoạn, phương pháp như sau:

Mô hình: giả sử có một process bị hook bảng IAT bằng cách inject code một DLL. Yêu cầu là tìm ra tên DLL inject.

Tôi đã làm nư sau:

1/ Duyệt bảng IAT của process từng addr hàm import
2/ Sau đó ta Get base của module bằng hàm tự viết sau:

HMODULE GetModuleFromAddressEx(HANDLE hProcess, VOID * Address)
{
MEMORY_BASIC_INFORMATION mbi;
DWORD dwRetVal;
HMODULE hMod = NULL;
dwRetVal = (DWORD)VirtualQueryEx(hProcess, Address, &mbi, sizeof(mbi));
if(dwRetVal != 0)
hMod = (HMODULE) mbi.AllocationBase;
return hMod;
}

3/ Đến đây là ta có base của Module trong process cần kiểm tra rồi. Từ base này chúng ta sẽ tìm ra tên DLL inject. Trong user mode có hai hàm tìm Name module là:

DWORD WINAPI GetModuleFileNameEx(
__in HANDLE hProcess,
__in_opt HMODULE hModule,
__out LPTSTR lpFilename,
__in DWORD nSize
);
DWORD WINAPI GetModuleBaseName(
__in HANDLE hProcess,
__in_opt HMODULE hModule,
__out LPTSTR lpBaseName,
__in DWORD nSize
);
Nhưng ngặt nổi hai hàm này chỉ get được name của module nào import ngay từ đầu trong bảng IAT của process mà thôi hoặc bị Hook bởi SetWindowsHookEx. Nếu ta load DLL bằng LoadLibrary (gọi là pp module load sau) , thì hai hàm này ko thể get Name được.

Thêm nữa, nếu bạn Get module name bằng cách dùng hàm EnumProcessModules
Hay hàm CreateToolhelp32Snapshot thì vẫn không phát hiện được module load sau.

Còn nếu ta dùng hàm ZwQueryInformationProcess thì truy xuất được ra addr của PEB như sau:

ZwQueryInformationProces = (PFN_ZWQUERYINFORMATIONPROCESS)GetProcAddress( hNtDll, "ZwQueryInformationProcess" );
Status = ZwQueryInformationProces(hproc,0
,&pbi,sizeof(PROCESS_BASIC_INFORMATION), NULL);
pPEB = (PPEB ) (pbi.PebBaseAddress);

Nhưng addr này lại nằm trong target process nên trong process của ta ko truy xuất được.

4/ Cách giải quyết của tôi, tôi hook target process, sau đó truy xuất PEB để lấy ra tên DLL (tương tự như cách Hide DLL), rồi truyền về process của ta.

Nhưng tôi thấy cách này sao sao ấy. Vậy các bạn có cách giải quyết nào khác không. Sharing nhé.
Thanz u.
Benina