首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取最近的空闲内存VirtualAllocEx

获取最近的空闲内存VirtualAllocEx
EN

Stack Overflow用户
提问于 2014-07-22 22:42:17
回答 1查看 180关注 0票数 1

我希望获得最近的空闲内存地址来为CodeCave分配内存,但我希望它在jmp指令限制0xffffffff-80000000内,我正在尝试以下代码,但没有太多幸运。

代码语言:javascript
复制
    DWORD64 MemAddr = 0;
DWORD64 Address = 0x0000000140548AE6 & 0xFFFFFFFFFFFFF000;
HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, NULL, ProcessID);
if (hProc){
    for (DWORD offset = 0; (Address + 0x000000007FFFEFFF)>((Address - 0x000000007FFFEFFF) + offset); offset += 100)
        {
MemAddr = (DWORD64)VirtualAllocEx(hProc, (DWORD64*)((Address - 0x000000007FFFEFFF) + offset),MemorySize, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
         if ((DWORD64)MemAddr){
        break;
         }
    }

    CloseHandle(hProc);
    return (DWORD64)MemAddr;

}返回0;

目标进程为64位。

EN

回答 1

Stack Overflow用户

发布于 2020-03-30 06:47:53

如果目标进程是x64,那么也要确保您正在为x64编译。

我将此代码用于相同的目的,即在4 4GB地址范围内查找空闲内存,以便为x64钩子执行x64 jmps。

代码语言:javascript
复制
char* AllocNearbyMemory(HANDLE hProc, char* nearThisAddr)
{
    char* begin = nearThisAddr;
    char* end = nearThisAddr + 0x7FFF0000;
    MEMORY_BASIC_INFORMATION mbi{};

    auto curr = begin;

    while (VirtualQueryEx(hProc, curr, &mbi, sizeof(mbi)))
    {
        if (mbi.State == MEM_FREE)
        {
            char* addr = (char*)VirtualAllocEx(hProc, mbi.BaseAddress, 0x1000, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
            if (addr) return addr;
        }
        curr += mbi.RegionSize;
    }

    return 0;
}

请记住,这里没有错误检查,只有一个简单的PoC

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24890451

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档