我想在运行时改变一个内存段的权限(内存段包含一个函数,我想在运行时改变其代码)。
我首先想到的是把权限改成写--读,进行修改,返回权限只执行。
问题是,我需要得到我的页面的基本地址,而不是我的函数的地址,只有这样我才能调整权限。
这是代码,我试着执行它。
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()来获得一个新的内存空间,并在那里解密你的函数,并做一个简单的迂回跳转到它,而不是在原地进行解密。