Windows黑客基础(2):获取其他进程的HANDLE
2013-06-12 16:46
651 查看
在windows下,不管是进程还是句柄或者文件,他们都可以抽象为一个HANDLE,如果有接触过linux编程的都知道,linux下一切皆文件,对进程,文件,socket的操作都是通过int来标识的,windows下的HANDLE概念也跟linux下的int概念差不多,都可以归结为类似与ID的数据类型,只是表示形式不一样,我们对于所有对象的操作都需要通过这个标识来传递
当然在WINDOWS下还包括HICON,HWND等,大部分都是UI相关的,我们值需要知道HWND是操作窗口的标识符,HICON是图标的标识符,我们后面将会讲到如何通过窗口来操作其他进程
如果我们要操作其他的进程,首先需要的肯定是要能够在自己的程序中拿到其他进程的标识符,在windows下为我们提供了OpenProcess这个函数
dwDesireAccess是操作权限,在本章节中设置为PROCESS_ALL_ACCESS
bInheritHandle,表示所得到的进程句柄是否可以被继承
dwProcessID,这个是最重要的,就是进程的ID
我们只要能想办法拿到进程的ID就可以对该进程进行操作了,那么我们怎么拿到进程的ID呢??
1.通过任务管理器
我们打开任务管理器,点击菜单栏的查看->选择列->把PID打上勾,然后我们返回任务管理器,有一行PID,就是我们需要的进程的ID了
![](http://images.cnitblog.com/blog/160857/201306/12142633-cb98a5fd6b4f4b0fb991ef538710d1de.jpg)
这个时候我们只要通过这个数值就可以调用OpenProcess来获取该进程的句柄了
2.通过HWND,即窗口
WINDOWS提供了一个API来让我们找到一个进程的窗口句柄,即FindWindows,同时,我们可以通过GetWindowThreadProcessID,我们只要传入通过FindWindow找到的HWND,然后传给GetWindowThreadProcessID就可以找到该进程的ID
3.查找进程名称
在Windows下,我们可以通过枚举系统所有进程的名称,然后根据进程的名称一个个地去比较来找到对应的进程ID
我们拿到进程的句柄以后,我们就可以干我们接下来的事情了,比如代码注入,比如偷取数据之类的
当然在WINDOWS下还包括HICON,HWND等,大部分都是UI相关的,我们值需要知道HWND是操作窗口的标识符,HICON是图标的标识符,我们后面将会讲到如何通过窗口来操作其他进程
如果我们要操作其他的进程,首先需要的肯定是要能够在自己的程序中拿到其他进程的标识符,在windows下为我们提供了OpenProcess这个函数
HANDLE OpenProcess(DWORD dwDesiredAccess,BOOL bInheritHandle,DWORD dwProcessId)
dwDesireAccess是操作权限,在本章节中设置为PROCESS_ALL_ACCESS
bInheritHandle,表示所得到的进程句柄是否可以被继承
dwProcessID,这个是最重要的,就是进程的ID
我们只要能想办法拿到进程的ID就可以对该进程进行操作了,那么我们怎么拿到进程的ID呢??
1.通过任务管理器
我们打开任务管理器,点击菜单栏的查看->选择列->把PID打上勾,然后我们返回任务管理器,有一行PID,就是我们需要的进程的ID了
![](http://images.cnitblog.com/blog/160857/201306/12142633-cb98a5fd6b4f4b0fb991ef538710d1de.jpg)
这个时候我们只要通过这个数值就可以调用OpenProcess来获取该进程的句柄了
HANDLE OpenProcessByID(const DWORD id) { return OpenProcess(PROCESS_ALL_ACCESS,FALSE,id); }
2.通过HWND,即窗口
WINDOWS提供了一个API来让我们找到一个进程的窗口句柄,即FindWindows,同时,我们可以通过GetWindowThreadProcessID,我们只要传入通过FindWindow找到的HWND,然后传给GetWindowThreadProcessID就可以找到该进程的ID
HANDLE OpenProcessByWindowName(const char *name) { HWND hWnd = FindWindow(NULL,name); if (hWnd != NULL) { DWORD ThreadID = -1; DWORD ProcessID = -1; ThreadID = GetWindowThreadProcessId(hWnd,&ProcessID); return OpenProcessByID(ProcessID); } return INVALID_HANDLE_VALUE; }
3.查找进程名称
在Windows下,我们可以通过枚举系统所有进程的名称,然后根据进程的名称一个个地去比较来找到对应的进程ID
HANDLE OpenProcessByProcessNmae(const char *name) { HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); if (hSnapshot == INVALID_HANDLE_VALUE) { CloseHandle(hSnapshot); return INVALID_HANDLE_VALUE; } PROCESSENTRY32 pe32; DWORD id = 0; pe32.dwSize = sizeof(PROCESSENTRY32); if ( !Process32First(hSnapshot,&pe32) ) { CloseHandle(hSnapshot); return INVALID_HANDLE_VALUE; } while ( 1 ) { pe32.dwSize = sizeof(PROCESSENTRY32); if (Process32Next(hSnapshot,&pe32) == FALSE) break; if ( strcmp(pe32.szExeFile,name)==0 ) { return OpenProcessByID(pe32.th32ProcessID); } } CloseHandle(hSnapshot); return INVALID_HANDLE_VALUE; }
我们拿到进程的句柄以后,我们就可以干我们接下来的事情了,比如代码注入,比如偷取数据之类的
相关文章推荐
- Windows黑客基础(1):Hook本进程的消息
- Windows获取其他进程中Edit控件的内容
- Windows核心编程学习四:GetModuleHandle获取进程的地址空间中的可执行文件的基地址
- WINDOWS黑客基础(4):查找进程运行的基址
- WINDOWS黑客基础(5):利用内存来进行获取计算结果
- Windows下获取Dump文件以及进程下各线程调用栈的方法总结(转)
- MFC启动其他MFC进程,并传递参数,同时获取参数
- 背水一战 Windows 10 (76) - 控件(控件基类): Control - 基础知识, 焦点相关, 运行时获取 ControlTemplate 和 DataTemplate 中的元素
- windows基础编程 - 进程和线程
- delphi获取Windows系统的进程运行信息
- DELPHI 跨进程获取其他程序的DBGrid内容
- windows核心编程-获取进程中堆的分配情况
- 在shell中获取其他进程的pid
- Windows编程基础 第十四章 进程 作业 线程 线程局部存储
- 如何利用Java获取进程的信息(通过tasklist和cmd与Windows进行交互)
- windows获取其他程序窗口的内容
- GetProcessHandleCount() -- 获取属于指定进程的已打开句柄数
- 获取Windows系统的进程运行信息
- 获取其他进程的fs寄存器
- [linux基础] 通过进程id获取运行程序的程序名称