WindowsAero 2024-02-28 22:48 采纳率: 0%
浏览 13

通过进程名获取PID失败

按照网上的CreateToolhelp32Snapshot、Process32First和Process32Next方法获取PID,为什么每次都失败。如这个,任务管理器已经打开,但是显示没有找到。前面代码:

int main()

{

int Ans;                 //用来输入控制程序执行

HANDLE hDevice = NULL;

BOOLEAN bRes = FALSE;       //输出缓冲区,用来判断是否Hook成功

DWORD dwRetLength = 0;       //接受缓冲区长度



if (InstallService())

{

    // 获取设备句柄

    hDevice = CreateFile(LINK_NAME, GENERIC_READ | GENERIC_WRITE,

        0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

    if (hDevice == INVALID_HANDLE_VALUE)

    {

        printf("CreateFile Error %d.\n", GetLastError());

        goto exit;

    }

char d;

    bRes = TRUE;

    cout << "请输入要保护的进程名:";

cin >> d;

***.sync();

    cout << "选择操作,(输入1 2 3):\n";

    cout << "1.开启保护,2.关闭保护,3.退出程序";

    cin >> Ans;



    while (TRUE)

{

        if (Ans == 3) break;

        else if (Ans == 1)

        {



            DWORD dwPid = GetPID(d);

            if (dwPid == 0)

            {

                printf("没有找到进程\n");

                break;

            }

            //开启HOOK

            if (!DeviceIoControl(hDevice, CTL_HOOK, &dwPid, INPUT_BUFFER_LENGTH,

                                 &bRes, OUT_BUFFER_LENGTH, &dwRetLength, NULL))

            {

                printf("DeviceIoControl CTL_HOOK Error\n");

                break;

            }



            if (bRes) {

printf("Hook 成功\n");break;

}

            else printf("Hook 失败\n");

break;

        }

        else if (Ans == 2)

        {

            //关闭HOOK

            if (!DeviceIoControl(hDevice, CTL_UNHOOK, NULL, 0,

                          &bRes, OUT_BUFFER_LENGTH, &dwRetLength, NULL))

            {

                printf("DeviceIoControl CTL_UNHOOK Error\n");

                break;

            }



            if (bRes) printf("UnHook 成功\n");

            else printf("UnHook 失败\n");

break;

        }

    }

exit:

    if (hDevice) CloseHandle(hDevice);

    if (!UnInstallService())

    {

        printf("卸载驱动失败\n");

    }

}

else


{

    printf("驱动加载失败\n");

}

system("pause");



return 0;

}

img


本程序是通过SSDT Hook保护进程,程序总有Bug
环境:Visual Studio 2010+WDK 7.1.0

  • 写回答

3条回答 默认 最新

  • 檀越@新空间 2024-02-28 23:11
    关注

    WindowsAero 晚上好🌙🌙🌙
    本答案参考通义千问

    问题分析: 你遇到的问题可能是由于以下原因导致的:

    1. 进程名称不正确GetPID 函数可能无法找到指定的进程名,确认输入的进程名与实际进程名完全匹配。
    2. 进程已关闭或不存在:如果进程在你尝试获取 PID 时已经结束或者不是当前活动进程,函数会返回 0。
    3. 权限问题:访问进程信息可能需要更高的权限,确保你的代码有足够的权限执行此操作。
    4. 工具帮助库函数使用错误CreateToolhelp32Snapshot, Process32First, 和 Process32Next 的调用方式可能有问题。

    解决方案:

    1. 检查进程名

      • 使用CreateToolhelp32Snapshot来查找进程,然后使用Process32Next遍历找到的进程,直到找到目标进程。
      HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
      PROCESSENTRY32 pe32 = { sizeof(PROCESSENTRY32) };
      if (Process32First(snapshot, &pe32)) {
          do {
              if (strcmp(pe32.szExeFile, d) == 0) {
                  dwPid = pe32.th32ProcessID;
                  break;
              }
          } while (Process32Next(snapshot, &pe32));
          CloseHandle(snapshot);
      }
      
    2. 处理进程状态

      • GetPID函数中添加对进程状态的检查,确保进程存在。
      DWORD dwPid = 0;
      if (Process32First(snapshot, &pe32)) {
          while (Process32Next(snapshot, &pe32)) {
              if (strcmp(pe32.szExeFile, d) == 0) {
                  dwPid = pe32.th32ProcessID;
                  break;
              }
          }
          CloseHandle(snapshot);
      }
      if (dwPid == 0) {
          printf("没有找到进程\n");
      }
      
    3. 权限检查

      • 确保你的应用程序具有足够的权限访问进程信息。可能需要以管理员身份运行。
    4. 工具帮助库函数

      • 如果以上步骤无效,检查CreateToolhelp32Snapshot的参数是否正确,以及DeviceIoControlCTL_HOOKCTL_UNHOOK常量是否定义正确。

    代码修改

    // 增加进程状态检查
    if (Process32First(snapshot, &pe32)) {
        do {
            if (strcmp(pe32.szExeFile, d) == 0 && pe32.th32ProcessID > 0) {
                dwPid = pe32.th32ProcessID;
                break;
            }
        } while (Process32Next(snapshot, &pe32));
        CloseHandle(snapshot);
    }
    
    // 检查PID是否为0
    if (dwPid == 0) {
        printf("没有找到进程\n");
    }
    

    完整修改后的代码段

    // ...其他代码...
    
    if (Process32First(snapshot, &pe32)) {
        do {
            if (strcmp(pe32.szExeFile, d) == 0 && pe32.th32ProcessID > 0) {
                dwPid = pe32.th32ProcessID;
                break;
            }
        } while (Process32Next(snapshot, &pe32));
        CloseHandle(snapshot);
    }
    
    if (dwPid == 0) {
        printf("没有找到进程\n");
    }
    
    // ... DeviceIoControl 等后续代码...
    

    请确保代码中的函数定义和常量(如TH32CS_SNAPPROCESSCTL_HOOK)已正确设置。如果问题依然存在,请检查你的系统权限和驱动程序是否支持所需的操作。

    评论

报告相同问题?

问题事件

  • 创建了问题 2月28日