win32两种获取进程句柄的方式

获取进程句柄

获取进程句柄的方式有很多种,之前有说到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。不同的函数对应的结构也不一样。
 

 

 

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值