windows核心编程-如何获取进程命令行信息
2016-11-28 08:45
429 查看
如何获取其他进程命令行信息
每一个进程都有一个PEB数据块(PEB:Process Environment Block),这个进程环境块信息(如下结构体),
每个PEB中有_RTL_USER_PROCESS_PARAMETERS 结构体,是一个指针,指向一个结构体,这个结构体里面有一个CommandLine
命令行参数。所以要获得其他进程的命令行参数CommandLine,首先要获得其他进程的PEB结构体,通过_RTL_USER_PROCESS_PARAMETERS
得到它的结构体,结构体里面有CommandLine;
#include<Winternl.h>
ntdll!_PEB+0x000InheritedAddressSpace : ??
如何获得其他进程PEB的结构体信息
每一个进程都有一个PEB数据块(PEB:Process Environment Block),这个进程环境块信息(如下结构体),
每个PEB中有_RTL_USER_PROCESS_PARAMETERS 结构体,是一个指针,指向一个结构体,这个结构体里面有一个CommandLine
命令行参数。所以要获得其他进程的命令行参数CommandLine,首先要获得其他进程的PEB结构体,通过_RTL_USER_PROCESS_PARAMETERS
得到它的结构体,结构体里面有CommandLine;
#include<Winternl.h>
typedef struct _PEB {//PEB结构 BYTE Reserved1[2]; BYTE BeingDebugged; BYTE Reserved2[1]; PVOID Reserved3[2]; PPEB_LDR_DATA Ldr; PRTL_USER_PROCESS_PARAMETERS ProcessParameters; BYTE Reserved4[104]; PVOID Reserved5[52]; PPS_POST_PROCESS_INIT_ROUTINE PostProcessInitRoutine; BYTE Reserved6[128]; PVOID Reserved7[1]; ULONG SessionId; } PEB, *PPEB;
ntdll!_PEB+0x000InheritedAddressSpace : ??
+0x001ReadImageFileExecOptions : ??
+0x002BeingDebugged : ??
+0x003SpareBool : ??
+0x004Mutant : ????
+0x008ImageBaseAddress : ????
+0x00cLdr : ????
+0x010ProcessParameters : _RTL_USER_PROCESS_PARAMETERS(如下)
+0x014SubSystemData : ????
+0x018ProcessHeap : ????
+0x01cFastPebLock : ????
+0x020FastPebLockRoutine : ???? +0x024 FastPebUnlockRoutine : ???? +0x028 EnvironmentUpdateCount : ?? +0x02c KernelCallbackTable : ???? +0x030 SystemReserved : [1] ?? +0x034 AtlThunkSListPtr32 : ?? +0x038 FreeList : ???? +0x03c TlsExpansionCounter : ?? +0x040 TlsBitmap : ???? +0x044 TlsBitmapBits : [2] ?? +0x04c ReadOnlySharedMemoryBase : ???? +0x050 ReadOnlySharedMemoryHeap : ???? +0x054 ReadOnlyStaticServerData : ???? +0x058 AnsiCodePageData : ???? +0x05c OemCodePageData : ???? +0x060 UnicodeCaseTableData : ???? +0x064 NumberOfProcessors : ?? +0x068 NtGlobalFlag : ?? +0x070 CriticalSectionTimeout : _LARGE_INTEGER +0x078 HeapSegmentReserve : ?? +0x0 4000 7c HeapSegmentCommit : ?? +0x080 HeapDeCommitTotalFreeThreshold : ?? +0x084 HeapDeCommitFreeBlockThreshold : ?? +0x088 NumberOfHeaps : ?? +0x08c MaximumNumberOfHeaps : ?? +0x090 ProcessHeaps : ???? +0x094 GdiSharedHandleTable : ???? +0x098 ProcessStarterHelper : ???? +0x09c GdiDCAttributeList : ?? +0x0a0 LoaderLock : ???? +0x0a4 OSMajorVersion : ?? +0x0a8 OSMinorVersion : ?? +0x0ac OSBuildNumber : ?? +0x0ae OSCSDVersion : ?? +0x0b0 OSPlatformId : ?? +0x0b4 ImageSubsystem : ?? +0x0b8 ImageSubsystemMajorVersion : ?? +0x0bc ImageSubsystemMinorVersion : ?? +0x0c0 ImageProcessAffinityMask : ?? +0x0c4 GdiHandleBuffer : [34] ?? +0x14c PostProcessInitRoutine : ???? +0x150 TlsExpansionBitmap : ???? +0x154 TlsExpansionBitmapBits : [32] ?? +0x1d4 SessionId : ?? +0x1d8 AppCompatFlags : _ULARGE_INTEGER +0x1e0 AppCompatFlagsUser : _ULARGE_INTEGER +0x1e8 pShimData : ???? +0x1ec AppCompatInfo : ???? +0x1f0 CSDVersion : _UNICODE_STRING +0x1f8 ActivationContextData : ???? +0x1fc ProcessAssemblyStorageMap : ???? +0x200 SystemDefaultActivationContextData : ???? +0x204 SystemAssemblyStorageMap : ???? +0x208 MinimumStackCommit : ??
struct RTL_USER_PROCESS_PARAMETERS |
typedef struct _RTL_USER_PROCESS_PARAMETERS { ULONG MaximumLength; ULONG Length; ULONG Flags; ULONG DebugFlags; PVOID ConsoleHandle; ULONG ConsoleFlags; PVOID StandardInput; PVOID StandardOutput; PVOID StandardError; CURDIR CurrentDirectory; UNICODE_STRING DllPath; UNICODE_STRING ImagePathName; UNICODE_STRING CommandLine; PVOID Environment; ULONG StartingX; ULONG StartingY; ULONG CountX; ULONG CountY; ULONG CountCharsX; ULONG CountCharsY; ULONG FillAttribute; ULONG WindowFlags; ULONG ShowWindowFlags; UNICODE_STRING WindowTitle; UNICODE_STRING DesktopInfo; UNICODE_STRING ShellInfo; UNICODE_STRING RuntimeData; RTL_DRIVE_LETTER_CURDIR CurrentDirectores[32]; ULONG EnvironmentSize; } RTL_USER_PROCESS_PARAMETERS, *PRTL_USER_PROCESS_PARAMETERS;
如何获得其他进程PEB的结构体信息
NtQueryInformationProcess
NTSTATUS WINAPI NtQueryInformationProcess( _In_ HANDLE ProcessHandle, //进程句柄 _In_ PROCESSINFOCLASS ProcessInformationClass,//ProcessBasicInformation _Out_ PVOID ProcessInformation, //PROCESS_BASIC_INFORMATION结构体 _In_ ULONG ProcessInformationLength, //前面结构体的大小 _Out_opt_ PULONG ReturnLength //返回值的大小 );
#include<windows.h> #include<tchar.h> #include<Winternl.h> typedef NTSTATUS (WINAPI *QT)(HANDLE,PROCESSINFOCLASS,PVOID,ULONG,PULONG);//NtQueryInformationProcess /* 写成一个函数,来获得所有的PEB结构体信息 */ TCHAR* GetProcessCommandLine(HANDLE hProcess) { HMODULE hModule = 0; QT NtQuery = { 0 }; hModule = LoadLibrary(L"Ntdll.dll"); //加载动态链接 if (hModule) { NtQuery = (QT)GetProcAddress(hModule, "NtQueryInformationProcess"); if (NtQuery == NULL) return 0; } else return 0; PROCESS_BASIC_INFORMATION pi = { 0 }; NTSTATUS re = NtQuery(hProcess, ProcessBasicInformation, &pi, sizeof(pi), NULL); /* 在pi中,pi.PebBaseAddress指向PEB,那么这个指针指向的地址是哪个地址呢? 这个指针指向的地址,是word进程的地址 */ if (!NT_SUCCESS(re)) { // _tprintf(L"OK\n"); return 0; } PEB peb; RTL_USER_PROCESS_PARAMETERS para; ReadProcessMemory(hProcess, pi.PebBaseAddress, &peb, sizeof(peb), NULL); //将pi.PebBaseAddress的信息读取到peb中 ReadProcessMemory(hProcess, peb.ProcessParameters, ¶, sizeof(para), NULL); TCHAR* CommandLine=(TCHAR*)malloc(sizeof(TCHAR)*1024); ReadProcessMemory(hProcess, para.CommandLine.Buffer, CommandLine, 1024 * 2, NULL); // _tprintf(L"%s\n", CommandLine); // MessageBox(NULL, CommandLine, L"ok", MB_OK); CloseHandle(hProcess); FreeLibrary(hModule); return CommandLine; } int _tmain(int argc,TCHAR* argv[]) { HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 2144); TCHAR *str = GetProcessCommandLine(hProcess); MessageBox(NULL,str,L"OK",MB_OK); free(str); return 0; } /* int _tmain(int argc,TCHAR* argv[]) { HMODULE hModule = 0; QT NtQuery = {0}; hModule = LoadLibrary(L"Ntdll.dll"); //如果不写,就会报无法动态装入的错误,所以在头部加上typedef NTSTATUS结构体信息 if (hModule) { NtQuery = (QT)GetProcAddress(hModule,"NtQueryInformationProcess");//第二个参数不能加L,因为是ASCII类型的 } HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,2144); PROCESS_BASIC_INFORMATION pi = {0}; //初始化 NTSTATUS re = NtQuery(hProcess, ProcessBasicInformation,&pi,sizeof(pi),NULL); //在pi中,pi.PebBaseAddress指向PEB,那么这个指针指向的地址是哪个地址呢? //这个指针指向的地址,是word进程的地址 if (NT_SUCCESS(re)) //是一个宏,来判断NTSTATUS返回类型是否成功 { // _tprintf(L"OK\n"); } PEB peb; RTL_USER_PROCESS_PARAMETERS para; //这个函数用来读取其他进程中的内存地址 ReadProcessMemory(hProcess,pi.PebBaseAddress,&peb,sizeof(peb),NULL); ReadProcessMemory(hProcess,peb.ProcessParameters,¶,sizeof(para),NULL); TCHAR CommandLine[1024]; ReadProcessMemory(hProcess,para.CommandLine.Buffer,CommandLine,1024*2,NULL);//*2是UNICODE字符 _tprintf(L"%s\n", CommandLine); MessageBox(NULL,CommandLine,L"ok",MB_OK); _gettchar(); CloseHandle(hProcess); FreeLibrary(hModule); return 0; } */
相关文章推荐
- 技术专题:WAYOS PC版如何获取进程的端口信息,然后做策略路由?
- java中如何获取Runtime.getRuntime().exec()或ProcessBuilder.start()产生的进程信息
- windows核心编程-获取系统中进程的信息
- 如何使用WMI获取进程信息
- 如何利用Java获取进程的信息(通过tasklist和cmd与Windows进行交互)
- Linux命令行—管理进程/获取磁盘统计信息
- 如何使用WMI获取进程信息
- Windows下如何获取与手机设备有关的进程信息(Python版)
- Android笔记 - 如何避免ActivityNotFound异常,查看Activity堆栈信息,获取进程名
- 如何获取进程命令的详细信息
- 如何使用WMI获取进程信息 (转载)
- 如何 在 Mac OS X 里通过命令行获取 CPU 信息
- 获取进程的信息的代码二
- 如何通过VB.net获取网卡信息
- 如何获取某个进程的主窗口以及创建进程的程序名?
- 如何从mp3,wma等音频文件中获取歌曲信息
- 获取Windows系统的进程运行信息
- 如何获取MSSQLServer,Oracel,Access中的数据字典信息
- 获取Windows系统的进程运行信息
- 在Asp.net中如何用SQLDMO来获取SQL Server中的对象信息