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

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

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

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

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

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

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

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

解决方案:

要获得你的函数所在页面的基地址,你可以使用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()来获得一个新的内存空间,并在那里解密你的函数,并做一个简单的迂回跳转到它,而不是在原地进行解密。

给TA打赏
共{{data.count}}人
人已打赏
未分类

在VB.NET中根据子类型的数量对List对象进行排序。

2022-9-7 22:33:22

未分类

如何将字符串VCard转换为vcf文件?

2022-9-7 22:33:24

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索