本论坛为只读模式,仅供查阅,不能注册新用户,不能发帖/回帖,有问题可发邮件 xikug.xp (^) gmail.com
查看: 9850|回复: 13

关于ZwAllocateVirtualMemory [复制链接]

Rank: 1

发表于 2008-4-2 20:23:36 |显示全部楼层
为什么在ImageLoadNotify中调用ZwAllocateVirtualMemory,系统就会死掉?

Rank: 2

发表于 2008-4-2 21:39:10 |显示全部楼层
说详细点。。或者放段代码
说明蓝在哪里
或者用临时空间保存dmp文件。。。

Rank: 1

发表于 2008-4-2 22:00:28 |显示全部楼层
多谢zhuwg的回复.代码来了:

NTSTATUS HookExportsOfImage(IN PIMAGE_DOS_HEADER image_addr, IN ULONG ulProcessID,
                            IN PCHAR pFuncName)
{
    PIMAGE_DOS_HEADER        dosHeader;
    PIMAGE_NT_HEADERS        pNtHeader;
    PIMAGE_DATA_DIRECTORY   pDirectory = NULL;
    PIMAGE_EXPORT_DIRECTORY pExports = NULL;
    ULONG  nSize, Address, i;
    PULONG pFunctions = NULL;
    PSHORT pOrdinals = NULL;
    PULONG pNames = NULL;
    PVOID  pFunction = NULL;
    ULONG  Ordinal = 0;

    dosHeader = (PIMAGE_DOS_HEADER)image_addr;

    // Make pointers to 32 and 64 bit versions of the header.
    pNtHeader = MakePtr( PIMAGE_NT_HEADERS, dosHeader,
        dosHeader->e_lfanew );

    // First, verify that the e_lfanew field gave us a reasonable
    // pointer, then verify the PE signature.
    if (pNtHeader->Signature != IMAGE_NT_SIGNATURE)
        return STATUS_INVALID_IMAGE_FORMAT;

    pDirectory = pNtHeader->OptionalHeader.DataDirectory + IMAGE_DIRECTORY_ENTRY_EXPORT;

    if (!pDirectory)
        return 0;

    nSize = pDirectory->Size;
    Address = pDirectory->VirtualAddress;

    pExports = (PIMAGE_EXPORT_DIRECTORY)((PCHAR)image_addr + Address);

    pFunctions = (PULONG)((PCHAR)image_addr + pExports->AddressOfFunctions);
    pOrdinals  = (PSHORT)((PCHAR)image_addr + pExports->AddressOfNameOrdinals);
    pNames      = (PULONG)((PCHAR)image_addr + pExports->AddressOfNames);

    for (i = 0; i < pExports->NumberOfNames; i++)
    {
        Ordinal = pOrdinals;
        if (pFunctions[Ordinal] < Address || pFunctions[Ordinal] >= Address + nSize)
        {
            if (strcmp((PSTR)((PCHAR)image_addr + pNames), pFuncName)
                == 0)
            {
                ULONG   ulFuncRva;
                PMDL    MdlForRva;
                PVOID   BuffRva;
                ULONG   ulActualFuncVa;
                ULONG   ShellCodeSize, ulzeroBits;
                PVOID   ShellCodeVa = NULL;
                NTSTATUS  status;
                HANDLE    hProcess;
                CLIENT_ID cid;
                OBJECT_ATTRIBUTES oa;

                pFunction = (PCHAR)image_addr + pFunctions[Ordinal];
                ulFuncRva = (ULONG)&pFunctions[Ordinal];
               
                ShellCodeSize = NEW_CODE_LEN;
                ulzeroBits = 0;
                    
                cid.UniqueProcess = (HANDLE)ulProcessID;
                cid.UniqueThread = 0;

                InitializeObjectAttributes(&oa, NULL, OBJ_KERNEL_HANDLE,
                    NULL, NULL);

                __asm int 3
                status = ZwOpenProcess(&hProcess, PROCESS_DUP_HANDLE, &oa, &cid);
                if (!NT_SUCCESS(status))
                {
                    DbgPrint("gmon: NtOpenProcess failed\\r\\n");
                    return STATUS_SUCCESS;
                }

                // 执行ZwAllocateVirtualMemory系统好象是死锁了,没有反应了。
                status = ZwAllocateVirtualMemory(hProcess, &ShellCodeVa,
                            0, &ShellCodeSize,  MEM_RESERVE,  PAGE_READWRITE
                            );
                if (!NT_SUCCESS(status))
                {
                    DbgPrint("gmon: NtAllocateVirtualMemory failed\\r\\n");
                    return STATUS_SUCCESS;
                }

                DbgPrint("ShellCodeVa = 0x%08x\\r\\n", ShellCodeVa);
                DbgPrint("pFunctions[Ordinal] = 0x%08x\\r\\n", pFunctions[Ordinal]);
                MdlForRva = MmCreateMdl(NULL, (PVOID)ulFuncRva, 4);
                if (!MdlForRva)
                {
                    return STATUS_SUCCESS;
                }

                MmBuildMdlForNonPagedPool(MdlForRva);
                MdlForRva->MdlFlags = MdlForRva->MdlFlags | MDL_MAPPED_TO_SYSTEM_VA;
                BuffRva = MmMapLockedPages(MdlForRva, KernelMode);

                ulActualFuncVa = (ULONG)(*(PULONG)BuffRva) + (ULONG)image_addr;

                // 修改eat, 使指定的函数跳到ShellCodeVa地方来
                (ULONG)(*(PULONG)BuffRva) = (ULONG)((ULONG)ShellCodeVa - (ULONG)image_addr);
                DbgPrint("patch eat successed, original addr= 0x%08x, fstr = %s,"
                    " imagebase = 0x%08x\\r\\n",
                    ulActualFuncVa,
                    pFuncName,
                    (ULONG)image_addr
                    );

                MmUnmapLockedPages(BuffRva, MdlForRva);
                IoFreeMdl(MdlForRva);
                break;
            }
        }
    }

    return STATUS_SUCCESS;
}
// 这个函数是在ImagLoadNotify中调用的,目的是patch Kernel32!LoadLibraryW

Rank: 2

发表于 2008-4-2 23:47:25 |显示全部楼层
status = ZwAllocateVirtualMemory(hProcess, &ShellCodeVa,
                            0, &ShellCodeSize,  MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE );

Rank: 1

发表于 2008-4-2 23:58:26 |显示全部楼层
回楼上的,改了标志位好象也不行啊,不知道为什么执行到这个函数就会死锁?

Rank: 1

发表于 2008-4-3 14:05:51 |显示全部楼层
把这个
status = ZwOpenProcess(&hProcess, PROCESS_DUP_HANDLE, &oa, &cid);
改成
status = ZwOpenProcess(&hProcess, PROCESS_ALL_ACCESS, &oa, &cid);
试试

Rank: 1

发表于 2008-4-3 17:47:47 |显示全部楼层
回刀客:
改打开进程标志也不行呢,难道在这个ImageLoadNotify回调中 不能在进程中申请虚拟内存?

Rank: 5Rank: 5

发表于 2008-4-3 17:52:46 |显示全部楼层
你可以看看当时的进程环境~~
eprocess中的东西~

Rank: 1

发表于 2008-4-4 20:21:52 |显示全部楼层
for (i = 0; i < pExports->NumberOfNames; i++)
    {
        Ordinal = pOrdinals;//  这里该是Ordinal = *pOrdinals++;吧**********
        if (pFunctions[Ordinal] < Address || pFunctions[Ordinal] >= Address + nSize)
        {
            if (strcmp((PSTR)((PCHAR)image_addr + pNames), pFuncName)
                == 0)//  pNames[Ordinal]****************

Rank: 1

发表于 2008-4-4 22:40:52 |显示全部楼层
// 晕,我复制的时候是对的啊,怎么提交后就变了? 本来应该是你说的那样.多谢楼上compilerit  ..
// 我不知道这个怎么编辑的,反正一提交就变了
for (i = 0; i < pExports->NumberOfNames; i++)
{
        Ordinal = pOrdinals;
        if (pFunctions[Ordinal] < Address || pFunctions[Ordinal] >= Address + nSize)
        {
            if (strcmp((PSTR)((PCHAR)image_addr + pNames), pFuncName)
                == 0)
            {

Rank: 9Rank: 9Rank: 9

发表于 2008-4-5 13:46:54 |显示全部楼层
代码的话用[code][/code]包起来
悟空,退下,为师一个人就够了

Rank: 1

发表于 2008-10-1 12:55:46 |显示全部楼层
引用第0楼hheno于2008-04-02 17:23发表的 关于ZwAllocateVirtualMemory :
为什么在ImageLoadNotify中调用ZwAllocateVirtualMemory,系统就会死掉?


????你呃??铨有解?? ? .....我也遇到相同的??铨了  .....

Rank: 1

发表于 2009-10-13 18:41:56 |显示全部楼层
囧,,我也遇到一样问题

Rank: 1

发表于 2010-4-12 17:13:56 |显示全部楼层
我在win7下,LoadImage里调用ZwAllocateVirtualMemory(myhandle, &BaseAddress, 0, &Size, MEM_COMMIT, PAGE_READWRITE);也会死锁,哪位老大帮看下
您需要登录后才可以回帖 登录 | 立即加入

Archiver|手机版|第8个男人 - 论坛为只读模式,仅供查阅

GMT+8, 2019-6-19 05:48 , Processed in 0.033545 second(s), 8 queries .

Design by pvo.cn

© 2011 Pvo Inc.

回顶部