在内核驱动中,获得到当前进程的全路径

版权所有,转载请注明出处:【在内核驱动中,获得到当前进程的全路径】http://www.3600safe.com/?post=129
引用: http://www.3600safe.com/tb.php?sc=f23899&id=129

 

在内核驱动中,获得到当前进程的全路径

作者: A盾电脑防护 ⁄ 时间:2012年08月14日 ⁄ 分类: 进程/进程对象 评论:0

作者:guijc

 

在应用层想要获得一个进程的全路径,有一个很简单的API函数,但是在内核中却没有提供这样的函数,上次看了一位前辈的帖子,根据他的思路写出了下面的代码,欢迎大家的评论

 

代码思路如下:

1. 利用ZwQueryInformationProcess得到当前进程的NT路径

2. 用ZwOpenFile打开NT路径,获得进程的句柄

3. 用ObReferenceObjectByHandle获得内核对象(FileObj)

4. 获得盘符(C:\),RtlVolumeDeviceToDosName(FileObj->DeviceObject, &DosName);

5. 拼接路径,RtlAppendUnicodeStringToString(&ImageName, &FileObj->FileName);

 

好了废话不多,直接上代码:

 

void GetProcessImageName(PANSI_STRING ImageFileName)
{  
    UNICODE_STRING  ImageName = {0};
    PUNICODE_STRING Buffer = NULL;
    ULONG ReturnLength = 0;
    NTSTATUS status = 0;  

    HANDLE FileHandle = NULL;
    OBJECT_ATTRIBUTES ObjectAttributes = {0};
    IO_STATUS_BLOCK IoStatusBlock = {0};
    PFILE_OBJECT FileObj = NULL;
    UNICODE_STRING DosName = {0};

    status = ZwQueryInformationProcess(
                            NtCurrentProcess(),
                            ProcessImageFileName, 
                            NULL, 
                            0, 
                            &ReturnLength);

    if(STATUS_INFO_LENGTH_MISMATCH != status ||  0 == ReturnLength){
        return;
    }

    Buffer = ExAllocatePool(NonPagedPool, ReturnLength);
    if(NULL == Buffer){
        goto Clean;
    }
    
    status = ZwQueryInformationProcess(
                            NtCurrentProcess(),
                            ProcessImageFileName, 
                            Buffer, 
                            ReturnLength, 
                            &ReturnLength);

    if(!NT_SUCCESS(status)){
        goto Clean;
    }

    InitializeObjectAttributes( &ObjectAttributes,
                            Buffer,
                            OBJ_KERNEL_HANDLE,
                            NULL,
                            NULL );

    status = ZwOpenFile(&FileHandle, 0, &ObjectAttributes, &IoStatusBlock, 0, 0);
    if (!NT_SUCCESS (status)){
       goto Clean; 
    }

    status = ObReferenceObjectByHandle(FileHandle, 0, NULL, KernelMode, &FileObj, NULL);
    if (!NT_SUCCESS (status)){
       goto Clean; 
    }

    if(FileObj->DeviceObject && FileObj->FileName.Buffer){
    
        RtlVolumeDeviceToDosName(FileObj->DeviceObject, &DosName);

        ImageName.MaximumLength = DosName.Length + FileObj->FileName.Length;
        ImageName.Buffer = ExAllocatePool(NonPagedPool, ImageName.MaximumLength);        

        RtlCopyUnicodeString(&ImageName, &DosName);
        RtlAppendUnicodeStringToString(&ImageName, &FileObj->FileName);
        
        RtlUnicodeStringToAnsiString(ImageFileName ,&ImageName, TRUE);
        RtlFreeUnicodeString(&ImageName);
        RtlFreeUnicodeString(&DosName);
    }
    
Clean:

    if(Buffer){
        ExFreePool (Buffer);
    }

    if(FileHandle){
        ZwClose(FileHandle); 
    }    

    if(FileObj){
        ObDereferenceObject(FileObj);
    }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值