獲取進程命令行參數

#define   ProcessBasicInformation   0 


typedef   struct 

        USHORT   Length; 
        USHORT   MaximumLength; 
        PWSTR     Buffer; 
}   UNICODE_STRING,   *PUNICODE_STRING; 


typedef   struct 

        ULONG                     AllocationSize; 
        ULONG                     ActualSize; 
        ULONG                     Flags; 
        ULONG                     Unknown1; 
        UNICODE_STRING   Unknown2; 
        HANDLE                   InputHandle; 
        HANDLE                   OutputHandle; 
        HANDLE                   ErrorHandle; 
        UNICODE_STRING   CurrentDirectory; 
        HANDLE                   CurrentDirectoryHandle; 
        UNICODE_STRING   SearchPaths; 
        UNICODE_STRING   ApplicationName; 
        UNICODE_STRING   CommandLine; 
        PVOID                     EnvironmentBlock; 
        ULONG                     Unknown[9]; 
        UNICODE_STRING   Unknown3; 
        UNICODE_STRING   Unknown4; 
        UNICODE_STRING   Unknown5; 
        UNICODE_STRING   Unknown6; 
}   PROCESS_PARAMETERS,   *PPROCESS_PARAMETERS; 


typedef   struct 

        ULONG                               AllocationSize; 
        ULONG                               Unknown1; 
        HINSTANCE                       ProcessHinstance; 
        PVOID                               ListDlls; 
        PPROCESS_PARAMETERS   ProcessParameters; 
        ULONG                               Unknown2; 
        HANDLE                             Heap; 
}   PEB,   *PPEB; 


typedef   struct 

        DWORD   ExitStatus; 
        PPEB     PebBaseAddress; 
        DWORD   AffinityMask; 
        DWORD   BasePriority; 
        ULONG   UniqueProcessId; 
        ULONG   InheritedFromUniqueProcessId; 
}       PROCESS_BASIC_INFORMATION; 


typedef   LONG   (WINAPI   *PROCNTQSIP)(HANDLE,UINT,PVOID,ULONG,PULONG); 




PROCNTQSIP   NtQueryInformationProcess; 


BOOL   GetProcessCmdLine(DWORD   dwId,LPWSTR   wBuf,DWORD   dwBufLen); 


DWORD Util::GetProcCommandline(DWORD dwPID,TCHAR* pCmdLine,DWORD dwBufLen) 

if(!NtQueryInformationProcess)
NtQueryInformationProcess = (PROCNTQSIP)GetProcAddress(GetModuleHandle(_T("ntdll")), "NtQueryInformationProcess"); 
if(!NtQueryInformationProcess) 
return FALSE; 


LONG status; 
HANDLE hProcess; 
PROCESS_BASIC_INFORMATION   pbi; 
PEB Peb; 
PROCESS_PARAMETERS  ProcParam; 
DWORD dwDummy; 
DWORD dwSize; 
LPVOID lpAddress; 
BOOL  bRet = FALSE; 


hProcess   =   OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,FALSE,dwPID); 
try
{
if   (!hProcess) 
return   FALSE; 
while(true){
status = NtQueryInformationProcess(hProcess, ProcessBasicInformation, (PVOID)&pbi,sizeof(PROCESS_BASIC_INFORMATION), NULL); 
if   (status) 
break;
if   (!ReadProcessMemory(hProcess, pbi.PebBaseAddress,&Peb,sizeof(PEB),&dwDummy)) 
break; 
if   (!ReadProcessMemory(hProcess,Peb.ProcessParameters,&ProcParam,sizeof(PROCESS_PARAMETERS),&dwDummy)) 
break;
lpAddress = ProcParam.CommandLine.Buffer; 
dwSize = ProcParam.CommandLine.Length; 
if   (dwBufLen <dwSize) 
break;
if   (!ReadProcessMemory(hProcess,lpAddress,pCmdLine,dwSize,&dwDummy)) 
break;
bRet = TRUE;
break;
}
}
catch(...) 

bRet = FALSE; //exception

CloseHandle(hProcess); 
return   bRet; 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章