【问题标题】:How to Change Access Permissions of a Running Task (c)如何更改正在运行的任务的访问权限(c)
【发布时间】:2020-04-19 00:57:02
【问题描述】:

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

我的第一个想法是更改写入权限 - 读取,进行更改,返回仅执行权限。

问题是我需要获取页面的基地址,而不是函数的地址,然后才能调整权限。

这是我尝试执行的代码:

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);
}

由于某种原因,我无法获取基地址(链接器由于某种原因不会编译此代码)。

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

【问题讨论】:

  • 链接器不编译代码。如果您收到链接器错误,请显示该确切错误。在你的问题中。目前还不清楚,为什么要声明 VirtualProtect 函数。
  • DWORD size = (UINT_PTR)&amp;empty_staub - (UINT_PTR)&amp;function_to_hide1 - 即使您在代码中紧跟在function_to_hide1 之后声明empty_staub,也不能保证编译器/链接器会在最终可执行文件中紧跟function_to_hide1 之后放置empty_staub
  • 不要这样做。绕道而行。
  • @RemyLebeau i declere function_to_hide1 and empty_staub with code_seg(".my_seg$1") 所以链接器会将函数1放在outher之后。
  • 不要覆盖代码。改用绕道。那你就不用管原函数占用多少空间了。

标签: c++ windows winapi


【解决方案1】:

要获取函数所在页面的基地址,您可以使用 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);

正如在 cmets 中所讨论的,您应该使用 VirtualAlloc() 来获取一个新的内存空间并在那里解密您的函数,然后绕道跳转到它,而不是在原地进行解密。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-03
    • 1970-01-01
    • 1970-01-01
    • 2019-05-28
    • 1970-01-01
    • 2021-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多