-
-
[求助]问题。一个MyNtReadVirtualMemory的实现
-
发表于:
2010-4-14 18:06
5493
-
[求助]问题。一个MyNtReadVirtualMemory的实现
由于某些需求,需要自己实现NtReadVirtualMemory。。
我上网搜了下。。
大部分的MyNtReadVirtualMemory都是基于过INLINEHOOK的
比如截取前7个字节
push 1ch
push xxxxxh
jmp OrgNtReadVirtualMemory
这个我试过了。。。但是在我的机器上显示不正常。。。会有一些窗口是黑色的。。
于是。。我找有没有完整实现的NtReadVirtualMemory
我找到了下面这个。。
但是。。MiValidateUserTransfer这个函数我查了WDK NT4 REACTOS的代码都么有这个函数啊。。。
有熟悉的朋友能指点一下么?
==================================
NTSTATUS
NtReadVirtualMemory (
IN HANDLE ProcessHandle,
IN PVOID BaseAddress,
OUT PVOID Buffer,
IN ULONG BufferSize,
OUT PULONG NumberOfBytesRead OPTIONAL
)
{
ULONG BytesCopied;
KPROCESSOR_MODE PreviousMode;
PEPROCESS Process;
NTSTATUS Status;
PAGED_CODE();
PreviousMode = KeGetPreviousMode();
if (PreviousMode != KernelMode) {
Status = [COLOR="Red"]MiValidateUserTransfer[/COLOR](BaseAddress, Buffer, BufferSize);
if (Status != STATUS_SUCCESS) {
return Status;
}
if (ARGUMENT_PRESENT(NumberOfBytesRead)) {
try {
ProbeForWriteUlong(NumberOfBytesRead);
} except(EXCEPTION_EXECUTE_HANDLER) {
return GetExceptionCode();
}
}
}
BytesCopied = 0;
Status = STATUS_SUCCESS;
if (BufferSize != 0) {
Status = ObReferenceObjectByHandle(ProcessHandle,
PROCESS_VM_READ,
PsProcessType,
PreviousMode,
(PVOID *)&Process,
NULL);
if (Status == STATUS_SUCCESS) {
Status = MmCopyVirtualMemory (Process,
BaseAddress,
PsGetCurrentProcess(),
Buffer,
BufferSize,
PreviousMode,
&BytesCopied);
ObDereferenceObject(Process);
}
}
if (ARGUMENT_PRESENT(NumberOfBytesRead)) {
try {
*NumberOfBytesRead = BytesCopied;
} except(EXCEPTION_EXECUTE_HANDLER) {
NOTHING;
}
}
return Status;
}
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)