VC++远程注入动态库的实现(6-2)

相关视频教程链接:http://pan.baidu.com/s/1kVxapKF 密码:7bat

3.2 显示当前进程

显示当前进程的基本原理是获取当前进程的快照,之后遍历快照中的所有进程,并把进程名称在CComboBox中显示出来。

为注入程序对应的对话框类添加名为ShowProcesses()函数,该函数完成显示当前进程的功能。

3.2.1 获取当前进程“快照”

ShowProcesses()函数中,调用CreateToolhelp32Snapshot()函数实现获取当前进程“快照”的功能。该函数可以获取进程、堆、模块和线程的快照。

HANDLE WINAPI CreateToolhelp32Snapshot(

  DWORD dwFlags,

  DWORD th32ProcessID

);

CreateToolhelp32Snapshot()函数的第一个参数指定了要获取谁的快照;第二个参数指定了包含在快照中的进程ID,如果要获取的是堆或者模块的快照,该参数则指定了堆或者模块所在的进程ID,如果要获取的是进程的快照,则可以忽略该参数。函数的返回值是快照的句柄。

HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

其中,TH32CS_SNAPPROCESS表示要获取的是进程的快照,因此第二个参数可以设置为0hSnapshot是获取到的进程快照句柄。

3.2.2 遍历进程并显示

通过Process32First()函数和Process32Next()函数遍历快照中的进程,并且把进程的信息保存到PROCESSENTRY32结构的对象中。

Process32First()函数的作用是在进程快照中找到第一个进程;Process32Next()函数的作用是在进程快照中找到下一个进程。

BOOL WINAPI Process32First(

  _In_    HANDLE           hSnapshot,

  _Inout_ LPPROCESSENTRY32 lppe

);

BOOL WINAPI Process32Next(

  _In_  HANDLE           hSnapshot,

  _Out_ LPPROCESSENTRY32 lppe

);

其中,第一个参数是进程快照的句柄;第二个参数是PROCESSENTRY32结构的指针,用来保存找到的进程信息。

遍历快照中的进程并显示的代码如下所示:

PROCESSENTRY32 pe32;

pe32.dwSize = sizeof(PROCESSENTRY32);

int index = 0;

Process32First(hSnapshot, &pe32);

do

{

m_ProcessesName.InsertString(index, pe32.szExeFile);

index++;

} while (Process32Next(hSnapshot, &pe32));

其中,pe32PROCESSENTRY32结构的对象,在使用该结构的对象时,必须首先结构中表示结构大小的成员变量dwSize进行赋值;通过Process32First()函数获取快照中的第一个进程,hSnapshot是在“3.2.1获取当前进程“快照””中得到的快照句柄;通过do...while语句遍历“快照”中的所有进程,并且把进程的信息保存在pe32中;m_ProcessesName是图3-1中组合框控件的变量,添加该变量的方法为在VS2015的“资源编辑器”中选中CComboBox组合框控件,之后在右键菜单中选择“添加变量”,接下来在“添加成员变量向导”对话框中将“类别”设置为“Control”,“变量名”设置为“m_ProcessesName”,如图3-2所示。

 

3-2 为组合框控件添加变量

do...while语句中,通过m_ProcessesName调用CComboBox类的成员函数InsertString()将在“快照”中获取到的进程信息pe32.szExeFile“插入到组合框的下拉列表中,CComboBox::InsertString()函数的第一个参数表示插入内容在组合框下拉列表中的索引,第二个参数表示插入的内容。

3.2.3 释放资源

在遍历了“快照”中的所有进程之后,需要将“快照”句柄关闭。

CloseHandle(hSnapshot);

3.2.4 设置控件初始显示的内容

(1)设置组合框初始显示的内容

m_ProcessesName.SetCurSel(0);

其中,CComboBox::SetCurSel()函数的作用是设置组合框控件的显示内容,其函数为组合框列表中显示内容的索引,0表示在组合框中显示其列表框中第一个内容。

(2)设置编辑框初始显示的内容

在图3-1中,编辑框控件CEdit用于输入要注入的动态库名称。在编写的程序中,要注入的动态库名称是“MFC_Extent_DLL_Test.dll”,因此将该控件初始显示的内容设置为动态库的名称。

m_DLLName.SetWindowTextW(_T("MFC_Extent_DLL_Test.dll"));

其中,m_DLLName是编辑框控件CEdit对应的变量,添加的方法如“3.2.2遍历进程并显示”中介绍的方法。通过m_DLLName调用CEdit::SetWindowTextW()函数设置其初始显示的内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值