根据进程名 获取该进程的启动参数,该如何处理

根据进程名 获取该进程的启动参数
如果一个进程已经启动,而且我们知道这个进程名,我们能否知道这个进程的启动参数呢?

例如:
程序A使用 ShellExecuteEx启动程序B,并传递一个启动参数(如“-check”),已知程序B的进程名是B.exe

这时程序C该如何获取到程序B的启动参数(“-check”)?
------解决方案--------------------
用 CreateRemoteThread 在目标进程地址空间加载自己写的dll,在dll里用GetCommandLine API 获取,然后再送出来
------解决方案--------------------
引用:
如果一个进程已经启动,而且我们知道这个进程名,我们能否知道这个进程的启动参数呢?

例如:
程序A使用 ShellExecuteEx启动程序B,并传递一个启动参数(如“-check”),已知程序B的进程名是B.exe

这时程序C该如何获取到程序B的启动参数(“-check”)?

按照你的想法,程序c可以直接和程序a通信,从程序a哪里获得程序b的启动参数
1楼说的也可以
------解决方案--------------------
先读(char*)GetCommandLine+1
再读这个地方的
结果就是字符串的地址
于是再读一次
------解决方案--------------------
用CreateToolHelp32Snapshot列举进程,然后比较
------解决方案--------------------
看过不少列宁回答的帖子,觉得列宁同志对windows很厉害
这个我倒是做过,但是根本不记得了,回头去看了下程序,里面当初是这么做的
就像列宁说的那样,应该是可以的

DWORD dwRet = -1;
DWORD dwAddr = *(DWORD*)((DWORD)GetCommandLine + 1); // The 2nd DWORD is the address I need
DWORD dwRead = 0;
if(ReadProcessMemory(hProc, (LPVOID)dwAddr, &dwAddr, sizeof(DWORD), &dwRead) && ReadProcessMemory(hProc, (LPVOID)dwAddr, szParam, 250, &dwRead))
    bGetName = TRUE;
CloseHandle(hProc);

知道B的进程名,就先遍历进程,找到那个进程呗,我上面的进程句柄就是hProc
------解决方案--------------------
是不是应该从进程快照里面取到进程ID再用OpenProcess指定访问权限来获取实际进程句柄

------解决方案--------------------
HANDLE hProc = OpenProcess (PROCESS_QUERY_INFORMATION
------解决方案--------------------
PROCESS_VM_READ, FALSE, pe.th32ProcessID);

if(!ReadProcessMemory(hProc, (LPVOID)dwAddr, &dwAddr, sizeof(DWORD), &dwRead))
{
dwRet = GetLastError();//返回ERROR_NOACCESS 998L
return "";
}
if(!ReadProcessMemory(hProc, (LPVOID)dwAddr, szParam, 250, &dwRead))
{
dwRet = GetLastError();
return ""; 
}
试试看
------解决方案--------------------
可以直接在远程进程执行GetCommandLine()就行了.
我试了下可以.


int WINAPI GetProcessCommandLine(DWORD dwPID, LPTSTR lpszCommandLine, DWORD dwByteOfSize)
{
HANDLE hProcess = ::OpenProcess(PROCESS_CREATE_THREAD
------解决方案--------------------
PROCESS_VM_OPERATION
------解决方案--------------------
PROCESS_VM_WRITE
------解决方案--------------------
PROCESS_VM_READ, FALSE, dwPID);

if (!hProcess)
{
return 0;
}

DWORD dwThreadId = 0;
DWORD dwExitCode = 0;
DWORD dwReaded = 0;
HANDLE hThread  = ::CreateRemoteThread(hProcess, NULL, NULL, (LPTHREAD_START_ROUTINE)GetCommandLine, NULL, 0, &dwThreadId);

if (hThread)
{
::WaitForSingleObject(hThread, INFINITE);
::GetExitCodeThread(hThread, &dwExitCode);
::ReadProcessMemory(hProcess, (LPCVOID)dwExitCode, lpszCommandLine, dwByteOfSize, &dwReaded);
}

return dwReaded;
}

int _tmain(int argc, _TCHAR* argv[])
{
TCHAR szBuffer[256] = {0};
GetProcessCommandLine(628, szBuffer, sizeof(szBuffer)); //628改成你要获取的进程PID,
return 0;
}