NTSTATUS MyWriteMemory(IN HANDLE hProcess,OUT PVOID BaseAddress,IN PVOID Pbuff,IN ULONG BufferSize)
{
KdPrint((
"MyWriteMemory参数检查\nhProcess:%X\nBaseAddress:%X\nPbuff:%X\n缓冲内容:%s\nBufferSize:%d\n检查结束\n"
,hProcess,BaseAddress,Pbuff,(char*)Pbuff,BufferSize));
if
(hProcess==NULL)
{
KdPrint((
"失败:1\n"
));
return
STATUS_UNSUCCESSFUL;
}
NTSTATUS status=STATUS_UNSUCCESSFUL;
PEPROCESS EProcess;
KAPC_STATE ApcState;
PVOID writebuffer=NULL;
status = ObReferenceObjectByHandle(
hProcess,
PROCESS_VM_WRITE|PROCESS_VM_READ,
NULL,
KernelMode,
(VOID**)&EProcess,
NULL
);
if
(!NT_SUCCESS(status))
{
ObDereferenceObject(EProcess);
KdPrint((
"失败:2\n"
));
return
STATUS_UNSUCCESSFUL;
}
writebuffer = ExAllocatePoolWithTag (NonPagedPool, BufferSize,
'Sys'
);
if
(writebuffer==NULL)
{
ObDereferenceObject(EProcess);
ExFreePool (writebuffer);
KdPrint((
"失败:3\n"
));
return
STATUS_UNSUCCESSFUL;
}
*(ULONG*)writebuffer=(ULONG)0x1;
if
(MmIsAddressValid(Pbuff))
{
__try
{
ProbeForRead ((CONST PVOID)Pbuff, BufferSize, sizeof(CHAR));
RtlCopyMemory (writebuffer, Pbuff, BufferSize);
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
KdPrint((
"失败:4\n"
));
status = STATUS_UNSUCCESSFUL;
}
}
else
{
KdPrint((
"失败:5\n"
));
status = STATUS_UNSUCCESSFUL;
}
if
(NT_SUCCESS(status))
{
KeStackAttachProcess (EProcess, &ApcState);
if
(MmIsAddressValid(BaseAddress))
{
__try
{
ProbeForWrite ((CONST PVOID)BaseAddress, BufferSize, sizeof(CHAR));
RtlCopyMemory (BaseAddress,writebuffer, BufferSize);
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
KdPrint((
"失败:6\n"
));
status = STATUS_UNSUCCESSFUL;
}
}
else
{
KdPrint((
"失败:7\n"
));
status = STATUS_UNSUCCESSFUL;
}
KeUnstackDetachProcess (&ApcState);
}
ObDereferenceObject(EProcess);
ExFreePool (writebuffer);
KdPrint((
"结束\n"
));
return
status;
}