0

我正在尝试使用以下代码获取 Windows 中正在运行的进程的命令行:但我只得到这样的命令行IDman.exe

  • C:\Program Files (x86)\Internet Download Manager\IDMan.exe" /onboot

但我知道还有许多其他带有命令行的进程。

告诉我我的代码有什么问题。

PVOID GetPebAddress(HANDLE ProcessHandle )
{
    _NtQueryInformationProcess NtQueryInformationProcess =
             (_NtQueryInformationProcess)GetProcAddress(
             GetModuleHandleA("ntdll.dll"), "NtQueryInformationProcess");
    PROCESS_BASIC_INFORMATION pbi;

    NtQueryInformationProcess(ProcessHandle, 0, &pbi, sizeof(pbi), NULL);

   return pbi.PebBaseAddress;
}

void get_process_cmd_line(DWORD pID)
     {

       HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION |
                                     PROCESS_VM_READ |
                                     PROCESS_TERMINATE,
                                     FALSE, pID);
       PPEB ppeb = (PPEB) GetPebAddress(hProcess);
       PPEB ppebCopy = (PPEB)malloc(sizeof(PEB));
       BOOL result = ReadProcessMemory(hProcess,
                                       ppeb,
                                       ppebCopy,
                                       sizeof(PEB),
                                       NULL);
       if(!result){std::cout<<"Er. adress";return;}
       PRTL_USER_PROCESS_PARAMETERS pRtlProcParam = ppebCopy->ProcessParameters;
       PRTL_USER_PROCESS_PARAMETERS pRtlProcParamCopy =
          (PRTL_USER_PROCESS_PARAMETERS)malloc(sizeof(RTL_USER_PROCESS_PARAMETERS));
       result = ReadProcessMemory(hProcess,
                                  pRtlProcParam,
                                  pRtlProcParamCopy,
                                  sizeof(RTL_USER_PROCESS_PARAMETERS),
                                  NULL);
       if(!result){std::cout<<"Er. ";return;}
       PWSTR wBuffer = pRtlProcParamCopy->CommandLine.Buffer;
       USHORT len = pRtlProcParamCopy->CommandLine.Length;
       PWSTR wBufferCopy = (PWSTR)malloc(len);
       result = ReadProcessMemory(hProcess,
                                  wBuffer,
                                  wBufferCopy, 
                                  len,NULL);
       if(!result){std::cout<<"Er. cmdLine";return;}
       std::wcout<<wBufferCopy;
       return;
}
4

2 回答 2

2

目前尚不清楚您想要实现什么,以及为什么要这样。为什么不能使用GetCommandLine代替?

无论动机和方法如何,我建议您彻底检查每个函数调用是否失败(从 开始OpenProcess)。阅读有关特定函数在失败或成功时返回什么的文档。始终用于GetLastError确定确切原因(或 MSDN 中提到的任何其他相关功能)。

您是否正在运行或愿意将您的程序作为服务运行?如果没有,为什么不能一步一步调试呢?

于 2013-04-02T17:51:33.317 回答
0

您当前的进程可能没有足够的权限来读取其他进程的内存。尝试以管理员身份运行该进程。

代码本身看起来基本没问题。

于 2013-04-02T13:33:51.937 回答