Win32ASM-进程学习【2】

获取运行中的句柄

 

1.从窗口句柄中获取进程句柄

要对进程进行某种操作,就必须首先知道该进程的句柄或者进程ID

对于自己创建的子进程来说CreateProcess函数返回了子进程句柄和进程的ID

但是如果如果要对系统中运行的某个进程进行操作,那么首先获取他们的句柄才行

 

如果知道某个进程的ID

那么可以通过GetWindowThreadProcessID hWnd,lpdwProcessID

该函数可以从一个窗口句柄中获取创建该窗口的进程的进程ID

hWnd指明一个窗口句柄--可以通过FIndWindow来获得这个窗口句柄

lpdwProcessID指向一个双字节的变量,函数在这里返回创建窗口进程的ID

函数的返回值是目标进程中创建该窗口的线程的线程ID

 

得到进程ID后,就可以通过OpenProcess函数来获取该进程的句柄了

OpenProcess dwDesiredAccess,bInheritHandle,dwProcessID

dwDesireAccess 指定需要对该进程进行的操作,要对目标进程进行某种操作

一般来说,除了系统进程以外,可以对其他函数进行任何操作,操作码可以取以下取值的组合

PROCESS_ALL_ACCESS  等于下面全部操作的组合

PROCESS_CREATE_THREAD 允许创建远程线程

PROCESS_DUP_HANDLE 允许进程句柄被复制

PROCESS_QUERY_INFORMATION 允许使用GetExitCodeProcess查询进程退出码和使用GetPriorityClass函数查询进程的优先级

PROCESS_SET_INFORMATION  允许使用SetPriorityClass函数设置进程优先级

PROCESS_VM_OPERATION 允许使用WriteProcessMemory 和 VirtualProtectEx函数修改进程的地址空间

PROCESS_VM_READ 允许对进程空间进行读操作

PROCESS_WRITE 允许对进程地址空间进行写操作

 

bInheritHandle 指明返回的进程句柄是否可以被当前进程的子进程继承,如果参数指定为TRUE,则进程句柄可以被继承

dwProcessID指明目标进程的ID

如果函数成功执行,返回的是被打开的进程句柄,如果函数执行失败则返回NULL.一般打开失败的原因是由于权限不够引起的,当完成对目标进程的操作之后,必须使用CloseHandle将获得的句柄关闭

 

2.从快照函数获取进程句柄

(1)

使用GetWindowThreadProcessID获取进程的先决条件是必须创建了窗口,对于在后台运行的没有窗口的进程该如何处理呢?

这就可以通过枚举系统中运行的进程来解决了,这个功能可以由CreateToolHelp32Snapshot函数来实现

CreateToolHelp32Snapshot dwFlags,th32ProcessID

dwFlags 用来指定快照中需要返回的对象,本函数不仅可以获取进程列表,也可以用来获取线程和模块等对象的列表,参数可以指定的值是:

TH32CS_SNAPHEAPLIST 对指定进程中的堆进行枚举

TH32CS_SNAPMODULE 对指定进程中的模块进行枚举

TH32CS_SNAPPROCESS 对系统范围中的进程进行枚举

TH32CS_SNAPTHREAD 对系统范围中的线程进行枚举

th32ProcessID参数用来指定一个进程ID  对于TH32CS_SNAPPROCESS 和TH32CS_SNAPTHREAD这个参数可以为0

因为后2者是对系统范围内的枚举

 

如果函数执行成功返回一个快照句柄,否则返回-1

 

(2)从快照句柄中获取进程参数使用Process32First和Process32Next函数

Process32Next函数循环获取快照句柄中的进程信息,当不在有剩余信息时,函数返回FALSE

Process32First和Process32Next的第一参数指向一个快照句柄,第2个参数指向一个PROCESSENTRY32结构

Process32Next hSnapshot,lpProcessEntry32

结构定义如下

<span style="font-family:Microsoft YaHei;font-size:13px;">typedef struct tagPROCESSENTRY32 
{  
DWORD dwSize;                           结构的长度
DWORD cntUsage;                         进程的引用计数
DWORD th32ProcessID;                    进程ID
ULONG_PTR th32DefaultHeapID;            进程默认堆的ID
DWORD th32ModuleID;                     进程模块的ID
DWORD cntThreads;                       被进程创建的线程数
DWORD th32ParentProcessID;              进程的父进程ID
LONG pcPriClassBase;                    被进程创建的线程的基本优先级
DWORD dwFlags;                          内部使用
TCHAR szExeFile[MAX_PATH];              进程对应的可执行文件名称
} PROCESSENTRY32,  
*PPROCESSENTRY32;

</span>

在返回所有进程信息之后,需要使用CloseHandle将快照句柄关闭

在结构体中返回的进程ID(th32ProcessID)和可执行的文件名(szExeFile)是我们最关心的

这样我们就可以通过OpenProcess来对进程进行各种操作了

 

另外在ListBox能够为每一项自定义一个32位的自定义数据

LB_SETITEMDATA  和 LB_GETITEMDATA可以设置和获取自定义数据

正好可以把th32ProcessID设置进去......

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值