如何擷取其它進程中視窗的視窗過程

來源:互聯網
上載者:User

開發環境: Windows XP + VC6+Platform SDK 或者 VS.NET 2003+

測試環境: Windows XP

曾經以為擷取一個視窗的視窗過程很簡單,不就是GetWindowLong一下嗎,看spyxx擷取的多麼順利。後來才發現原來不是這麼簡單。擷取本進程內視窗的視窗過程確實很簡單,直接調用GetWindowLong(hWnd,GWL_WNDPROC)就可以了(注意,根據視窗是否是Unicode的,你要判斷是調用GetWindowLongA,還是GetWindowLongW,可以用IsWindowUnicode來判斷), 但是GetWindowLong這個函數內部會檢查調用進程和該視窗控制代碼是否屬於同一進程,如果不是,就簡單的返回0了。

既然這樣,我們又不能去修改GetWindowLong,那就只有想辦法讓它認為我們和那個視窗是在一個進程裡了。回想起Windows核心編程裡講過,通過建立遠程線程的方式,可以在其它進程內建立一個新的線程,並且可以指定這個線程的線程函數。因為Windows的進程之間的地址相互之間是不可見的,所以我們不能指定本地的線程函數,而要在遠程分配記憶體,把我們要做的事情以機器碼的形式寫進去。

(spyxx是怎麼做的呢?它啟動時安裝了一個全域的鉤子WH_GETMESSAGE,這樣,幾乎所有有訊息迴圈的程式都會載入它的hook dll,從而可以在其它進程的地址空間裡調用GetWindowLong,如果我們僅僅為了擷取一下視窗過程裝一個全域鉤子,未免有點兒太浪費了:))

先來分析一下我們的線程函數都需要做什麼。

首先,需要調用GetWindowLong擷取這個視窗的視窗過程,然後要告訴我們。可以用PostMessage或者PostThreadMessage的方式通知我們的程式。具體如下所示:

//hWndTarget是我們要擷取其視窗過程的視窗控制代碼, 假設 hWndTarget = 0x12345678
//dwThreadId是我們的線程Id          ,假設 dwThreadId = 0x5678
LONG wndProc = GetWindowLong(hWndTarget,GWL_WNDPROC);
PostThreadMessage(dwThreadId,WM_MYMESSAGE,(WPARAM)hWndTarget,(LPARAM)wndProc);

因為這個時候函數的參數我們都已經知道了,所以可以直接寫入程式碼到程式裡。先看一下GetWindowLongA的函數原型:

WINUSERAPI LONG WINAPI GetWindowLongA( HWND hWnd, int nIndex)

一共有兩個參數,我們的 GetWindowLongA(hWnd,GWL_WNDPROC)函數調用的彙編代碼大概就是這個樣子(右邊是響應的機器碼):

//參數入棧的順序是從右向左,所以先push nIndex,然後是push hWnd
push 0xFC //6A FC //GWL_WNDPROC的值是-4,寫成16進位就是0xFC
push hWndTarget //58 78 56 34 12 //假設 hWndTarget = 0x12345678
call GetWindowLongA //E8 (GetWindowLongA-下一條指令的地址)

GetWindowLongA函數的傳回值在eax寄存器裡,我們的PostThreadMessageA函數裡用wParam參數發送該視窗控制代碼,用lParam參數發送該視窗的視窗過程 ,所以push lParam 就是 push eax

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.