摆脱DLL"地狱"的困扰之获取进程的命令行
2008-03-03 13:11
561 查看
摆脱DLL"地狱"的困扰之获取进程的命令行
2006-03-03 10:11 作者: NorthTibet编译 出处: vckbase 责任编辑:方舟方法 | 描述 |
GetName | 以NULL作为参数,调用 GetModuleBaseName ,最后去掉扩展名 “.EXE” |
GetFileName | 以NULL作为参数,调用 GetModuleFileNameEx |
GetMainWindowHandle | 参见GetMainWindowHandle |
GetMainWindowTitle | |
GetParentProcessID | 用ProcessBasicInformation作为参数调用NtQueryInformationProcess |
GetKERNELHandleCount | 用ProcessHandleCount作为参数调用NtQueryInformationProcess |
GetUSERHandleCount | 用GR_USEROBJECTS作为参数调用GetGuiResources |
GetGDIHandleCount | 用GR_GDIOBJECTS作为参数调用GetGuiResources |
GetWorkingSet | 调用GetProcessMemoryInfo |
GetCmdLine | 参见GetProcessCmdLine |
GetOwner | 参见GetProcessOwner的细节 |
GetSessionID | ProcessIdToSessionId (参见对快速用户转换的讨论部分——Windows XP的一个新特性) |
GetModuleList | CModuleList是一个对EnumProcessModules 和GetModuleFileNameEx的打包类 |
GetChildrenCount | 以及子进程清单 要获取某个进程的子进程列表,目前还没这样的API(即便有也未公开)可供使用。但是,因为某个进程的父进程是已知的,所以将某个进程加到其父进程的子进程列表中不难(参见SetChildrenList的实现) |
但是你怎么知道cmd.exe被调用的时候用的是什么参数呢?那么在微软的调试工具(可以在vckbase站点下载)中有一个命令行程序TLIST.EXE,用它可以知道cmd.exe运行的参数,TLIST.EXE是个控制台程序,其输出的信息包括运行进程清单以及命令行,如果用进程ID作为参数调用此程序,例如用cmd.exe的进程ID作为参数载C:盘根目录(C:/)运行TLIST:
C:/>tlist 632
632 CMD.EXE C:/WINNT/System32/cmd.exe - tlist 632
CWD: C:/
CmdLine: C:/WINNT/System32/cmd.exe /k cd "C:/"
VirtualSize: 13408 KB PeakVirtualSize: 13412 KB
WorkingSetSize: 948 KB PeakWorkingSetSize: 952 KB
NumberOfThreads: 1
968 Win32StartAddr:0x4ad1a420 LastErr:0x000000cb State:Waiting
5.0.2195.1600 shp 0x4ad00000 cmd.exe
5.0.2195.1600 shp 0x77f80000 ntdll.dll
5.0.2195.1600 shp 0x77e80000 KERNEL32.dll
5.0.2195.1600 shp 0x77e10000 USER32.dll
5.0.2195.1340 shp 0x77f40000 GDI32.DLL
5.0.2195.1600 shp 0x77db0000 ADVAPI32.dll
5.0.2195.1615 shp 0x77d40000 RPCRT4.DLL
6.1.8637.0 shp 0x78000000 MSVCRT.dll
第三行的参数/k cd "C:/"用于外壳调用cmd.exe。如果指定了/k,则cmd.exe执行指定的命令,但是不退出。由于这时调用的应用程序,所以在你构造的工具中这样使用行不通的,必须通过API函数调用。
TLIST工具的源代码可以在MSDN中找到,也可以在vckbase站点下载。可惜用这个代码只能得到进程的ID,名称和主窗口。可以用三种不同的途径来获取某个进程的命令行。第一种是比较猛的一种方法:那就是在汇编一级钻研TLIST程序。Process.cpp文件中的GetProcessCmdLine 就是钻研的成果,这个函数可以在特定的进程的地址空间中找到进程的命令行。指向命令行(Unicode字符)的指针存储在一个内存块中,这个内存块就是进程环境块--Process Environment Block(PEB)中的一个域所指的地址。有关PEB结构的详细内容将在下一部分讨论。
第二种方法是在Web上搜索,看看是否有人已经解决了这个问题!GetCommandLine可以得到命令行,但仅用于调用进程。最好是用CreateRemoteThread在另一个进程上下文中执行这个调用。此方法的细节请参考 Felix Kasza 的文章:CreateRemoteThread。
第三种方法是代码重用,或者说得更确切一些是输出重用。你可以通过捕获TLIST程序的输出,然后解析这些输出,从而获得命令行。在本文的后面部分,我们会对这个方法进行完全的讨论。
相关文章推荐
- 摆脱DLL"地狱"的困扰之获取进程信息
- 摆脱DLL"地狱"的困扰之获取进程信息
- 摆脱DLL"地狱"困扰之目前的困境
- 摆脱DLL"地狱"的困扰之获取进程信息
- 通过HttpServletRequest获取请求header信息及request.getHeader("referer")的作用
- 获取系统进程信息和进程依赖的dll信息--CreateToolhelp32Snapshot
- 如果用JavaScript获取标准下拉框的"选中值"和"选中文本"
- all references to"*.dll" discarded by /OPT:REF
- eclipse后台进程一直提示"computing additional info"的解决办法
- 用VC写DLL中"error LNK2005: _DllMain@12 already defined"的应对
- xode6 beta版本开发swift 时"Developer tools access" 需控制另一个进程才能继续调试 解决方案
- 用VC写DLL中"error LNK2005: _DllMain@12 already defined"的应对
- servlet request getHeader("x-forwarded-for") 获取真实IP
- 编译DLL时"error LNK2005: _DllMain@12 already defined"错误
- -Dsvn-revision-number.failOnError=false 解决"svn和maven版本不匹配命令行deploy到nexus私服报错"
- vista&windows7下命令行结束进程
- 用VC写DLL中"error LNK2005: _DllMain@12 already defined"的应对 .
- 一次影响历史进程的"性贿赂"
- 判断当前进程是否"以管理员身份运行"的
- <input type="file"/>如何获取判断获取文件后缀