首页
社区
课程
招聘
[求助]瑞星监控explorer.exe WriteProcessMemory失败
发表于: 2007-12-25 04:53 13021

[求助]瑞星监控explorer.exe WriteProcessMemory失败

2007-12-25 04:53
13021

用这个函数每次都失败。.后来才发现 是瑞星的问题。
请问怎么才能让我成功的写入explorer.exe呢.

附加 纯属学习


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 7
支持
分享
最新回复 (18)
雪    币: 218
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
关掉瑞星,要不你就重写WriteProcessMemory
2007-12-25 08:00
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
3
瑞星的监控弱的很。恢复SSDT后再调用之
NtProtectVirtualMemory、NtWriteVirtualMemory


NTSTATUS
NtWriteVirtualMemory(
    __in HANDLE ProcessHandle,
    __in_opt PVOID BaseAddress,
    __in_bcount(BufferSize) CONST VOID *Buffer,
    __in SIZE_T BufferSize,
    __out_opt PSIZE_T NumberOfBytesWritten
    )

/*++

Routine Description:

    This function copies the specified address range from the current
    process into the specified address range of the specified process.

Arguments:

     ProcessHandle - Supplies an open handle to a process object.

     BaseAddress - Supplies the base address to be written to in the
                   specified process.

     Buffer - Supplies the address of a buffer which contains the
              contents to be written into the specified process
              address space.

     BufferSize - Supplies the requested number of bytes to write
                  into the specified process.

     NumberOfBytesWritten - Receives the actual number of bytes
                            transferred into the specified address space.

Return Value:

    NTSTATUS.

--*/

{
    SIZE_T BytesCopied;
    KPROCESSOR_MODE PreviousMode;
    PEPROCESS Process;
    NTSTATUS Status;
    PETHREAD CurrentThread;

    PAGED_CODE();

    //
    // Get the previous mode and probe output argument if necessary.
    //

    CurrentThread = PsGetCurrentThread ();
    PreviousMode = KeGetPreviousModeByThread(&CurrentThread->Tcb);
    if (PreviousMode != KernelMode) {

        if (((PCHAR)BaseAddress + BufferSize < (PCHAR)BaseAddress) ||
            ((PCHAR)Buffer + BufferSize < (PCHAR)Buffer) ||
            ((PVOID)((PCHAR)BaseAddress + BufferSize) > MM_HIGHEST_USER_ADDRESS) ||
            ((PVOID)((PCHAR)Buffer + BufferSize) > MM_HIGHEST_USER_ADDRESS)) {

            return STATUS_ACCESS_VIOLATION;
        }

        if (ARGUMENT_PRESENT(NumberOfBytesWritten)) {
            try {
                ProbeForWriteUlong_ptr(NumberOfBytesWritten);

            } except(EXCEPTION_EXECUTE_HANDLER) {
                return GetExceptionCode();
            }
        }
    }

    //
    // If the buffer size is not zero, then attempt to write data from the
    // current process address space into the target process address space.
    //

    BytesCopied = 0;
    Status = STATUS_SUCCESS;
    if (BufferSize != 0) {

        //
        // Reference the target process.
        //

        Status = ObReferenceObjectByHandle(ProcessHandle,
                                           PROCESS_VM_WRITE,
                                           PsProcessType,
                                           PreviousMode,
                                           (PVOID *)&Process,
                                           NULL);

        //
        // If the process was successfully referenced, then attempt to
        // write the specified memory either by direct mapping or copying
        // through nonpaged pool.
        //

        if (Status == STATUS_SUCCESS) {

            Status = MmCopyVirtualMemory (PsGetCurrentProcessByThread(CurrentThread),
                                          Buffer,
                                          Process,
                                          BaseAddress,
                                          BufferSize,
                                          PreviousMode,
                                          &BytesCopied);

            //
            // Dereference the target process.
            //

            ObDereferenceObject(Process);
        }
    }

    //
    // If requested, return the number of bytes read.
    //

    if (ARGUMENT_PRESENT(NumberOfBytesWritten)) {
        try {
            *NumberOfBytesWritten = BytesCopied;

        } except(EXCEPTION_EXECUTE_HANDLER) {
            NOTHING;
        }
    }

    return Status;
}

2007-12-25 08:43
0
雪    币: 211
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
楼上正解!我实现过!
2007-12-25 09:16
0
雪    币: 18
活跃值: (2079)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
谢谢...感谢10分
2007-12-25 18:10
0
雪    币: 18
活跃值: (2079)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
大哥 麻烦问下 你这两个函数那里找的?为什么帮助文档上没有。
是没公开的函数吗?
2007-12-25 18:36
0
雪    币: 1505
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
7
不是没公开,是没有文档化的吧
2007-12-25 19:59
0
雪    币: 18
活跃值: (2079)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
可否把把函数的用法写上去 你只写了一个。.晕  在MSDN  和DDK文档上都没找到这两个函数的说明/
2007-12-25 22:46
0
雪    币: 239
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
正发愁呢,偶说怎么回事,OpenProcess成功返回,VirtualAllocEx也返回成功,到了WriteProcessMemory就返回0了。原来是瑞星搞的鬼。
如不是发现这贴子,偶还以为是xp sp3的事呢。
2008-2-26 15:27
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
被人玩烂了的SSDT
2008-2-26 17:08
0
雪    币: 163
活跃值: (60)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
11
WRK,微软提供的内核源代码
2008-2-26 17:16
0
雪    币: 13097
活跃值: (4097)
能力值: ( LV15,RANK:1673 )
在线值:
发帖
回帖
粉丝
12
瑞星现在是比较烦,想手动关了它也不行,以前的版本可以用手动关了,在需要时再开.
不过恢复SSDT之后是可以结束其进程的,但不太方便
2008-2-27 14:12
0
雪    币: 266
活跃值: (52)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
13
标记一下,回过头来再学习
2008-2-28 12:27
0
雪    币: 275
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
标记一下回过头来再学习
2008-3-9 20:36
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
标注一下了,也学习学习
2008-3-10 18:39
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
不太懂。呵呵。学习
2008-3-11 10:43
0
雪    币: 199
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
恢复SSDT要写内存,写内存瑞星就会阻止.
恢复SSDT要加载驱动,加载驱动瑞星就会阻止.
2008-3-11 10:44
0
雪    币: 202
活跃值: (151)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
谢谢,学习了。
2008-3-16 19:57
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
学一下byshell就OK了
2008-3-16 21:24
0
游客
登录 | 注册 方可回帖
返回
//