我正在学习在C / C ++中挂钩Windows上的函数。
我想从IAT中找到一个导入函数的地址(我已经能够做到,并将我找到的地址称为函数指针),用我自己函数的地址替换导入地址表中的函数地址。 (我自己的函数只打印正在被调用的函数,然后调用原始函数。)
我的问题是,我需要在IAT的存储位置上调用VirtualProtect
(我第一次遇到),以便能够写入地址。而且我很困惑如何赋予VirtualProtect
作为参数。
DWORD first_thunk_data = get_thunk_data_from_IAT(...); // This finds the PIMAGE_THUNK_DATA
// record moved by the position of the function name in the OriginalThunk
bool v = VirtualProtect((LPVOID)first_thunk_data, 1, PAGE_EXECUTE_READWRITE,
malloc_lpflOldProtect);
此代码始终返回false
中的v
,错误代码为998(对内存位置的无效访问)。
正确解析了大数据,并且可以像这样调用原始函数:
DWORD function_address = *((DWORD *)first_thunk_data);
void*(*f_ptr)(int) = (void*(*)(int))function_address;
int * x = (int*) f_ptr(sizeof(int));
VirtualProtect
的正确论点是什么?我相信通过1
是可以的,因为大小是可以的,因为如果我正确地理解了文档,则受影响的保护标志将属于至少在address
-{{1}范围内的一个字节的页面}。
我是否需要任何特殊权限才能更改保护标志?