【发布时间】: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)&empty_staub - (UINT_PTR)&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之后。
-
不要覆盖代码。改用绕道。那你就不用管原函数占用多少空间了。