【问题标题】:Kernel Writing Process Memory causing BSOD内核写入进程内存导致 BSOD
【发布时间】:2016-05-19 01:32:50
【问题描述】:

我在编写进程内存时遇到问题,在线查看资源我尝试编译 Cheat Engine 的方式。

BOOLEAN fWriteProcessMemory(ULONG PID, PEPROCESS PEProcess, PVOID Address, ULONG Size, PVOID Buffer)
{
    PEPROCESS selectedprocess = PEProcess;
    KAPC_STATE apc_state;
    NTSTATUS ntStatus = STATUS_UNSUCCESSFUL;

    if (selectedprocess == NULL)
    {
        if (!NT_SUCCESS(PsLookupProcessByProcessId((PVOID)(UINT_PTR)PID, &selectedprocess)))
            return FALSE;
    }

    UINT_PTR temp = (UINT_PTR)Address;

    RtlZeroMemory(&apc_state, sizeof(apc_state));

    KeAttachProcess((PEPROCESS)selectedprocess);

    char* target;
    char* source;
    unsigned int i;

    target = Address;
    source = Buffer;

    for (i = 0; i<Size; i++)
    {
        target[i] = source[i];
    }
    ntStatus = STATUS_SUCCESS;

    KeDetachProcess();

    return NT_SUCCESS(ntStatus);
}

虽然在调用它时会出现问题,但每次 target[i] = source[i]; 都会导致 BSOD;

可能是我输入了不正确的“地址”/“大小”/“缓冲区”,但这是我的配置:

fWriteProcessMemory(GlobalProcessID, GlobalProcessPE, (PVOID)(*(ULONG*)pBuf), sizeof(ULDat), (PVOID)ULDat)

以 ULDat 作为要写入的内存(ULONG),pBuf 即 Irp->AssociatedIrp.SystemBuffer 作为要写入的内存地址。

任何帮助将不胜感激,谢谢。

【问题讨论】:

  • 内存中的源缓冲区在哪里 - 是内核分配的内存,还是在您的进程中?换句话说——ULDat 是从哪里来的?它的类型是什么。您说它是 ULONG 但您将其转换为 PVOID,这很奇怪。如果它是一个持有 ULONG 的变量,你应该传递一个指针 (PVOID)&ULDat 而不仅仅是 (PVOID)ULDat
  • 这是一个存储在驱动程序中的变量:ULONG ULDat = 6969UL(别笑:)) - 在写入内存时,它在过程中使用 KeAttach 在技术上如此,不是吗?我会用 &ULDat 试一试,不过谢谢你的帮助

标签: c windows kernel kmdf


【解决方案1】:

如果ULDat = 6969 则 (PVOID)ULDat 是指向内存位置地址 6969(或 0x1b39 hexa)的指针,那么在您的循环中,source[i] 试图从地址(0x1b39 + i)中选择一个字符,这就是它蓝屏的原因。

是的,在那里使用 &ULDat,这就是解决方案。

【讨论】:

  • 非常感谢!这就是解决方案!
猜你喜欢
  • 1970-01-01
  • 2018-01-06
  • 2011-12-15
  • 2011-12-03
  • 1970-01-01
  • 1970-01-01
  • 2011-09-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多