如何更改正在运行的任务的访问权限 (c)

问题描述 投票:0回答:1

我想在运行时改变一个内存段的权限(内存段包含一个函数,我想在运行时改变其代码)。

我首先想到的是把权限改成写--读,进行修改,返回权限只执行。

问题是,我需要得到我的页面的基本地址,而不是我的函数的地址,只有这样我才能调整权限。

这是代码,我试着执行它。

void encrypt_function()
{
    PBYTE start_addr = (PBYTE)&function_to_hide1; // get location of function (can get some time jmp stub instead of actual function - need to find better approach).
    DWORD size = (UINT_PTR)&empty_staub - (UINT_PTR)&function_to_hide1;


    // try to get the base address of my function page - failed  
    _MEMORY_BASIC_INFORMATION lpBuffer;
    VirtualQuery(start_addr, &lpBuffer, size);

    DWORD old_flags = 0;
    if (!VirtualProtect(start_addr, size, PAGE_EXECUTE_READWRITE, &old_flags)) // ERROR_INVALID_ADDRESS - it's not the base address
    {
        printf("went rung %d", GetLastError());
    }// make function page read write execute permission

    // can't be done - i dont have permission
    for (DWORD i = 0; i < size; i++) 
    {
        start_addr[i] ^= 0x55;
    }

    VirtualProtect(start_addr, size, old_flags, NULL);
}

由于某些原因,我无法获得基本地址(链接器由于某些原因无法编译这段代码)。

有谁知道更好的方法(修改权限和执行函数修改)?

c++ windows winapi
1个回答
0
投票

要获得你的函数所在页面的基地址,你可以使用VirtualQuery(),然后你将mbi.BaseAddress传递给VirtualProtect()调用。

MEMORY_BASIC_INFORMATION mbi;

VirtualQuery(start_addr, &mbi, sizeof(mbi));

DWORD oldprotect;
VirtualProtect(mbi.BaseAddress, mbi.RegionSize, PAGE_EXECUTE_READWRITE, &oldprotect);

正如评论中所讨论的那样,你应该使用VirtualAlloc()来获得一个新的内存空间,并在那里解密你的函数,并做一个简单的迂回跳转到它,而不是在原地进行解密。

© www.soinside.com 2019 - 2024. All rights reserved.