標籤:dup module 函數返回 href img start 屬性 bin offset
WinSpy涉及的windows api
WinSpy是仿造微軟Spy++的開源項目,但只涉及Spy++的視窗控制代碼、視窗的屬性、styles、類名子視窗、進程線程資訊等尋找功能。功能雖然不算強大,但涉及到很多windows api,是瞭解windows api的一個有用工具。WinSpy介面如下:
1:拖拽瞄準鏡表徵圖擷取視窗的HWND
核心api:ClientToScreen、WindowFromPoint、EnumChildWindows、GetParent、GetWindowLong、SetWindowLong
1.1 WindowFromPoint
HWND WindowFromPoint(POINT Point);
View Code
根據案頭座標擷取到window的HWND。返回NULL表示沒有視窗在該point下。
1.2 ClientToScreen
BOOL ClientToScreen( HWND hWnd, // handle to windowLPPOINT lpPoint // screen coordinates);
View Code
將用戶端相對座標轉換為案頭座標,是WindowFromPoint的前提。函數調用成功,返回非0值。否則,返回0.
1.3 GetParent
HWND GetParent( HWND hWnd );
View Code
返回當前HWND的父視窗HWND。如果該視窗無父視窗或者函數調用失敗,返回NULL。
1.4 GetWindowLong
LONG GetWindowLong( HWND hWnd, int nIndex);
View Code
該函數獲得有關指定視窗的資訊,函數也獲得在額外視窗記憶體中指定位移位地址的32位度整型值(該整形值也可用於傳入的函數指標或視窗過程地址)。調用成功返回32位整形值,失敗返回0.可用GetLastError擷取失敗資訊。可擷取的視窗資訊的類型如下:
GWL_EXSTYLE;獲得擴充視窗風格。
GWL_STYLE:獲得視窗風格。
GWL_WNDPROC:獲得視窗過程的地址,或代表視窗過程的地址的控制代碼。必須使用CallWindowProc函數調用視窗過程,CallWindowProc函數用於給指定視窗的視窗過程發訊息。原型如下:
1 LRESULT CallWindowProc( 2 WNDPROC lpPrevWndFunc, 3 HWND hWnd, 4 UINT Msg, 5 WPARAM wParam, 6 LPARAM lParam );
View Code
GWL_HINSTANCE:獲得應用案例的控制代碼。
GWL_HWNDPAAENT:如果父視窗存在,獲得父視窗控制代碼。
GWL_ID:獲得視窗標識。
GWL_USERDATA:獲得與視窗有關的32位值。每一個視窗均有一個由建立該視窗的應用程式使用的32位值。
在hWnd參數標識了一個對話方塊時也可用下列值:
DWL_DLGPROC:獲得對話方塊過程的地址,或一個代表對話方塊過程的地址的控制代碼。必須使用函數CallWindowProc來調用對話方塊過程。
DWL_MSGRESULT:獲得在對話方塊過程中一個訊息處理的傳回值。
DWL_USER:獲得應用程式私人的額外資訊,例如一個控制代碼或指標。
1.5 SetWindowLong
1 LONG SetWindowLong( 2 HWND hWnd, 3 int nIndex, 4 LONG dwNewLong);
View Code
與GetWindowLong對應,用於修改視窗的屬性。屬性類型與GetWindowLong一樣。傳回值0表示調用失敗,用GetLastError查詢錯誤資訊。
1.6 EnumChildWindows
1 BOOL EnumChildWindows( 2 HWND hWndParent,3 WNDENUMPROC lpEnumFunc,4 LPARAM lParam5 );
View Code
用於枚舉父視窗下所有的子視窗,通過回掉函數WNDENUMPROC lpEnumFunc處理子視窗。函數將堵塞直至所用子視窗被枚舉,或者回掉函數返回FALSE。回掉函數的格式為:
1 BOOL CALLBACK EnumChildProc( 2 HWND hwnd,3 LPARAM lParam4 );
View Code
2:General頁相關api
general頁包含了視窗的一些基本資料,核心api有GetClassName、IsWindowUnicode、GetWindowRect、GetClientRect、OffsetRect、MapWindowPoints、GetClassLong。
2.1 GetClassName
1 int GetClassName( 2 HWND hWnd, 3 LPTSTR lpClassName, 4 int nMaxCount);
View Code
獲得指定視窗所屬的類的類名。第二個參數傳入待接收類名的緩衝區,第三個參數為緩衝區長度。傳回值為返回字串的長度,傳回值為0表示調用失敗。
2.2 IsWindowUnicode
BOOL IsWindowUnicode( HWND hWnd);
View Code
判斷window的字元集是否是unicode。一個視窗的字元集是由函數RegisterClass決定的。如果視窗類別是以ANSI版的RegisterClass ( RegjsterClassA)註冊的,則視窗字元集是ANSI的;如果視窗類別是以Unicode版的Registerclass( RegisterClassW)註冊的,則視窗字元集是Unicode。
2.3 GetWindowRect
BOOL GetWindowRect( HWND hWnd, LPRECT lpRect );
View Code
返回指定視窗的邊框矩形的視窗的左上方和右下角的螢幕座標。螢幕座標座標系。
2.4 GetClientRect
BOOL GetClientRect( HWND hWnd, LPRECT lpRect );
View Code
返回指定視窗的邊框矩形的視窗的左上方和右下角的客戶區座標。客戶區座標系。
2.5 OffsetRect
1 BOOL OffsetRect( 2 LPRECT lprc, // rectangle 3 int dx, // horizontal offset4 int dy // vertical offset);
View Code
指定的矩形移動到指定的位置,傳回值非0成功,0失敗。
2.6 MapWindowPoints
1 int MapWindowPoints( 2 HWND hWndFrom, // handle to source window3 HWND hWndTo, // handle to destination window4 LPPOINT lpPoints, // array of points to map5 UINT cPoints // number of points in array);
View Code
把相對於一個視窗的座標空間的一組點映射成相對於另一視窗的座標空間的一組點。如果函數調用成功,傳回值的低位字是每一個源點的水平座標的像素數目,以便計算每個目標點的水平座標;高位字是每一個源點的垂直座標的像素的數目,以便計算每個目標點的垂直座標,如果函數調用失敗,傳回值為零。
hWndFrom或To參數為NULL或HWND_DESKTOP,則假定這些點在螢幕座標上。可代替ScreenToClient或ClientToScreen使用。
2.7 GetClassLong
DWORD GetClassLong( HWND hWnd, int nIndex);
View Code
返回與指定視窗相關的WNDCLASSEX結構的指定32位值。
GCSW原子:獲得一個唯一標識視窗類別的原子值,該值與RegisterClassEx函數的傳回值相同。GCL_CBWNDEXTRA:獲得與類中的每個視窗相關的額外視窗中記憶體空間的位元組大小,進入該儲存空間的方法請參看GetWindowLong。GCL_HBRBACKGROUND:獲得與類有關的背景刷子的控制代碼。GCL_HCURSOR:獲得與類有關的游標的控制代碼。GCL_HICON:獲得與類有關的表徵圖的控制代碼。GCL_HICONSM:獲得與類有關的小表徵圖的控制代碼。GCL_HMOUDLE:獲得註冊該類的模組的控制代碼。GCL_MENUNAME:獲得菜單名字串的地址,該字串標識了與類有關的菜單資源。GCL_STYLE:獲得視窗類別的風格位。GCL_WNDRPOC:獲得與類有關的視窗過程的地址。傳回值:如果函數成功,傳回值是所需的32位值;如果函數失敗,傳回值為0。若想獲得更多錯誤資訊,請調用GetLastError函數。3:Styles頁相關api
4:Properities頁相關api
核心api:EnumPropsEx
4.1 EnumPropsEx
int EnumPropsEx( HWND hWnd, PROPENUMPROCEX lpEnumFunc, LPARAM lParam);
View Code
將視窗屬性工作表中的所有項列舉出來,依次傳送給指定的回呼函數,直到列舉到最後一項,或者回呼函數返回FALSE為止。該函數提供了COM組件OLE相關的屬性。
5:Class頁相關api
核心api:GetClassLong、GetClassInfoEx
5.1 GetClassInfoEx
BOOL GetClassInfoEx( HINSTANCE hinst, LPCTSTR lpszClass, LPWNDCLASSEX lpwcx);
View Code
尋找視窗類別的相關資訊。第二個參數傳入視窗類別的名稱,該類必須由RegisterClass或RegisterClassEx註冊過。第三個參數用於接收類資訊。
6:Windows頁相關api
核心api:EnumChildWindows、GetParent
7:Process頁相關api
核心api:OpenProcess、GetWindowThreadProcessId、GetModuleBaseName 、GetModuleFileNameEx、EnumProcessModules
7.1 OpenProcess
HANDLE OpenProcess( DWORD fdwAccess, BOOL fInherit, DWORD IDProcess);
View Code
OpenProcess 函數用來開啟一個已存在的進程對象,並返回進程的控制代碼。參數如下取值:
dwDesiredAccess:想擁有的該進程存取權限
PROCESS_ALL_ACCESS //所有能獲得的許可權
PROCESS_CREATE_PROCESS //需要建立一個進程
PROCESS_CREATE_THREAD //需要建立一個線程
PROCESS_DUP_HANDLE //重複使用DuplicateHandle控制代碼
PROCESS_QUERY_INFORMATION //獲得進程資訊的許可權,如它的結束代碼、優先順序
PROCESS_QUERY_LIMITED_INFORMATION /*獲得某些資訊的許可權,如果獲得了PROCESS_QUERY_INFORMATION,也擁有PROCESS_QUERY_LIMITED_INFORMATION許可權*/
PROCESS_SET_INFORMATION //設定某些資訊的許可權,如進程優先順序
PROCESS_SET_QUOTA //設定記憶體限制的許可權,使用SetProcessWorkingSetSize
PROCESS_SUSPEND_RESUME //暫停或恢複進程的許可權
PROCESS_TERMINATE //終止一個進程的許可權,使用TerminateProcess
PROCESS_VM_OPERATION //操作進程記憶體空間的許可權(可用VirtualProtectEx和WriteProcessMemory)
PROCESS_VM_READ //讀取進程記憶體空間的許可權,可使用ReadProcessMemory
PROCESS_VM_WRITE //讀取進程記憶體空間的許可權,可使用WriteProcessMemory
SYNCHRONIZE //等待進程終止
bInheritHandle:表示所得到的進程控制代碼是否可以被繼承
dwProcessId:被開啟進程的PID
傳回值為指定進程的控制代碼。如失敗,傳回值為NULL,可調用GetLastError()獲得錯誤碼。
7.2 GetWindowThreadProcessId
DWORD GetWindowThreadProcessId( HWND hWnd, LPDWORD lpdwProcessId );
View Code
找出某個視窗的建立者(線程或進程),返回建立者的進程ID和線程ID。傳回值是線程ID,第二個參數返回進程ID。
7.3 GetModuleBaseName
DWORD WINAPI GetModuleBaseName( __in HANDLE hProcess, __in HMODULE hModule, __out LPTSTR lpBaseName, __in DWORD nSize);
View Code
第三個參數返回模組的名稱。傳回值表示寫入緩衝區字串的長度,0表示調用失敗。
7.4 GetModuleFileNameEx
DWORD WINAPI GetModuleFileNameEx( __in HANDLE hProcess, __in HMODULE hModule, __out LPTSTR lpFilename, __in DWORD nSize);
View Code
擷取模組的全路徑。傳回值表示寫入緩衝區字串的長度,0表示調用失敗。
7.5 EnumProcessModules
BOOL WINAPI EnumProcessModules( __in HANDLE hProcess, __out HMODULE* lphModule, __in DWORD cb, __out LPDWORD lpcbNeeded);
View Code
枚舉進程下所有的模組,用第二個參數接收。返回0表示調用失敗。
WinSpy涉及的windows api