【问题标题】:Getting BSOD After When Trying To Print The Next Process Name In LIST_ENTRY List尝试在 LIST_ENTRY 列表中打印下一个进程名称后出现 BSOD
【发布时间】:2021-08-10 12:38:08
【问题描述】:

我正在尝试在LIST_ENTRY 列表中的我的进程之后打印下一个进程名称。 但我总是蓝屏。

#include <Ntifs.h>
#include <ntddk.h>
#include <WinDef.h>

void SampleUnload(_In_ PDRIVER_OBJECT DriverObject) {

    UNREFERENCED_PARAMETER(DriverObject);
    DbgPrint("Sample driver Unload called\n");
}


extern "C"
NTSTATUS
DriverEntry(_In_ PDRIVER_OBJECT DriverObject, _In_ PUNICODE_STRING RegistryPath) {
    UNREFERENCED_PARAMETER(RegistryPath);
    DriverObject->DriverUnload = SampleUnload;
    DbgPrint("Sample driver Load called\n");

    PEPROCESS EP;
    if (::PsLookupProcessByProcessId(::PsGetCurrentProcessId(), &EP) == STATUS_INVALID_PARAMETER) {
        DbgPrint("Can't get EPROCESS");
        return STATUS_INVALID_PARAMETER;
    }

    LIST_ENTRY list_entry = *((LIST_ENTRY*)(LPBYTE)EP + 0x448);
    UCHAR* fileName;
    fileName = ((UCHAR*)(LPBYTE)list_entry.Flink - 0x448 + 0x5a8);

    for (int i = 0; i < 15; i++)
        DbgPrint("%u" , fileName[i]);

    DbgPrint("Finish");

    return STATUS_SUCCESS;
}

EPROCESS 结构中,0x448 偏移量中有一个LIST_ENTRY 对象。 所以我创建了一个LIST_ENTRY 对象并将他分配给EPROCESS + 0x448 的地址,然后我将0x5a8-0x448 添加到LIST_ENTRY.FLINK。 假设在0x5a8 偏移量中到达ImageFileName 数组。

但是由于某种原因它不起作用。

【问题讨论】:

  • 哪个代码行触发了蓝屏?
  • 我不知道,我很喜欢司机的世界。我该如何检查?
  • *((LIST_ENTRY*)(LPBYTE)EP + 0x448); 您可以尝试在(LPBYTE)EP + 0x448 周围添加一些括号,以确保在转换为LIST_ENTRY* 之前完成指针运算
  • 现在我正在使用 ascii 获取安全系统。如何将其转换为字符串?

标签: c++ c winapi driver winappdriver


【解决方案1】:

您的代码中有多个无意义的强制转换:

*((LIST_ENTRY*)(LPBYTE)EP + 0x448);

((UCHAR*)(LPBYTE)list_entry.Flink - 0x448 + 0x5a8);

这意味着例如将EP(不是它的地址)转换为字节指针,然后(因为强制转换具有从右到左的关联性)立即忘记转换为字节指针,而是转换为@987654324 @。然后在犹豫要使用哪种类型时,对LIST_ENTRY 对象执行指针运算。那是0x448 * sizeof(LIST_ENTRY) 字节。

我猜你实际上是打算这样做的:

LPBYTE lpb = (LPBYTE)&EP + 0x448;
LIST_ENTRY list_entry = *(LIST_ENTRY*)lpb;

不过,这可能是一个严格的别名违规错误。或者对齐错误。

【讨论】:

  • 只有(LPBYTE)EP + 0x448 没有&amp;。这当然与“严格的别名违规”无关,但所有有问题的代码都是荒谬的并且充满错误
  • @tantan 1 PsLookupProcessByProcessId(::PsGetCurrentProcessId()) - 毫无意义。使用PsGetCurrentProcess 2 错误检查PsLookupProcessByProcessId 是错误的3 ObfDereferenceObject(EP) 未调用4 使用硬编码的偏移量总是错误的跨度>
  • 嘿@RbMm,我怎样才能避免使用硬编码的偏移量?
猜你喜欢
  • 2017-12-11
  • 2021-09-15
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多