【问题标题】:How to get current working directory from windows kernel mode driver code?如何从 Windows 内核模式驱动程序代码中获取当前工作目录?
【发布时间】:2020-05-17 01:21:44
【问题描述】:

我正在编写一个使用 API 的 Windows 内核模式驱动程序

PsSetCreateProcessNotifyRoutineEx

在它的回调函数中,我需要获取进程的当前工作目录。 如何做到这一点?任何想法、线索都会非常有用。

提前致谢。

【问题讨论】:

  • 通过PsGetProcessPeb获取PEB地址,附加到进程,然后读取ProcessParameters->CurrentDirectory.DosPath
  • 有什么用?在驱动程序中使用它似乎是个坏主意。进程工作目录是为用户模式下的单线程代码设计的一种便利,即使是大多数 Windows 程序(包括 PowerShell)也会忽略它。在内核中,对象和 I/O 管理器不使用进程的工作目录。在 NT API 中,相对文件路径是相对于文件对象的句柄和前导“.”的。组件没有意义。
  • 嗨@RbMm,我对驱动程序开发非常陌生,所以我的知识非常基础。从您之前的评论中,我发现 PsGetProcessPeb 是未记录的 Windows API,这可能会使驱动程序变得脆弱。那么有什么方法可以从驱动代码的标准 API 中获取 CWD 呢?
  • 如果你害怕使用“undocumenred” api - 不要接受这样的任务
  • @Hemant:你能澄清一下进程的“当前工作目录”是什么意思吗?该进程可能具有许多目录的打开句柄。您绝对可以掌握所有这些。可以告诉我们您要解决什么更大的问题?

标签: windows winapi kernel driver wdm


【解决方案1】:

以下代码解决了问题

KAPC_STATE ka_state;
WCHAR   CWDBuffer[MAX_PATH] = { 0 };
USHORT  CWDBytes = 0;

UNICODE_STRING GetProcessPeb = RTL_CONSTANT_STRING(L"PsGetProcessPeb");
PsGetPeb = (PsGetProcessPeb)MmGetSystemRoutineAddress(&GetProcessPeb);
if (PsGetPeb)
{
    Peb = PsGetPeb(Process); // Process is handle to current process
    if (Peb) {
        KeStackAttachProcess(Process, &ka_state);

        if (Peb->ProcessParameters->CurrentDirectory.DosPath.Length < (MAX_PATH * sizeof(WCHAR)))
        {
            CWDBytes = Peb->ProcessParameters->CurrentDirectory.DosPath.Length;
        }
        else
        {
            CWDBytes = MAX_PATH * sizeof(WCHAR);
        }

        memcpy(CWDBuffer, Peb->ProcessParameters->CurrentDirectory.DosPath.Buffer, CWDBytes);

        KeUnstackDetachProcess(&ka_state);
    }
    else {
        DbgPrintEx(
            DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL,
            "Unable to get PEB\n"
        );
    }
}

【讨论】:

  • 我通过在 loadimage 事件期间访问 PEB 来尝试类似的事情,除了我想在系统加载它们时报告每个非 DLL 图像的命令行参数。经过数小时尝试不同的方法但不起作用,这里使用的技术是最好和最直接的解决方案。
  • 这里出现了严重的缓冲区溢出问题。 CWDBuffer 的最大大小为 260,但稍后您尝试写入 520 (MAX_PATH * sizeof(WCHAR))。
猜你喜欢
  • 2012-01-12
  • 2013-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-24
  • 1970-01-01
相关资源
最近更新 更多