Hooks di sistem Windows memiliki fungsi yang sangat kuat. Melalui teknologi ini, hampir semua pesan di sistem Windows dapat disadap, dipantau, dan diproses. Teknologi ini dapat digunakan secara luas di berbagai perangkat lunak, terutama perangkat lunak yang memerlukan pemantauan, perekaman otomatis, dan fungsi pemantauan sistem lainnya. Artikel ini membahas topik tersebut, dengan harapan dapat menjadi referensi bagi pembaca.
1. Mekanisme dan jenis pengait
Semua aplikasi Windows digerakkan oleh pesan, dan pengoperasian aplikasi bergantung pada jenis dan konten pesan yang diterimanya. Hook mirip dengan mekanisme pemrosesan interupsi interupsi Dos. Hook adalah platform mekanisme pemrosesan pesan Windows. Dengan memasang berbagai hook, aplikasi dapat mengatur subrutin di dalamnya untuk memantau pesan tertentu di jendela yang ditentukan dan memproses pesan tersebut sebelum mencapai jendela target.
Di Windows, ada dua jenis hook, satu adalah hook sistem (RemoteHook), yang memonitor pesan dalam keseluruhan sistem, dan yang lainnya adalah thread hook (LocalHook), yang hanya mencegat pesan dalam proses. Untuk kait sistem, fungsi kait (HookFunction) harus diterapkan di perpustakaan tautan dinamis (DLL) sistem Windows. Untuk kait benang, fungsi kait dapat diimplementasikan di DLL atau di aplikasi yang sesuai. Ini karena ketika pengembang membuat hook, Windows pertama-tama membuat struktur data di memori sistem, yang berisi informasi tentang hook, lalu menambahkan struktur tersebut ke daftar hook yang ada, dan Hooks baru akan diurutkan di depan yang lebih lama. kait. Ketika suatu peristiwa terjadi, jika hook lokal dipasang, fungsi hook dalam proses saat ini akan dipanggil. Jika itu adalah hook jarak jauh, sistem harus memasukkan fungsi hook ke dalam ruang alamat proses lain. Untuk melakukan ini, fungsi hook harus berada di perpustakaan tautan dinamis, jadi jika Anda ingin menggunakan hook jarak jauh, Anda harus memasukkannya pengait Masukkan fungsi ke dalam pustaka tautan dinamis. Untuk tipe pesan yang dipantau oleh kait, Windows menyediakan total tipe berikut: Seperti yang ditunjukkan pada Tabel 1:
Tabel 1. Jenis pesan Windows
Pengidentifikasi konstan jenis pesan | nilai | Jenis pesan | Lingkup aplikasi |
WH_CALLWNDPROC | 4 | pesan ke jendela | benang atau sistem |
WH_CALLWNDPROCRET | 12 | Pesan dikembalikan melalui jendela | benang atau sistem |
WH_CBT | 5 | Pesan seperti perubahan jendela dan pengaturan fokus | benang atau sistem |
WH_DEBUG | 9 | Apakah akan mengeksekusi Hooks dari Hooks lainnya | benang atau sistem |
WH_FOREGROUNDIDLE | 11 | Program latar depan tidak aktif | benang atau sistem |
WH_GETMESSAGE | 3 | Pesan diposting ke antrian pesan | benang atau sistem |
WH_PEMUTARAN JURNAL | 1 | Putar ulang pesan yang direkam | sistem |
WH_REKAM JURNAL | 0 | Pantau dan catat pesan masukan | sistem |
WH_KEYBOARD | 2 | Pesan papan ketik | benang atau sistem |
WH_MOUSE | 7 | pesan tikus | benang atau sistem |
WH_MSGFILTER | -1 | Bilah gulir menu, pesan dialog | benang atau sistem |
WH_SHELL | 10 | pesan cangkang | benang atau sistem |
WH_SYSMSGFILTER | 6 | Bilah gulir menu, pesan dialog untuk semua thread | sistem |
2. Implementasi hook dalam pemrograman VB
(1) Format fungsi kait (Fungsi HOOK). Fungsi Hook sebenarnya adalah sebuah fungsi. Jika itu adalah hook sistem, fungsi tersebut harus ditempatkan di perpustakaan tautan dinamis. Fungsi ini memiliki format parameter tertentu, yaitu sebagai berikut di VB:
Fungsi Pribadi HookFunc (ByVal nCode Selama, ByVal wParam Selama, ByVal lParam Selama) Selama |
Diantaranya, nCode mewakili situasi di mana hook dihasilkan, dan ada kumpulan nilai yang mungkin berbeda tergantung pada hook; nilai pengembalian parameter wParam dan lParam mencakup konten pesan yang dipantau, yang bervariasi dengan jenis pesan yang dipantau oleh Hook. Ini berbeda tergantung pada nilai nCode. Untuk fungsi hook yang diset dengan VB, bentuk kerangka umumnya adalah sebagai berikut:
Fungsi Pribadi HookFunc (ByVal nCode Selama, ByVal wParam Selama, ByVal lParam Selama) Selama Pilih kasus nCode kasus ncode<0:hookfunc=callnexthookex(hHookFunc, nCode, wParam, lParam) nilai kasus 1: Pemrosesan 1: HookFunc=X1 kasus2:Proses pemrosesan 2:HookFunc=X1 … akhir pilih Fungsi akhir |
Nilai kembalian fungsi. Jika pesan ingin diproses, teruskan 0, jika tidak, teruskan 1 dan makan pesannya.
(2) Pemasangan dan pelaksanaan kait. Beberapa fungsi API digunakan untuk menginstal hook: Anda dapat menggunakan fungsi API SetWindowsHookEx() untuk menginstal subrutin hook yang ditentukan aplikasi ke dalam daftar hook. Deklarasi fungsi SetWindowsHookEx() adalah sebagai berikut:
Deklarasikan fungsi SetWindowsHookEx Lib user32 Alias SetWindowsHookExA(ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long |
Nilai idHook adalah jenis pesan yang ditanganinya; nilai lpfn adalah penunjuk alamat subrutin hook. Jika parameter dwThreadId adalah 0 atau pengidentifikasi thread yang dibuat oleh proses lain, lpfn harus menunjuk ke subrutin hook di DLL. Selain itu, lpfn dapat menunjuk ke kode subrutin kait dari proses saat ini. Nilai hMod adalah pegangan aplikasi, yang mengidentifikasi DLL yang berisi subrutin yang ditunjuk oleh lpfn. Jika dwThreadId mengidentifikasi thread yang dibuat oleh proses saat ini dan kode subrutin terletak di proses saat ini, hMod harus 0. Nilai dwThreadId adalah pengidentifikasi thread yang terkait dengan subproses hook yang dipasang. Jika bernilai 0, subproses hook dikaitkan dengan semua thread. Jika hook berhasil dipasang, pegangan sub-proses hook akan dikembalikan. Jika gagal, 0 akan dikembalikan.
Selain itu, fungsi CallNextHookEx() umumnya harus dipanggil dalam subrutin hook untuk mengeksekusi subrutin hook berikutnya yang ditunjuk oleh daftar hook. Jika tidak, aplikasi dengan hook lain yang terpasang tidak akan menerima pemberitahuan hook, sehingga menghasilkan hasil yang salah. Deklarasi fungsi CallNextHookEx() adalah sebagai berikut:
Deklarasikan Fungsi CallNextHookEx Libuser32 Alias CallNextHookEx(ByVal hHook As Long, ByVal ncode As Lonog, ByVal wParam As Long, lParam As Any) As Long |
Nilai hHook adalah nilai kembalian SetWindowsHookEx(), dan nCode, wParam, dan lParam adalah tiga parameter dalam fungsi Hook. Sebelum program dihentikan, fungsi UnhookWindowsHookEx() harus dipanggil untuk melepaskan sumber daya sistem yang terkait dengan hook. Fungsi UnhookWindowsEx() dideklarasikan sebagai berikut:
Deklarasikan Fungsi Unhook WindowsHookEx Lib user32 Alias Unhook WindowsHookEx(ByVal hHook As Long)Selama |
hHook adalah nilai kembalian saat memasang hook, yaitu pegangan sub-proses hook.
(3) Hal-hal yang harus diperhatikan saat memasang kait di VB. Parameter lpfn adalah alamat HookFunc. VB menetapkan bahwa kode HookFunc harus ditempatkan dalam modul .BAS standar dan diteruskan sebagai Alamat HookFunc. Untuk RemoteHook, HookFunc harus disertakan dalam pustaka tautan dinamis, jadi jika Anda menggunakan RemoteHook di VB, Anda juga perlu menggunakan dua fungsi API: GetModuleHandle() dan GetProcAddress().
Deklarasikan Fungsi GetModuleHandle Libkernel32 Alias GetModuleHandleA(ByVal lpModuleName As String) Selama Deklarasikan Fungsi GetProcAddress Lib kernel32 Alias GetProcAddress(ByVal hModule As Long, ByVal lpProcName As String) As Long |
Nilai hmod adalah nama modul yang berisi proses hook. Jika LocalHook, nilainya bisa Null (0 diteruskan di VB), dan jika RemoteHook, Anda bisa menggunakan GetModuleHandle (name.dll) untuk meneruskannya. .