如何在驱动程序(SYS)中得到当前进程的完整路径和进程名?

原创 2002年05月08日 14:58:00
 首先利用PsGetCurrentProcessIoGetCurrentProcess函数得到当前进程的句柄,这个句柄是指向_EPROCESS结构的指针,_EPROCESS的结构如下:

typedef struct _EPROCESS


    {


    KPROCESS                     Pcb;


    NTSTATUS                     ExitStatus;


    KEVENT                       LockEvent;


    DWORD                        LockCount;


    QWORD                        CreateTime;


    QWORD                        ExitTime;


    PVOID                        LockOwner;


    DWORD                        UniqueProcessId;


    QWORD                        ActiveProcessLinks;


    DWORD                        QuotaPeakPoolUsage [2]; // NP, P


    DWORD                        QuotaPoolUsage     [2]; // NP, P


    DWORD                        PagefileUsage;


    DWORD                        CommitCharge;


    DWORD                        PeakPagefileUsage;


    DWORD                        PeakVirtualSize;


    QWORD                        VirtualSize;


    DWORD                        Vm [12];


    DWORD                        LastProtoPteFault;


    DWORD                        DebugPort;


    DWORD                        ExceptionPort;


    DWORD                        ObjectTable;


    DWORD                        Token;


    DWORD                        WorkingSetLock [8];


    DWORD                        WorkingSetPage;


    BOOLEAN                      ProcessOutswapEnabled;


    BOOLEAN                      ProcessOutswapped;


    BOOLEAN                      AddressSpaceInitialized;


    BOOLEAN                      AddressSpaceDeleted;


    DWORD                        AddressCreationLock [9];


    DWORD                        ForkInProgress;


    DWORD                        VmOperation;


    DWORD                        VmOperationEvent;


    DWORD                        PageDirectoryPte;


    QWORD                        LastFaultCount;


    PVOID                        VadRoot;


    DWORD                        VadHint;


    DWORD                        CloneRoot;


    DWORD                        NumberOfPrivatePages;


    DWORD                        NumberOfLockedPages;


    WORD                         w184;


    BOOLEAN                      ExitProcessCalled;


    BOOLEAN                      CreateProcessReported;


    HANDLE                       SectionHandle;


    struct _PEB                 *Peb;             // offset 0x1B0


    PVOID                        SectionBaseAddress;


    PVOID                        QuotaBlock;


    NTSTATUS                     LastThreadExitStatus;


    PROCESS_WS_WATCH_INFORMATION WorkingSetWatch;


    DWORD                        InheritedFromUniqueProcessId;


    ACCESS_MASK                  GrantedAccess;


    DWORD                        DefaultHardErrorProcessing;


    DWORD                        LdtInformation;


    DWORD                        VadFreeHint;


    DWORD                        VdmObjects;


    KMUTANT                      ProcessMutant;


    BYTE                         ImageFileName [16];              // offset 0x1FC


    DWORD                        VmTrimFaultValue [2];


    PVOID                        Win32Process;


    DWORD                        d1F8;


    DWORD                        d1FC;


    }


        EPROCESS,


     * PEPROCESS,


**PPEPROCESS;



从上面这个结构可以看出,进程名称就是ImageFileName,只要用_EPROCESS的基地址加上偏移地址0x1FC就可以得到进程名称的地址,代码如下:



char *ProcessName = (char*)PsGetCurrentProcess() + 0x1FC;


KdPrint((“Current Process Name: %s/n”, ProcessName));



要得到完整路径还需要利用_EPROCESS结构中的_PEB结构指针来得到ProcessParameters的地址。ProcessParameters保存着进程的完整路径。可以通过DDK附带的WinDbg工具打开一个可执行程序,然后用!peb命令来显示_PEB的结构信息。如下所示:

 


———————————————————————————————————————


> !peb


Debugger extension library [F:/WINNT/system32/ntsdexts] loaded


PEB at 7FFDF000


    InheritedAddressSpace:    No


    ReadImageFileExecOptions: No


    BeingDebugged:            Yes


    ImageBaseAddress:         00400000


    Ldr.Initialized: Yes


    Ldr.InInitializationOrderModuleList: 131f88 . 132998


    Ldr.InLoadOrderModuleList: 131ee0 . 132988


    Ldr.InMemoryOrderModuleList: 131ee8 . 132990


        00400000 D:/NtSysInfo.exe


        77F80000 F:/WINNT/System32/ntdll.dll


        77E60000 F:/WINNT/system32/KERNEL32.dll


        77DF0000 F:/WINNT/system32/USER32.dll


        77F40000 F:/WINNT/system32/GDI32.DLL


        76AF0000 F:/WINNT/system32/comdlg32.dll


        70BD0000 F:/WINNT/system32/SHLWAPI.DLL


        77D90000 F:/WINNT/system32/ADVAPI32.dll


        77D20000 F:/WINNT/system32/RPCRT4.DLL


        71700000 F:/WINNT/system32/COMCTL32.DLL


        77560000 F:/WINNT/system32/SHELL32.DLL


        78000000 F:/WINNT/system32/MSVCRT.DLL


        777C0000 F:/WINNT/System32/WINSPOOL.DRV


    SubSystemData:     0


    ProcessHeap:       130000


    ProcessParameters: 20000


        WindowTitle:  'D:/NtSysInfo.exe'


        ImageFile:    'D:/NtSysInfo.exe'


        CommandLine:  '"D:/NtSysInfo.exe" '


        DllPath:      'D:/;.;F:/WINNT/System32;F:/WINNT/system;F:/WINNT;F:/WINNT/system32;F:/WINNT;F:/WINNT/System32/Wbem;J:/WINDOWS;J:/WINDOWS/COMMAND;E:/WINDOWS/SYSTEM/WBEM;J:/WINDOWS;J:/WINDOWS/COMMAND;E:/WINDOWS/SYSTEM/WBEM;J:/WINDOWS;J:/WINDOWS/


COMMAND'



        Environment:  0x10000


 

WinDbg输出的PEB结构信息可以看出ProcessParameters的地址为0x20000ImageFile字段就是进程的完整路径。那么PorcessParamters的地址又保存在_PEB结构的什么地方呢?_PEB结构的基地址为0x7ffdf000,通过WinDbg的“db 0x7ffdf000 命令显示0x7ffdf000地址的信息可以发现ProcessParameters的地址保存在_PEB结构的0x10偏移量处,内容为0x20000


继续用“db 0x20000”命令显示ProcessParameters地址的内容,偏移量为0x3C处保存完整路径的地址,0x3C处的内容如果是:0x20670,利用“db 0x20670”即可显示出完整路径。完整路径用UNICODE格式保存。


我们利用程序模拟上面的步骤则可以得到当前进程的完整路径,代码如下:

PCWSTR GetCurrentProcessFileName()

{

       DWORD dwAddress = (DWORD)PsGetCurrentProcess();

       if(dwAddress == 0 || dwAddress == 0xFFFFFFFF)

              return NULL;

       dwAddress += 0x1B0;

       if((dwAddress = *(DWORD*)dwAddress) == 0) return 0;

       dwAddress += 0x10;

       if((dwAddress = *(DWORD*)dwAddress) == 0) return 0;

       dwAddress += 0x3C;

       if((dwAddress = *(DWORD*)dwAddress) == 0) return 0;

       KdPrint((“Current Process Full Path Name: %ws/n”,  (PCWSTR)dwAddress));

       return (PCWSTR)dwAddress;

} 


Windows NTWindows 2000_EPROCESS结构略有不同,所以偏移地址也不相同,故此上面的程序不能正常运行于Windows NT。要想在Windows NT下获得进程名和完整路径可以用类似的方法得出正确的偏移地址,进而编写出正确的程序。


如果想得到关于如何在Windows 9x的驱动程序(VXD)中得到当前进程的进程名和完整路径或者其他更多知识,可以访问费尔安全实验室的网站:http://www.xfilt.com

驱动中获取进程完整路径名

Submitted by boxcounter on 2009, July 23, 6:55 PM. windows编程(R0) 在OSR上无意中看到一篇文章,关于获取进程完整路径的。贴过来...
  • cosmoslife
  • cosmoslife
  • 2016年10月18日 12:49
  • 426

驱动中获取进程名的正确方法

这是个古老的话题,没有技术含量,只不过看到网上很多驱动代码在获取进程名时总喜欢去读偏移 EPROCESS.ImageFileName,感觉比较误导新人。 这个方法其实很不科学,硬编码偏移带来的兼容性...
  • wzsy
  • wzsy
  • 2016年04月29日 09:51
  • 1595

[转]驱动中获取进程完整路径名

Submitted by boxcounter on 2009, July 23, 6:55 PM. windows编程(R0)在OSR上无意中看到一篇文章,关于获取进程完整路径的。贴过来,最后有一点...
  • alwaysrun
  • alwaysrun
  • 2010年04月01日 10:42
  • 7701

如何在驱动程序(sys)中得到当前进程的完整路径和进程名?

学习雨盾的源码,看到了在驱动程序中得到当前进程的完整路径和进程名的代码,网上搜了一下,文档不少,学习。。。《摘自http://www.chinaitpower.com/A/2001-10-09/117...
  • qinlicang
  • qinlicang
  • 2009年08月27日 11:43
  • 1874

内核驱动程序中获取当前用户进程的进程名的方法

驱动程序的加载函数DriverEntry是运行在System进程中的.通过PsGetCurrentProcess可以获取System进程的内核EPROCESS结构的地址,然后从该地址开始寻找"Syst...
  • u011653354
  • u011653354
  • 2013年08月13日 09:29
  • 706

Windows下获取当前程序文件名或完整路径方法

1、通过用_splitpath函数对argv[0]参数进行分割,然后自行拼接组装字符串,想要哪个可以将其以参数传出。 int deal_for_work_path(char *full_path) {...
  • qq302501035
  • qq302501035
  • 2014年12月18日 21:17
  • 1401

[Win32] 获取进程完整路径

上两篇中,我们讲到了ToolHelp API,Process API和提升Debug权限,这一篇中来说说如何获取进程的程序路径。 获取进程路径其实有很多方法。 方法1。使用ToolHelp API枚举...
  • zuishikonghuan
  • zuishikonghuan
  • 2015年08月18日 10:35
  • 4883

FILE_OBJECT structure

FILE_OBJECT structure FILE_OBJECT 结构被系统用来表示一个文件对象,在用户模式的保护下的子系统中,一个问加你对象代表一个打开的文件,设备,目录或卷,对设备和中间层驱动而...
  • lanzheng_1113
  • lanzheng_1113
  • 2016年02月05日 10:03
  • 1550

驱动中获取进程完整路径名

原文地址:http://www.osronline.com/article.cfm?id=472     Over the years developers have needed or wanted...
  • xum2008
  • xum2008
  • 2010年05月01日 12:34
  • 3012

驱动获取自身路径示例代码

... OBJECT_ATTRIBUTES  objectAttributes;   UNICODE_STRING RegUnicodeKeyName;   HANDLE hRegister; ...
  • chence19871
  • chence19871
  • 2014年09月11日 14:46
  • 974
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何在驱动程序(SYS)中得到当前进程的完整路径和进程名?
举报原因:
原因补充:

(最多只允许输入30个字)