内核写入进程内存导致BSOD

时间:2016-02-09 06:55:20

标签: c windows kernel kmdf

我一直在编写处理内存,在线查看来源时遇到问题我已经尝试编译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);
}

虽然每当目标[i] =来源[i]时,在调用它时导致BSOD的问题就会增加;

可能是我输入了错误的&#39;地址&#39;尺寸&#39; /&#39;缓冲区&#39;但这是我的配置:

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

将ULDat作为要写入的内存(ULONG),将prpf作为Irp-&gt; AssociatedIrp.SystemBuffer作为要写入的内存地址。

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

1 个答案:

答案 0 :(得分:2)

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

所以是的,在那里使用&amp; ULDat,这是解决方案。