链家司歌2017mp3下载:用VC获取其它程序的命令行参数
来源:百度文库 编辑:偶看新闻 时间:2024/05/08 12:25:17
用VC获取其它程序的命令行参数
2008-11-13 17:05:49 阅读(14) 发表评论我们都知道,在程序里获取命令行参数很简单,WinMain函数会以参数的形式传递给我们,或者可以调用API GetCommandLine 获取。但是GetCommandLine函数不接受参数,获取的只是自己程序的命令行参数。那么如果我们想获取别的应用程序的命令行参数应该怎么办呢?
有的同学说,既然GetCommandLine只能获取本程序的命令行参数,我们可以在其它进程里插入一个Dll,在那个进程的地址空间调用GetCommandLine函数,然后传回来就可以了。这样好像有点儿不太友好。让我们想想还有没有别的办法。
我们想,自己的命令行参数既然随时都可以获取到,那么在该进程里一定有一个地方存放它。那么在哪儿呢?看一下GetCommandLine函数的反汇编代码,我们发现,原来世界是如此的美好!
以下是WinXP系统的GetCommandLine函数反汇编代码:
.text:7C812C8D GetCommandLineA proc near
.text:7C812C8D mov eax, dword_7C8835F4
//dword_7C8835F4 就是命令行参数字符串的地址
//该指令机器码为 A1 F4 35 88 7C,从第2个字节开始的4个字节就是我们要的地址
.text:7C812C92 retn
.text:7C812C92 GetCommandLineA endp
既然知道了放在哪儿了,我们自己去拿就可以了。因为GetCommandLine函数的地址在各个进程内都是一样的,所以可以直接用我们进程里的地址。 win2000/xp系统很简单,98下稍微麻烦一点儿,需要进行一些简单的计算。 以下是GetCommandLine函数在win98下的汇编代码:
.text:BFF8C907 GetCommandLineA proc near
.text:BFF8C907 mov eax, dword_BFFCADE4
.text:BFF8C90C mov ecx, [eax]
.text:BFF8C90E mov eax, [ecx+0C0h]
.text:BFF8C914 test eax, eax
.text:BFF8C916 jnz
short
locret_BFF8C91E
.text:BFF8C918 mov eax, [ecx+40h]
.text:BFF8C91B mov eax, [eax+8]
//算到这儿,才是我们想要的地址
.text:BFF8C91E
.text:BFF8C91E locret_BFF8C91E: ; CODE XREF: GetCommandLineA+F.
.text:BFF8C91E retn
这样,我们就可以调用OpenProcess函数打开其它进程,然后用ReadProcessMemory读取相应的数据即可。 示例代码:
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 < 0x80000000)
// 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 + 0x40),&dwAddr,4,&dwRead))
break
;
if
(!ReadProcessMemory(hProc,(
LPVOID
)(dwAddr + 0x8),&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;
}
什么是c程序的命令行参数
命令行参数的作用
如何获取程序执行参数?
如何获取其它程序edit控件的caption值?
VC 怎样获取http://或url后的参数值
请哪位指点一下小弟C语言中的带命令行参数的程序应该怎么运行?
在命令行下regedit的参数
命令行参数有什么用啊?
急问:用ShellExecute向程序传递一个参数值,在这个调用程序中如何获取这个参数值?
ParamStr 获取命令行
怎样修改命令行参数
cad 命令行 长参数
使用VC在调试程序时候,可以查看参数的值,如何使用jbuilder查看参数的值呢?谢谢
请问如何用VB获取其它程序弹出菜单的句柄?
怎样在桌面快捷方式的属性中添加命令行参数
VC++怎么获取计算机的机器码
请问;:命令行参数一般用在什么地方,怎么用呢,
计算机C语言中的命令行参数怎么用呢?
碎片整理程序的命令行版本是什么?
关于C#程序的命令行编译
局域网如何获取其它主机的IP
我要一个用C++编写的简单的命令行方式下使用的计算器程序
请问在命令行下如何获取已知IP的MAC地址?
如何用cmd命令行,获取数据库服务器使用的端口号