获取不到"任务管理器"的句柄

题目描述

练习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;
}
阅读 1.7k
1 个回答
✓ 已被采纳新手上路,请多包涵

这个问题解决了,
使用GetLastError()获取错误码,结果是5, 拒绝访问
原来是权限不够
生成exe文件,以管理员身份运行就行了。
哎,GetLastError()是好东西,却没习惯使用

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题