zwCreateProcess获得目标进程名

参数KeyHandle 为SectionHandle。

解决了文件名因为缓冲机制导致的修改文件名,但获得的文件名是老名的问题。

有两种文件对象控制区域,DataSection 和 ImageSection

ImageSection :文件映像,进程退出时没被释放,而被放到空闲内存区域,以被重用
DataSection   :  数据副本, 进程退出,被释放

在获得文件对象方法中,添加了

 pFile = ((PFILE_OBJECT)pFile)->SectionObjectPointer->DataSectionObject;
 pFile =(PVOID)*(ULONG   *)((char   *)pFile+36);  

在2003上测试过,vista以上版本还没测试。


但还有一点疑问,在打开文件时,记录了文件FileObject,这里得到的FileObject还是和打开时不同,还有映像的FileObject也和打开对象不同,比较奇怪。


NTSTATUS   GetFullName(HANDLE     KeyHandle,char   *fullname)   

{   
    NTSTATUS   ns;   
    PVOID   pKey=NULL,pFile=NULL;   
    UNICODE_STRING                   fullUniName;   
    ANSI_STRING                           akeyname;   
    ULONG   actualLen;   
    UNICODE_STRING   dosName;   
    //char name_c[260] = {0};
//    PVOID datafile;
    
    UNREFERENCED_PARAMETER(actualLen);
    fullUniName.Buffer=NULL;   
    fullUniName.Length=0;   
    fullname[0]=0x00;   
    ns=   ObReferenceObjectByHandle(   KeyHandle,   0,   NULL,   KernelMode,   &pKey,   NULL   )   ;   
    if(   !NT_SUCCESS(ns))   
    {
        return   ns;   
    }

    
    
    fullUniName.Buffer   =   ExAllocatePool(   PagedPool,   MAX_PATH_LEN*2);//1024*2   
    fullUniName.MaximumLength   =   MAX_PATH_LEN*2;   
    
    __try   
    {   
        // KdPrint(("GetFullName 0\r\n"));
        pFile=(PVOID)*(ULONG   *)((char   *)pKey+20);   
        pFile=(PVOID)*(ULONG   *)((char   *)pFile);   
        pFile=(PVOID)*(ULONG   *)((char   *)pFile+36);   

        //add------ not test for vista
         //因为有缓存机制,需要重datasection中获得文件名
        pFile = ((PFILE_OBJECT)pFile)->SectionObjectPointer->DataSectionObject;
        pFile =(PVOID)*(ULONG   *)((char   *)pFile+36);   
        //added-------
        
        
        ObReferenceObjectByPointer(pFile,   0,   NULL,   KernelMode);   
        
        
        //RtlVolumeDeviceToDosName(((PFILE_OBJECT)pFile)->DeviceObject,&dosName);   
        IoVolumeDeviceToDosName(((PFILE_OBJECT)pFile)->DeviceObject,&dosName);   
        //ns=ObQueryNameString(   pFile,   fullUniName,   MAX_PATH_LEN,   &actualLen   );   
        RtlCopyUnicodeString(&fullUniName,   &dosName);   
        RtlAppendUnicodeStringToString(&fullUniName,&((PFILE_OBJECT)pFile)->FileName);   
        ObDereferenceObject(pFile);   
        ObDereferenceObject(pKey   );   
        
        RtlUnicodeStringToAnsiString(   &akeyname,   &fullUniName,   TRUE   );   
        if(akeyname.Length<MAX_PATH_LEN)     
        {   
            memcpy(fullname,akeyname.Buffer,akeyname.Length);   
            fullname[akeyname.Length]=0x00;   
        }   
        else   
        {   
            memcpy(fullname,akeyname.Buffer,MAX_PATH_LEN);   
            fullname[MAX_PATH_LEN-1]=0x00;   
        }   
        
        RtlFreeAnsiString(   &akeyname   );   
        ExFreePool(dosName.Buffer);   
        ExFreePool(   fullUniName.Buffer   );   
        
        return   STATUS_SUCCESS;   
        
    }   
    
    __except(1)   
    {   
           KdPrint(("GetFullName except\r\n"));
           if(fullUniName.Buffer)   ExFreePool(   fullUniName.Buffer     );   
           if(pKey)   ObDereferenceObject(pKey   );   
           return   STATUS_SUCCESS;   
           
    }   
    


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Windows 驱动程序中创建进程可以使用 ZwCreateProcess 或 NtCreateProcess 函数。这两个函数是内核级函数,可以在驱动程序中使用。 下面是一个简单的示例代码,展示了如何在驱动程序中使用 ZwCreateProcess 函数创建一个新的进程: ```cpp #include <ntddk.h> NTSTATUS CreateProcessInDriver() { UNICODE_STRING processPath; RtlInitUnicodeString(&processPath, L"\\SystemRoot\\System32\\notepad.exe"); OBJECT_ATTRIBUTES objectAttributes; InitializeObjectAttributes(&objectAttributes, NULL, OBJ_KERNEL_HANDLE, NULL, NULL); HANDLE processHandle; CLIENT_ID clientId; NTSTATUS status = ZwCreateProcess(&processHandle, PROCESS_ALL_ACCESS, &objectAttributes, NtCurrentProcess(), TRUE, NULL, NULL, NULL); if (NT_SUCCESS(status)) { // 成功创建进程,可以对进程进行操作 // ... ZwClose(processHandle); } return status; } NTSTATUS DriverEntry(PDRIVER_OBJECT driverObject, PUNICODE_STRING registryPath) { NTSTATUS status = CreateProcessInDriver(); if (!NT_SUCCESS(status)) { // 进程创建失败,处理错误 // ... } return status; } ``` 请注意,上述代码仅为示例,并未包含完整错误处理和其他必要的步骤。在实际的驱动程序开发中,你需要进行更多的错误处理和适应性调整,以确保代码的正确性和安全性。 另外,请务必牢记在内核级编程中的风险和挑战,确保你有足够的内核编程知识和理解,以避免对系统的不良影响或造成安全风险。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值