最近研究怎麼樣使用hook攔截其他應用程式的訊息,於是就動手寫了乙個鉤子程式來掛到最常用的通訊及時通訊工具msn,雖然沒有什麼實際意義,但作為學習研究卻能夠幫助我們理解利用hook是怎麼樣將自己編寫的dll注入已經存在的程式空間中的。
我們需要做的是通過我們自己編寫的應用程式去攔截別人寫好的應用程式訊息,實際上這是在兩個程序之間進行的,難度就在這裡,如果是同乙個程序什麼都好辦,只要將系統響應windows訊息的處理函式修改為我們自己編寫的函式就可以,但現在不能這麼做,因為兩個程序有各自的程序位址空間,理論上你沒有辦法直接去訪問別的程序的位址空間,那麼怎麼辦來?辦法還是很多的,這裡僅僅介紹通過hook來達到目的。
需要攔截別的應用程式的訊息,需要利用將自己編寫的dll注入到別人的dll位址空間中才可以達到攔截別人訊息的目的。只有將我們的dll插入到別的應用程式的位址空間中才能夠對別的應用程式進行操作,hook幫助我們完成了這些工作,我們只需要使用hook來攔截指定的訊息,並提供必要的處理函式就行了。我們這裡介紹攔截在msn聊天對話方塊上的滑鼠訊息,對應的hook型別是wh_mouse。
首先我們要建立乙個用來hook的dll。這個dll的建立和普通的dll建立沒有什麼具體的區別,不過我們這裡提供的方法有寫不同。這裡使用隱式匯入dll的方法。**如下:
標頭檔案#pragma once
#ifndef msnhook_api
#define msnhook_api __declspec(dllimport)
#endif
msnhook_api bool winapi setmsnhook(dword dwthreadid);//安裝msn鉤子函式
msnhook_api void winapi gettext(int &x,int &y,char ** ptext);//安裝msn鉤子函式
msnhook_api hwnd winapi getmyhwnd();//安裝msn鉤子函式
dll 的cpp檔案
#include "stdafx.h"
#include "msnhook.h"
#include
// 下面幾句的含義是告訴編譯器將各變數放入它自己的資料共享節中
#pragma data_seg("shared")
hhook g_hhook = null;
dword g_dwthreadidmsn = 0;
point mouseloc=;
char text[256]=;
hwnd g_hwnd = null;
#pragma data_seg()
//告訴編譯器設定共享節的訪問方式為:讀,寫,共享
#pragma comment(linker,"/section:shared,rws")
hinstance g_hinstdll = null;
bool apientry dllmain( handle hmodule,
dword ul_reason_for_call,
lpvoid lpreserved
)return true;
}lresult winapi getmsgproc(int ncode,wparam wparam, lparam lparam);
bool winapi setmsnhook(dword dwthreadid)
else
}return(fok);
}lresult winapi getmsgproc(int ncode,wparam wparam, lparam lparam)
//sendmessage(windowfrompoint(l->pt),wm_gettext,256,(lparam)(lpctstr)psw);
}return(callnexthookex(g_hhook,ncode,wparam,lparam));
}void winapi gettext(int &x,int &y,char ** ptext)
hwnd winapi getmyhwnd()
上面是處理鉤子的dll**,下面我們要讓這個dll起作用還需要乙個啟動部分,通過這個啟動部分我們才能讓我們的鉤子函式真正的注入到系統其他函式中。我們這裡使用個對話方塊的程式,程式非常簡單:乙個按鈕用來啟動鉤子,乙個用來停止,乙個timer用來重新整理顯示,還有乙個editbox用來接受資訊。
程式如下:
//包含dll函式匯出的標頭檔案
#include "msnhook.h"
//隱式匯入
#pragma comment(lib,"msnhook.lib")
//宣告匯入函式
__declspec(dllimport) bool winapi setmsnhook(dword dwthreadid);
__declspec(dllimport) void winapi gettext(int &x,int &y,char ** ptext);
__declspec(dllimport) hwnd winapi getmyhwnd();//安裝msn鉤子函式
void ctestmsnhookdlg::onbnclickedok()
void ctestmsnhookdlg::ontimer(uint_ptr nidevent)
void ctestmsnhookdlg::onbnclickedbutton1()
好了,基本上就這些了。這裡有個問題,我本想得到msn使用者聊天時輸入的聊天資訊,這裡通過wm_gettext訊息的不到,如果有知道的朋友告訴一聲。
給MSN Messager裝個鉤子
最近研究怎麼樣使用hook攔截其他應用程式的訊息,於是就動手寫了乙個鉤子程式來掛到最常用的通訊及時通訊工具msn,雖然沒有什麼實際意義,但作為學習研究卻能夠幫助我們理解利用hook是怎麼樣將自己編寫的dll注入已經存在的程式空間中的。我們需要做的是通過我們自己編寫的應用程式去攔截別人寫好的應用程式訊...
如何開搓餌不掉鉤 防止小魚鬧鉤的九個辦法
小魚鬧鉤是另很多釣友都頭疼的乙個問題,剛拋竿入水浮漂就哐哐跳舞,看漂相好像大魚吃食一樣,浮漂經常性黑漂,提竿後小魚經常被掛著肚子上來,小魚鬧鉤另很多釣友們都素手無策,下面就小魚鬧鉤這個問題做一下分析,給大家提供幾個減輕小魚鬧鉤的方法。1 我們應首先在鉛皮座上加鉛皮,使鉛墜到底,將浮漂在半水無鉤的情況...
工具資源系列之給虛擬機器裝個windows
前面我們介紹了如何在mac宿主機安裝vmware虛擬機器軟體,本節我們將繼續介紹如何給虛擬機器安裝映象,切換不同的作業系統.vmware軟體是容器,映象是核心,這裡的映象指的是作業系統.開啟vmware軟體,選擇檔案 新建選項開始安裝映象檔案.識別到映象檔案後選中該檔案,點選繼續準備下一步安裝.配置...