首页
社区
课程
招聘
[求助]问题。一个MyNtReadVirtualMemory的实现
发表于: 2010-4-14 18:06 5494

[求助]问题。一个MyNtReadVirtualMemory的实现

2010-4-14 18:06
5494
由于某些需求,需要自己实现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;
} 

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
你肯定不是ssdt钩子咯。[edi + eax*4],edi 可能会指向Shadow 186号.
所以绘图的失败了。就黑啦!
2010-4-14 18:10
0
雪    币: 246
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
好nb的代码,抄wrk的? 还是直接切换进程空间比较舒服。 详情请+QQ293596479 请说明是来干什么的。。。
“由于某些需求”(下次这么明显的目的直接说就好了。你不说那些人也知道你要干啥)
2010-4-14 20:00
0
雪    币: 53
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
[QUOTE=sunlary;790965]你肯定不是ssdt钩子咯。[edi + eax*4],edi 可能会指向Shadow 186号.
所以绘图的失败了。就黑啦![/QUOTE]

哥,您果然犀利~
多谢多谢~~
2010-4-15 00:22
0
雪    币: 53
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
加了..多谢赐教
2010-4-15 00:23
0
游客
登录 | 注册 方可回帖
返回
//