#include <iostream>
#include <windows.h>
#include <tchar.h>
#include <winternl.h>
//如何获得其他进程的命令行信息?
/*
* 每一个进程里面都对应一个环境变量快PEB
* 如果想要获得其他进程的命令行信息,首先就要获得其他进程的PEB结构体
*
* 如何获得其他进程的PEB结构体信息?
* NtQueryinformationProcess 函数
* 第一个参数是进程句柄
* 第二个参数是ProcessBasicInfomation结构体->查文档
* 第三个PROCESS_BASIC_INFOMATION
* 第四个前面结构体的大小
* 第五个是返回值的大小
*
* 这个函数有点危险,以后可能会被杀掉
* 要先拿到别的进程的句柄
*/
//由于直接使用NtQueryInformationProcess函数会报错未定义,所以手动装入dll,官方查询这个函数在Ntdll.dll库里
//定义一个函数指针
typedef NTSTATUS (WINAPI *QT)(HANDLE, PROCESSINFOCLASS, PVOID, ULONG, PULONG);
using namespace std;
int main(int argc, char* argv[])
{
HMODULE hModule = 0;
hModule = LoadLibrary(L"Ntdll.dll");
QT NtQuery;
if(hModule)
{
NtQuery = (QT)GetProcAddress(hModule, "NtQueryInformationProcess");
}
PROCESS_BASIC_INFORMATION pi;
memset(&pi, 0, sizeof(pi));
NTSTATUS re = NtQuery(OpenProcess(PROCESS_ALL_ACCESS, FALSE, 17720),
ProcessBasicInformation,/*还必须用这个,不能用0*/
&pi,
sizeof (pi),
NULL);
/*
* 在pi中,pi.PedBaseAddress指向PEB,那么这个指针指向的地址,是哪个地址?
* 是17720进程中的地址
* 17720 是我自己找的进程ID
*/
if(NT_SUCCESS(re))
{
wcout << "OK" << endl;
}
//拿到地址开始读内存
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 17720);
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);
MessageBox(NULL, CommandLine, L"OK", MB_OK);//windows编程下的通知栏,防止黑窗口不能完全显示汉字
wcout << CommandLine << endl;
CloseHandle(hProcess);
FreeLibrary(hModule);
return 0;
}
Windows编程-获取其他进程的命令行信息
最新推荐文章于 2024-04-18 15:24:36 发布