`
isiqi
  • 浏览: 16572290 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

摆脱DLL"地狱"的困扰之获取进程的命令行

阅读更多

摆脱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的实现)

  上表列出的方法中有一个是 GetCmdLine,这个函数返回进程的命令行。实际上,它并不是真正地返回命令行,而是返回进程启动时接收的参数。例如,如果你安装了微软Power Toys中的TweakUI程序(可以在vckbase站点下载),当你在Windows的资源管理器中的任何文件夹上单击右键,则在弹出的上下文菜单中都会有一个"Run Command Prompt Here"菜单项。执行这个菜单命令后,会弹出命令提示窗口,并且所点击的目录为当前工作目录。

  但是你怎么知道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程序的输出,然后解析这些输出,从而获得命令行。在本文的后面部分,我们会对这个方法进行完全的讨论。
分享到:
评论

相关推荐

    获取进程命令行(3法)的软件源码

    在IT领域,获取进程命令行参数是常见的需求,特别是在系统监控、调试或者安全分析中。本文将详细解析三种方法来实现这一功能,并提供VB(Visual Basic)语言的源码示例。 方法一:使用Windows API函数 Windows操作...

    dotnet 获取指定进程的输入命令行

    其中,`OpenProcess`用于获取进程句柄,`GetCommandLineW`用于获取进程的命令行字符串。 2. **权限与访问标志** 在调用`OpenProcess`时,需要指定访问权限。常用的有`PROCESS_QUERY_INFORMATION`和`PROCESS_VM_...

    别再掉进DLL地狱的陷阱里(DLL_Hell

    别再掉进DLL地狱的陷阱里(DLL_Hell)~.NET解决之道

    控制面板命令行大全详解

    ### 控制面板命令行大全详解 #### 一、概述 在Windows操作系统中,控制面板是一个集成了各种系统设置和管理工具的重要组件。用户可以通过控制面板调整计算机的各种设置,包括硬件配置、用户账户管理、网络设置等。...

    命令行下获取exe/dll的版本号

    最近做自动化编译时,没办法自动获取编译后的版本号进行打包,所以就写了这个小工具,使用方法以为: version abc.exe 返回为abc.exe的版本号如:1.2.0.2。源代码也带上了,大家有问题,可以自己修改。

    易语言创建进程注入DLL

    在易语言中,创建进程注入DLL是一项常见的技术操作,它主要用于实现程序间的数据共享、功能扩展或者隐蔽执行某些任务。这里我们将深入探讨这个主题。 首先,让我们了解什么是“创建进程”和“DLL注入”。创建进程是...

    c#使用PDFBox-0.7DLL文件转换pd成txt 命令行DOS方式 源码例子

    在命令行DOS方式下运行这个C#程序,我们需要编译源码生成exe文件,然后在命令行中指定PDF文件和DLL文件的路径。例如: ```cmd > cd path_to_your_project_folder > csc PdfToTextConverter.cs /r:path_to_pdfbox_...

    提示缺少mspdb80.dll的解决办法

    `dumpbin.exe`是微软提供的一种命令行工具,用于查看PE(Portable Executable)文件的详细信息,包括DLL和EXE文件的头信息、导出和导入函数等。 mspdb80.dll是Microsoft Public Symbol Server的一部分,它包含了...

    取进程命令行参数

    在Windows系统中,获取进程命令行参数主要通过Windows API来实现。具体来说,可以使用`CreateToolhelp32Snapshot`函数创建一个进程快照,然后用`Process32First`和`Process32Next`遍历所有进程。当找到目标进程ID时...

    易语言API创建暂停进程进行DLL注入

    易语言API创建暂停进程进行DLL注入源码,API创建暂停进程进行DLL注入,GetCmdLine,命令行缓冲区_,取文本内容长度_,CopyMemory,SN_CreateProcessA,SN_InjectDllA

    定制调试诊断工具和实用程序——摆脱DLL地狱(DLL Hell)的困扰VC源代码

    在 Windows 系统中,动态库版本冲突实在是一个老大难的问题了,为了解决这个问题,除了使用大量现有的工具外,你还可以利用丰富的 ...关键字:instrumentation, tool,utility,dll hell,dll,debug,调试,工具,实用程序

    C# DLL 进程注入示例。

    之后,使用`Kernel32.dll`库中的`OpenProcess`函数获取进程句柄。 3. **加载DLL**:接下来,使用`LoadLibrary`函数将DLL加载到目标进程中。由于这是系统级别的操作,我们需要使用P/Invoke(平台调用)来调用WinAPI...

    易语言源码易语言取进程映像路径及命令行参数.rar

    在易语言中,获取进程映像路径通常需要调用系统API函数,如“kernel32.dll”库中的“GetModuleFileName”函数。这个函数可以获取当前进程的主模块(通常是可执行文件)的完整路径。在易语言源码中,可能会使用“调用...

    c++获取进程信息列表和进程所调用的dll列表

    在C++编程中,获取进程信息列表以及进程所调用的DLL列表是系统监控和调试的重要环节。本文将详细介绍如何使用C++实现这一功能,并提供相关的代码示例。 首先,我们需要了解两个关键的Windows API函数:`...

    易语言源码枚举句柄关闭进程DLL模块源码.rar

    2. **获取进程信息**:利用`GetProcessImageFileName`或`QueryFullProcessImageName`函数获取进程的可执行文件路径,进一步可以获取进程名称。 3. **枚举DLL模块**:对每个进程,使用`EnumProcessModules`函数获取...

    易语言结束进程中的DLL

    易语言结束进程中的DLL源码,结束进程中的DLL,提升进程权限,列表,表项,取模块路径,列调用的模块,结束进程中DLL,Module32First,ExtractIconA,打开进程,获取线程,打开令牌,恢复权限,获取令牌特权,CreateToolhelp32...

    DLL进程注入器 把DLL文件注入到选定进程中

    1. **获取进程句柄**:首先,你需要知道目标进程的进程ID,然后使用`OpenProcess`函数获取该进程的句柄,这允许你对目标进程进行操作。 2. **加载DLL**:接下来,你需要使用`VirtualAllocEx`函数在目标进程的地址...

    获取所有进程的映像路径以及命令行参数

    在Windows操作系统中,获取所有进程的映像路径和命令行参数是系统监控和调试过程中的常见需求。这有助于我们理解程序的启动方式、追踪问题或优化系统性能。本篇文章将详细探讨如何通过命令行工具来实现这一目标。 ...

    exe将dll注入到explorer.exe资源管理器进程_DLL注入示例.injectdll

    2. 获取进程句柄:DLL注入的目标是explorer.exe进程。你需要获取这个进程的句柄,这通常通过`OpenProcess`函数完成,需要提供进程ID和适当的访问权限。 3. 加载DLL:然后,使用`VirtualAllocEx`在目标进程的地址...

    SetWindowsHookEx进程dll注入

    2. 获取进程句柄:通过OpenProcess函数获取目标进程的句柄,需要适当的访问权限,如 PROCESS_ALL_ACCESS 或者 PROCESS_VM_OPERATION。 3. 计算内存地址:确定DLL的入口点(例如DLLMain)在目标进程中的内存地址。这...

Global site tag (gtag.js) - Google Analytics