我在编写进程内存、在线查看源代码时遇到了问题,我试图编译欺骗引擎的方式。
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);
}尽管人们一提到它就产生了问题,每次目标都会引起一次BSOD;
可能是我输入了错误的“地址”/“大小”/“缓冲区”,但以下是我的配置:
fWriteProcessMemory(GlobalProcessID, GlobalProcessPE, (PVOID)(*(ULONG*)pBuf), sizeof(ULDat), (PVOID)ULDat)将ULDat作为要写入的内存(ULONG),将Irp->AssociatedIrp.SystemBuffer的pBuf作为要写入的内存地址。
任何帮助都将不胜感激,谢谢。
发布于 2016-02-09 08:41:13
如果ULDat = 6969 char (PVOID)ULDat是指向内存位置地址6969 (或0x1b39十六进制)的指针,那么在您的循环中,sourcei试图从地址(0x1b39 + i)中选择一个字符,这就是它的BSOD的原因。
所以是的,在那里使用&ULDat,这就是解决方案。
https://stackoverflow.com/questions/35285718
复制相似问题