用VC获取其它程序的命令行参数

用VC获取其它程序的命令行参数,第1张

用VC获取其它程序的命令行参数,第2张

众所周知,在程序中获取命令行参数是非常简单的。WinMain函数将作为参数传递给我们,或者您可以调用API GetCommandLine来获取它们。但是GetCommandLine函数不接受参数,只获取自己程序的命令行参数。那么如果想获取其他应用的命令行参数,应该怎么做呢?

有同学说,既然GetCommandLine只能获取这个程序的命令行参数,那么我们可以在其他进程中插入一个Dll,在那个进程的地址空之间调用GetCommandLine函数,然后发回。这似乎有点不友好。我们看看有没有别的办法。

我们认为,既然我们的命令行参数可以随时获取,那么在这个过程中就必须有一个存储它们的地方。那么它在哪里?看着GetCommandLine函数的反汇编代码,我们发现原来世界是如此美好!

以下是WinXP系统的GetCommandLine函数的反汇编代码:

。text: 7c812c8d get命令行a proc near
。text:7 c 812 c8 movax,dword _ 7c8835f4//dword _ 7c8835f4是命令行参数字符串的地址
//这个命令的机器码是A1 F4 35 88 7C,从第二个字节算起的四个字节就是我们想要的地址
。Text: 7C812C92Retn
。Text: 7C812C92Get命令行Endp

既然我们知道它在哪里,我们可以自己去拿。因为GetCommandLine函数的地址在每个进程中都是相同的,所以可以在我们的进程中直接使用该地址。Win2000/xp系统很简单,98位有点麻烦,需要一些简单的计算。以下是win98下GetCommandLine函数的汇编代码:

。text:bff8c 907 GetCommandLineA proc near
。text:BFF8C907 mov eax,dword_BFFCADE4
。正文:BFF8C90C mov ecx,[eax]
。正文:BFF8C90E mov eax,[ecx+0C0h]
。正文:BFF8C914测试eax,EAX
。正文:BFF 8 c 916 jnz short locret _ BFF 8 c 91 e
。正文:BFF8C918MOVEAX,[ECX+40h]
。正文:BFF8C91B MOVEAX,[EAX+8]//Yes是我们要的地址
。正文:bff8c91e
。text:BFF 8 c 91 e locret _ BFF 8 c 91 e:;代码XREF: GetCommandLineA+F.
。text:BFF8C91E retn

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 用VC获取其它程序的命令行参数

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情