Hook là gì ?
Hook là một kỹ thuật dùng để chặn các sự kiện trước khi chúng được đưa vào stack của ứng dụng . Khi sử dụng kỹ thuật này ta chặn các sự kiện lại và xử lý chúng theo nhu cầu của ta .Ưu điểm ?
Có thể nói hook có ưu điểm rất lớn , ta có thể sử dụng hook để bắt các sự kiện keyboard , mouse ,... Một số chương trình sử dụng hook như Unikey , autogame , trojan ,... Ngoài ra, ta có thể thay đổi giao diện của ứng dụng .Phân loại :
Hook gồm 2 loại chính đó là :Hook cục bộ . Đây là loại hook được móc vào một ứng dụng nhất định .
Hook toàn cục . Đây là hook dùng để móc vào hệ thống thu nhận các sự kiện , thông điệp của toàn hệ thống , bao gồm chương trình .
Hoạt động của một hook ?
Đăng kí hook bằng hàm SetWindowsHookEx với tham số truyền vào là loại hook (mouse,keyboard) , con trỏ hàm xử lý hook , vùng hook (toàn cục, cục bộ) .Thực hiện xử lý hook CallBack .
Hủy hook bằng hàm UnhookWindowsHookEx .
Làm thế nào để cài đặt 1 hook ?
Ở bài này , ta sẽ thực hiện cài đặt một hook chặn thông điệp bàn phím . Từ đó , ta có thể ghi nhận tất cả những phím được gõ , sau đó xuất lên cửa sổ command Dos .Bước 1 : Tạo project Console Application.
Bước 2 : Tạo class Hook .
Ở bước này ta khai báo các thư viện :
using System;
using System.Diagnostics;
using System.Windows.Forms;
using System.Runtime.InteropServices;
Tiếp theo ta Import các DLL để lấy các hàm SetWindowsHookEx ,UnhookWindowsHookEx ,CallNextHookEx ,GetModule .
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr SetWindowsHookEx(int idHook,
LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool UnhookWindowsHookEx(IntPtr hhk);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode,
IntPtr wParam, IntPtr lParam);
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr GetModuleHandle(string lpModuleName);
private delegate IntPtr LowLevelKeyboardProc(
int nCode, IntPtr wParam, IntPtr lParam);
Khai báo các hàng số và biến
private const int WH_KEYBOARD_LL = 13;
private const int WM_KEYDOWN = 0x0100;
private static LowLevelKeyboardProc _proc = HookCallback;
private static IntPtr _hookID = IntPtr.Zero;
Thiết lập hàm hook
private static IntPtr SetHook(LowLevelKeyboardProc proc)
{
using (Process curProcess = Process.GetCurrentProcess())
using (ProcessModule curModule = curProcess.MainModule)
{
return SetWindowsHookEx(WH_KEYBOARD_LL, proc,
GetModuleHandle(curModule.ModuleName), 0);
}
}
Thiết lập hàm xử lý khi chặn các sự kiện
private static IntPtr HookCallback(
int nCode, IntPtr wParam, IntPtr lParam)
{
if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
{
int vkCode = Marshal.ReadInt32(lParam);
Console.WriteLine((Keys)vkCode);
}
return CallNextHookEx(_hookID, nCode, wParam, lParam);
}
Vì thế Constructor của hook sẽ là
public Hook()
{
_hookID = SetHook(_proc);
}
Bước 3 : Cài đặt hook ở chương trình
static void main()
{
hook = new Hook();
Application.Run();
}
Không có nhận xét nào:
Đăng nhận xét