题目描述
练习dll注入的代码时,以“任务管理器”为目标,在取得了pid的情况下,OpenProcess无法获得“任务管理器”的句柄, 不知道为什么。
改其它窗口却没问题,
请问:是不是“任务管理器”有什么特殊之处?
相关代码
#include "windows.h"
#include <stdio.h>
#include "InsertDLL.h"
int main()
{
//获取“任务管理器”窗口
//HWND hwnd = FindWindowExA(NULL, NULL, NULL, "任务管理器");
HWND hwnd = FindWindowA(NULL,"任务管理器");
//创建一个 InsertDLL对象
InsertDLL DllOP;
if (!DllOP.Up())
{
printf("升权失败!\n");
system("pause");
return 0;
}
HANDLE hProc = DllOP.GetProcessHandle_byHwnd(hwnd);
if (NULL == hProc)
{
printf("未能从窗口取得进程!\n");
system("pause");
return 0;
}
//经测试,在开启任务管理器之后,能获取到正确的pid,但获取的hProc为0x00000000
//程序调试结果是打印:未能从窗口取得进程!
//开始注入
char * DllPath = "F:\\Hook_OpenProcess.dll";
DllOP.DoInjection(DllPath, hProc);
system("pause");
return 0;
}
InsertDLL.cpp中的GetProcessHandle_byHwnd函数如下:
HANDLE InsertDLL::GetProcessHandle_byHwnd(HWND hwnd)
{
DWORD pid;
GetWindowThreadProcessId(hwnd, &pid);
HANDLE hProcee = ::OpenProcess(PROCESS_ALL_ACCESS | PROCESS_CREATE_THREAD, 0, pid);
return hProcee;
}
这个问题解决了,
使用GetLastError()获取错误码,结果是5, 拒绝访问
原来是权限不够
生成exe文件,以管理员身份运行就行了。
哎,GetLastError()是好东西,却没习惯使用