Tổng số lượt xem trang

Thứ Ba, 28 tháng 12, 2010

Hooking C#

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();
}

Demo

Không có nhận xét nào:

Đăng nhận xét