获取进程句柄
获取进程句柄的方式有很多种,之前有说到CreateProcess函数,该函数在一个进程中打开另一个进程,并且得到子进程的句柄,不过有时候我们更想获得正在运行的进程的句柄。获取正在运行的进程句柄也有几种方式,下面介绍一下几个函数。
FindWindow
invoke FindWindow,lpClassName,lpWindowName
该函数返回一个窗口句柄,第一个参数指向要取得句柄的窗口类的名称,第二个参数指向窗口的标题。
GetWindowThreadProcessId
invoke GetWindowThreadProcessId,hWnd,lpdwProcessId
该函数获取创建窗口的进程的ID。第一个参数就是要获取ID的进程创建的窗口的句柄。第二个参数指向一个双字变量,函数会返回 进程的ID到里面。
OpenProcess
invoke OpenProcess,dwDesireAccess,bInheritHandle,dwProcessId
.if eax
mov hProcess,eax
.endif
该函数通过进程ID获得进程的句柄。
- dwDesiredAccess:指定需要对该进程进行的操作,指定操作需要操作代码,操作代码可以在MSDN中查看。
- bInheritHandle:指明返回的句柄是否可以被当前进程的子进程继承,如果参数指定为TRUE,那么句柄可以被继承。
- dwProcessId:指定目标进程的进程ID。
函数执行成功返回被打开的进程的句柄,如果失败则返回NULL,这个时候可能时因为权限不够。如果我们不需要再对该进程进行操作了,一定要用CloseHandle函数将获得的句柄关闭。
按照以上的顺序使用函数,就能获得一个已经打开的进程的句柄。
第二种方法就是通过快照函数获得进程的句柄。快照,也就是说该函数会像照相一样,获取一下当前系统这一刻的进程的状态。
通过快照函数可以获取一个进程的列表,还可以获取获取线程和模块等对象的列表。
CreateToolhelp32Snapshot
invoke CreateToolhelp32Snapshot,dwFlags,th32ProcessID
.if eax
mov hSnapShot,eax
.endif
dwFlags参数用来指定快照中需要返回的对象,参数可以指定对进程中的堆进行枚举,对进程中的模块进行枚举,对系统范围内进程进行枚举,对系统范围内的线程进行枚举。
后面一个参数用来指定一个进程ID,当dwFlags参数指定为进行系统范围的枚举时,这个会自动忽略。
该函数执行成功后返回一个快照句柄,然后我们可以通过两个函数来获得系统里所有进程的信息。
Process32First
invoke Process32First,hSnapShot,offset stProcess
该函数用来进行首次调用。第一个参数是之前获得的快照句柄。第二个参数指向一个结构。
PROCESSENTRY32结构
PROCESSENTRY32 STRUCT
dwSize DWORD ?
cntUsage DWORD ?
th32ProcessID DWORD ? ;进程ID
th32ModuleID DWORD ? ;进程默认堆的ID
cntThreads DWORD ? ;进程模块的ID
th32ParentProcessID DWORD ? ;
pcPriClassBase DWORD ? ;进程的父进程的ID
dwFlags DWORD ?
szExeFile db MAX_PATH dup(?) ;进程对应的可执行文件名
PROCESSENTRY32 ENDS
函数执行成功后进程的信息就会返回到这个结构中。但是在使用函数前要先将结构中的dwSize字段填写为结构的长度。
用该函数首次获取进程的信息后,后面再到循环中用Process32Next函数获取剩余的进程的信息。获取进程的顺序是按照26个英文字母的顺序来的。
这两个函数是通过快照获取进程的函数,前面讲过快照函数还可以获取线程,堆,模块的信息。对应的函数:Thread32First,Thread32Next,Heap32First,Heap32Next,Module32First,Module32Next。不同的函数对应的结构也不一样。