无法写入导入地址表

时间:2018-10-27 17:39:44

标签: c++ c windows hook paging

我正在学习在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}范围内的一个字节的页面}。

我是否需要任何特殊权限才能更改保护标志?

0 个答案:

没有答案