1.搜索windows 經過進程類名或者標題 FindWindow編程
HWND FindWindow ( LPCSTR lpClassName, LPCSTR lpWindowName ); VC++中 頭文件:afxwin.h 參數表 lpClassName 指向一個以NULL字符結尾的、用來指定類名的字符串或一個能夠肯定類名字符串的原子。若是這個參數是一個原子,那麼它必須是一個在調用此函數前已經經過GlobalAddAtom函數建立好的全局原子。這個原子(一個16bit的值),必須被放置在lpClassName的低位字節中,lpClassName的高位字節置零。 若是該參數爲null時,將會尋找任何與lpWindowName參數匹配的窗口。 lpWindowName 指向一個以NULL字符結尾的、用來指定窗口名(即窗口標題)的字符串。若是此參數爲NULL,則匹配全部窗口名。 返回值 若是函數執行成功,則返回值是擁有指定窗口類名或窗口名的窗口的句柄。 若是函數執行失敗,則返回值爲 NULL 。能夠經過調用GetLastError函數得到更加詳細的錯誤信息。 C#中 導入庫:user32.lib 頭文件:winuser.h ***.Net 中運用 命名空間 using System.Runtime.InteropServices; 導入庫 [DllImport("user32.dll")] 函數原型 public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 參數說明 lpClassName String,指向包含了窗口類名的空停止(C語言)字串的指針;或設爲零,表示接收任何類 lpWindowName String,指向包含了窗口文本(或標籤)的空停止(C語言)字串的指針;或設爲零,表示接收 任何窗口標題 返回值 :句柄
2. 獲取進程的PID GetWindowThreadProcessIdc#
1.函數原型 DWORD GetWindowThreadProcessId( HWND hWnd, LPDWORD lpdwProcessId ); 2.參數 hWnd[in] (向函數提供的)被查找窗口的句柄. lpdwProcessId[out] 進程號的存放地址(變量地址) Pointer to a variable that receives the process identifier. If this parameter is not NULL, GetWindowThreadProcessId copies the identifier of the process to the variable; otherwise, it does not. (若是參數不爲NULL,即提供了存放處--變量,那麼本函數把進程標誌拷貝到存放處,不然不動做。) 3.返回值 The return value is the identifier of the thread that created the window. 返回線程號,注意,lpdwProcessId 是存放進程號的變量。返回值是線程號,lpdwProcessId 是進程號存放處。 固然能夠把答案再放到其它地方。 如 DWORD dwPID, dwTID; dwTID = GetWindowThreadProcessId( hWnd, &dwPID ); 4.函數相關信息 頭文件聲明 Winuser.h, 包含頭文件 Windows.h 導入庫 User32.lib 操做系統最小支持 Windows 95, Windows NT 3.1 c#聲明 [DllImport("User32.dll", CharSet = CharSet.Auto)] public static extern int GetWindowThreadProcessId(IntPtr hwnd, out int ID); 實例 int calcID=0; int calcTD=0; calcTD = GetWindowThreadProcessId(FrmMain.mainhWnd, out calcID); 返回值calcTD爲線程ID 輸出值calcID爲進程ID
3. 打開一個具備操做權限的句柄 OpenProcesswindows
OpenProcess 函數用來打開一個已存在的進程對象,並返回進程的句柄。 1.函數原型 HANDLE OpenProcess( DWORD dwDesiredAccess, //渴望獲得的訪問權限(標誌) BOOL bInheritHandle, // 是否繼承句柄 DWORD dwProcessId// 進程標示符 ); C# 聲明 須要導入庫 Kernel32.dll 2.返回值: 如成功,返回值爲指定進程的句柄。 如失敗,返回值爲空,可調用GetLastError得到錯誤代碼。 3.舉例 HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, pID );
4. 操做內存,讀取進程的內存數據 ReadProcessMemory歸屬爲爲編程中的內存操做函數, 其做用爲根據進程句柄讀入該進程的某個內存空間。緩存
函數原型爲 BOOL ReadProcessMemory( HANDLE hProcess, LPCVOID lpBaseAddress, LPVOID lpBuffer, DWORD nSize, LPDWORD lpNumberOfBytesRead ); 由布爾聲明能夠看出, 當函數讀取成功時返回1, 失敗則返回0。 要求 系統版本: Windows CE 2.0 and later. 頭文件: Winbase.h. 連接庫: Coredll.lib, Nk.lib. 實際應用 hProcess [in]遠程進程句柄。 被讀取者 pvAddressRemote [in]遠程進程中內存地址。 從具體何處讀取 pvBufferLocal [out]本地進程中內存地址. 函數將讀取的內容寫入此處 dwSize [in]要傳送的字節數。要寫入多少 pdwNumBytesRead [out]實際傳送的字節數. 函數返回時報告實際寫入多少 C# 聲明 /// <summary> /// 從指定內存中讀取字節集數據 /// </summary> /// <param name="handle">進程句柄</param> /// <param name="address">內存地址</param> /// <param name="data">數據存儲變量</param> /// <param name="size">長度</param> /// <param name="read">讀取長度</param> [DllImport("Kernel32.dll")] private static extern void ReadProcessMemory(IntPtr handle, uint address, [Out] byte[] data, int size, int read);
5. 內存操做,寫入進程內存數據 WriteProcessMemory安全
VC++聲明 BOOL WriteProcessMemory( HANDLE hProcess, LPVOID lpBaseAddress, LPVOID lpBuffer, DWORD nSize, LPDWORD lpNumberOfBytesWritten ); 參數: hProcess 由OpenProcess返回的進程句柄。 如參數傳數據爲 INVALID_HANDLE_VALUE 【即-1】目標進程爲自身進程 lpBaseAddress 要寫的內存首地址 再寫入以前,此函數將先檢查目標地址是否可用,並能容納待寫入的數據。 lpBuffer 指向要寫的數據的指針。 nSize 要寫入的字節數。 返回值 非零值表明成功。 可用GetLastError獲取更多的錯誤詳細信息。 要求 操做系統版本: Windows CE 2.0及以上版本。 所在頭文件: Winbase.h 連接庫: Nk.lib C#聲明
6. 遠程代碼注入 VirtualAllocExide
VirtualAllocEx 函數的做用是在指定進程的虛擬空間保留或提交內存區域,除非指定MEM_RESET參數,不然將該內存區域置0。函數
函數原形: LPVOID VirtualAllocEx( HANDLE hProcess, LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWORD flProtect ); hProcess: 申請內存所在的進程句柄。 lpAddress: 保留頁面的內存地址;通常用NULL自動分配 。 dwSize: 欲分配的內存大小,字節單位;注意實際分 配的內存大小是頁內存大小的整數倍 flAllocationType 可取下列值: MEM_COMMIT:爲特定的頁面區域分配內存中或磁盤的頁面文件中的物理存儲 MEM_PHYSICAL :分配物理內存(僅用於地址窗口擴展內存) MEM_RESERVE:保留進程的虛擬地址空間,而不分配任何物理存儲。保留頁面可經過繼續調用VirtualAlloc()而被佔用 MEM_RESET :指明在內存中由參數lpAddress和dwSize指定的數據無效 MEM_TOP_DOWN:在儘量高的地址上分配內存(Windows 98忽略此標誌) MEM_WRITE_WATCH:必須與MEM_RESERVE一塊兒指定,使系統跟蹤那些被寫入分配區域的頁面(僅針對Windows 98) flProtect可取下列值: PAGE_READONLY: 該區域爲只讀。若是應用程序試圖訪問區域中的頁的時候,將會被拒絕訪 PAGE_READWRITE 區域可被應用程序讀寫 PAGE_EXECUTE: 區域包含可被系統執行的代碼。試圖讀寫該區域的操做將被拒絕。 PAGE_EXECUTE_READ :區域包含可執行代碼,應用程序能夠讀該區域。 PAGE_EXECUTE_READWRITE: 區域包含可執行代碼,應用程序能夠讀寫該區域。 PAGE_GUARD: 區域第一次被訪問時進入一個STATUS_GUARD_PAGE異常,這個標誌要和其餘保護標誌合併使用,代表區域被第一次訪問的權限 PAGE_NOACCESS: 任何訪問該區域的操做將被拒絕 PAGE_NOCACHE: RAM中的頁映射到該區域時將不會被微處理器緩存(cached) 注:PAGE_GUARD和PAGE_NOCHACHE標誌能夠和其餘標誌合併使用以進一步指定頁的特徵。PAGE_GUARD標誌指定了一個防禦頁(guard page),即當一個頁被提交時會因第一次被訪問而產生一個one-shot異常,接着取得指定的訪問權限。PAGE_NOCACHE防止當它映射到虛擬頁的時候被微處理器緩存。這個標誌方便設備驅動使用直接內存訪問方式(DMA)來共享內存塊。 返回值: 執行成功就返回分配內存的首地址,不成功就是NULL。
7.建立遠程線程 CreateRemoteThreadui
CreateRemoteThread是建立一個在其它進程地址空間中運行的線程(也稱:建立遠程線程).。this
函數原型 HANDLE WINAPI CreateRemoteThread( __in HANDLE hProcess, __in LPSECURITY_ATTRIBUTES lpThreadAttributes, __in SIZE_T dwStackSize, __in LPTHREAD_START_ROUTINE lpStartAddress, __in LPVOID lpParameter, __in DWORD dwCreationFlags, __out LPDWORD lpThreadId ); 參數說明 hProcess [in] 線程所屬進程的進程句柄. 該句柄必須具備 PROCESS_CREATE_THREAD, PROCESS_QUERY_INFORMATION, PROCESS_VM_OPERATION, PROCESS_VM_WRITE,和PROCESS_VM_READ 訪問權限. lpThreadAttributes [in] 一個指向 SECURITY_ATTRIBUTES 結構的指針, 該結指定了線程的安全屬性. dwStackSize [in] 線程初始大小,以字節爲單位,若是該值設爲0,那麼使用系統默認大小. lpStartAddress [in] 在遠程進程的地址空間中,該線程的線程函數的起始地址. lpParameter [in] 傳給線程函數的參數. dwCreationFlags [in] 線程的建立標誌. 值 含義 0 線程建立後當即運行 CREATE_SUSPENDED 0x00000004 線程建立後先將線程掛起,直到 ResumeThread 被調用. STACK_SIZE_PARAM_IS_A_RESERVATION 0x00010000 dwStackSize 參數指定爲線程棧預訂大小,若是STACK_SIZE_PARAM_IS_A_RESERVATION沒有被指定,dwStackSize 參數指定爲線程棧分配大小. lpThreadId [out] 指向所建立線程句柄的指針,若是建立失敗,該參數爲NULL. 函數返回值 若是調用成功,返回新線程句柄. 若是失敗,返回NULL. 要求 最低支持客戶端系統 Windows 2000 Professional 最低支持服務端系統 Windows 2000 Server 頭文件 inbase.h (include Windows.h) 庫 Kernel32.lib DLL Kernel32.dll
8.等待遠程線程執行完畢 WaitForSingleObject操作系統
Windows API函數。當等待仍在掛起狀態時,句柄被關閉,那麼函數行爲是未定義的。該句柄必須具備 SYNCHRONIZE 訪問權限。
說明 DWORD WINAPI WaitForSingleObject( __in HANDLE hHandle, __in DWORD dwMilliseconds ); 參數 hHandle[in]對象句柄。能夠指定一系列的對象,如Event、Job、Memory resource notification、Mutex、Process、Semaphore、Thread、Waitable timer等。 dwMilliseconds[in]定時時間間隔,單位爲milliseconds(毫秒).若是指定一個非零值,函數處於等待狀態直到hHandle標記的對象被觸發,或者時間到了。若是dwMilliseconds爲0,對象沒有被觸發信號,函數不會進入一個等待狀態,它老是當即返回。若是dwMilliseconds爲INFINITE,對象被觸發信號後,函數纔會返回。 返回值 執行成功,返回值指示出引起函數返回的事件。它可能爲如下值: WaitForSingleObject函數用來檢測hHandle事件的信號狀態,在某一線程中調用該函數時,線程暫時掛起,若是在掛起的dwMilliseconds毫秒內,線程所等待的對象變爲有信號狀態,則該函數當即返回;若是超時時間已經到達dwMilliseconds毫秒,但hHandle所指向的對象尚未變成有信號狀態,函數照樣返回。參數dwMilliseconds有兩個具備特殊意義的值:0和INFINITE。若爲0,則該函數當即返回;若爲INFINITE,則線程一直被掛起,直到hHandle所指向的對象變爲有信號狀態時爲止。 WAIT_ABANDONED 0x00000080:當hHandle爲mutex時,若是擁有mutex的線程在結束時沒有釋放核心對象會引起此返回值。 WAIT_OBJECT_0 0x00000000 :指定的對象出有有信號狀態 WAIT_TIMEOUT 0x00000102:等待超時 WAIT_FAILED 0xFFFFFFFF :出現錯誤,可經過GetLastError獲得錯誤代碼