c语言获取进程参数,如何获取其它程序的命令行参数

该代码段展示了如何通过OpenProcess和ReadProcessMemory API从远程进程中读取命令行参数。它首先尝试读取指定进程ID的命令行地址,然后根据不同的操作系统版本进行适当的数据读取。该方法主要用于Windows NT/2000/XP和Windows 95/98/Me及Win32s平台。
摘要由CSDN通过智能技术生成

DWORD g_GetCmdLine(DWORD dwPID,TCHAR* pCmdLine,DWORD dwBufLen)

{

#define BUFFER_LEN 512 //reading buffer for the commandline

HANDLE hProc = OpenProcess(PROCESS_VM_READ,FALSE,dwPID);

if(hProc == NULL)

{

return GetLastError();

}

DWORD dwRet = -1;

DWORD dwAddr = *(DWORD*)((DWORD)GetCommandLine + 1);//第2个字节开始才是我们要读的地址

TCHAR tcBuf[BUFFER_LEN] = {0};

DWORD dwRead = 0;

//判断平台

DWORD dwVer = GetVersion();

try

{

if(dwVer < 0×80000000) // Windows NT/2000/XP

{

if(ReadProcessMemory(hProc,(LPVOID)dwAddr,&dwAddr,4,&dwRead))

{

if(ReadProcessMemory(hProc,(LPVOID)dwAddr,tcBuf,BUFFER_LEN,&dwRead))

{

_tcsncpy(pCmdLine,tcBuf,dwBufLen); //最好检查一下dwRead和dwBufLen的大小,使用较小的那个

dwRet = 0;

}

}

}

else // Windows 95/98/Me and Win32s

{

while(true) //使用while是为了出错时方便跳出循环

{

if(!ReadProcessMemory(hProc,(LPVOID)dwAddr,&dwAddr,4,&dwRead)) break;

if(!ReadProcessMemory(hProc,(LPVOID)dwAddr,&dwAddr,4,&dwRead)) break;

if(!ReadProcessMemory(hProc,(LPVOID)(dwAddr + 0xC0),tcBuf,BUFFER_LEN,&dwRead)) break;

if(*tcBuf == 0)

{

if(!ReadProcessMemory(hProc,(LPVOID)(dwAddr + 0×40),&dwAddr,4,&dwRead)) break;

if(!ReadProcessMemory(hProc,(LPVOID)(dwAddr + 0×8),&dwAddr,4,&dwRead)) break;

if(!ReadProcessMemory(hProc,(LPVOID)dwAddr,tcBuf,BUFFER_LEN, &dwRead)) break;

}

_tcsncpy(pCmdLine,tcBuf,dwBufLen); //最好检查一下dwRead和dwBufLen的大小,使用较小的那个

dwRet = 0;

break;

}

}

}

catch(…)

{

dwRet = ERROR_INVALID_ACCESS; //exception

}

CloseHandle(hProc);

return dwRet;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值