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获得错误代码