2013-04-02 3 views
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; 
} 
+0

편집 : 난 그냥 지금 get_process_cmd_line (DWORD PID)는 프로세스의 명령 줄을 얻는 데 성공하면 그것은 더 이상 성공할 수 없다 것으로 나타났습니다! –

답변

0

현재 프로세스가 다른 프로세스 메모리를 읽을 권한이 없습니다. 프로세스를 관리자로 실행하십시오.

코드 자체가 기본적으로 확인을 보인다.

+0

예 관리자로 실행했지만 동일한 결과와 거의 모든 프로세스가 "Er. adress"를 반환했습니다 ... –

1
당신이 무엇을 달성하고자 불분명

, 왜 이런 식으로. 대신 GetCommandLine을 사용할 수 없습니까? 동기 및 접근 무엇이든지

, 난 당신이 각각의 함수 호출 ( OpenProcess부터 시작)와 실패에 대한 철저한 검사를 수행하는 것이 좋습니다. 특정 함수가 실패 또는 성공시 반환하는 문서를 읽으십시오. 정확한 이유 (또는 MSDN에서 언급 한 다른 관련 기능)를 확인하려면 항상 GetLastError을 사용하십시오.

당신은 실행 또는 서비스로 프로그램을 실행하고자하는? 그렇지 않다면 단계별 디버깅을 할 수없는 이유는 무엇입니까?

+0

이제는 explorer.exe procecces가 명령 행을 갖고 있지 않다는 것을 제외하고는 작동합니다! –

관련 문제