Chào mọi người, hiện mình mắc 1 số vấn đề về Hook mà không biết cách giải quyết. Do mình chỉ mới làm quen với C++ mà kẹt bên VB6 không giải quyết vấn đề mình cần nên mình mới tham khảo về Hook.Do đó mình lên đây tính hỏi và nhờ các bạn giúp mình, mình cám ơn rất nhiều[IMG]images/smilies/big_grin.gif[/IMG][IMG]images/smilies/big_grin.gif[/IMG]
- Do mình viết chương trình trong VB6 có phần khóa file ".exe" và tham khảo được thì thấy người ta bảo Hook hàm CreateProcessInternalW. Mình có tham khảo 1 số code của meoconlongvang và chỉnh sửa lại nhưng giờ mình kẹt một chỗ là không biết viết hàm lọc ( được nhập từ VB6 vào dll ) để dll không cho chạy và cho chạy những file nào.Mình có gửi source lên đây để mọi người xem và nếu có thể thì viết giùm mình hàm lọc với [IMG]images/smilies/online.gif[/IMG]
- Vấn để thứ 2 mình muốn hỏi là trong 1 file dll mình muốn nó Hook 2 hàm API được không ( VD hook 2 Hàm OpenProcess và TerminateProcess ) Nếu có vd cho mình thì mình cám ơn nhiều
- Khi nhảy tới hàm API do mình viết rồi UnHook nó đi, việc lặp đi lặp lại này có ảnh hưởng gì tới hệ thống không ( VD như lag máy ) ?

Mã:
#include "stdafx.h"
#pragma data_seg(".shared")
#pragma data_seg()
HMODULE MyModuleHandle;
HHOOK hhk = NULL;
unsigned char Store[10];

long _stdcall SelfInject();
long _stdcall SelfEject();

LRESULT CALLBACK GetMsgProc(int nCode,WPARAM wParam,LPARAM lParam);

BOOL WINAPI CreateProcessInternalW2(HANDLE hToken,
					   LPCWSTR lpApplicationName,
					   LPWSTR lpCommandLine,
					   LPSECURITY_ATTRIBUTES lpProcessAttributes,
					   LPSECURITY_ATTRIBUTES lpThreadAttributes,
					   BOOL bInheritHandles,
					   DWORD dwCreationFlags,
					   LPVOID lpEnvironment,
					   LPCWSTR lpCurrentDirectory,
					   LPSTARTUPINFOW lpStartupInfo,
					   LPPROCESS_INFORMATION lpProcessInformation,
					   PHANDLE hNewToken);
					   
void HookAPI();
void UnHookAPI();

BOOL APIENTRY DllMain( HANDLE hModule, DWORD  reason,LPVOID lpReserved)
{
	if (reason == DLL_PROCESS_ATTACH)
	{
		HookAPI();
		MyModuleHandle = (HMODULE)hModule;
	}
	else if (reason == DLL_PROCESS_DETACH)
	{
		UnHookAPI();
	}

	return TRUE;
}

long _stdcall SelfInject()
{
	hhk = SetWindowsHookEx(WH_GETMESSAGE,GetMsgProc,MyModuleHandle,0);
	return (hhk != NULL);
}

long _stdcall SelfEject()
{
	return UnhookWindowsHookEx(hhk);
}

LRESULT CALLBACK GetMsgProc(int nCode,WPARAM wParam,LPARAM lParam)
{
	return CallNextHookEx(hhk,nCode,wParam,lParam);
}

void HookAPI()
{
	DWORD OldProtect, NewProtect = PAGE_EXECUTE_READWRITE;
	HMODULE hmod = GetModuleHandle("kernel32");
	long pa = (long)GetProcAddress(hmod,"CreateProcessInternalW");
	long pa2 = (long)CreateProcessInternalW2;
	long dAddr = pa2 - pa - 5;
	unsigned char *p = (unsigned char *)pa;
	unsigned char *p2 = (unsigned char *)(&dAddr);

	VirtualProtect((void *)pa,5,NewProtect,&OldProtect);

	for (int i=0;i<5;i++)
		Store[i] = p[i];

	p[0] = (unsigned char)0xE9;
	for (i=0;i<4;i++)
		p[i + 1] = p2[i];

	VirtualProtect((void *)pa,5,OldProtect,&NewProtect);
}

void UnHookAPI()
{
	DWORD OldProtect, NewProtect = PAGE_EXECUTE_READWRITE;
	HMODULE hmod = GetModuleHandle("kernel32");
	long pa = (long)GetProcAddress(hmod,"CreateProcessInternalW");
	unsigned char *p = (unsigned char *)pa;

	VirtualProtect((void *)pa,5,NewProtect,&OldProtect);

	for (int i=0;i<5;i++)
		p[i] = Store[i];

	VirtualProtect((void *)pa,5,OldProtect,&NewProtect);
}


BOOL WINAPI CreateProcessInternalW2(HANDLE hToken,LPCWSTR lpApplicationName,LPWSTR lpCommandLine,LPSECURITY_ATTRIBUTES lpProcessAttributes,LPSECURITY_ATTRIBUTES lpThreadAttributes,BOOL bInheritHandles,DWORD dwCreationFlags,LPVOID lpEnvironment,LPCWSTR lpCurrentDirectory,LPSTARTUPINFOW lpStartupInfo,LPPROCESS_INFORMATION lpProcessInformation,PHANDLE hNewToken)
{
	return 0;
}