Не могу записать в таблицу адресов импорта
Я учусь подключать функции на Windows в C/C++.
Я хочу найти адрес импортированной функции из IAT (я уже могу это сделать и вызвать адрес, который я нахожу как указатель на функцию), заменить адрес функции в таблице адресов импорта на адрес моей собственной функции. (Моя собственная функция только печатает, что она вызывается, и вызывает исходную функцию).
Моя проблема в том, что мне нужно позвонить VirtualProtect
(мое первое знакомство с ним) в ячейке памяти IAT, чтобы можно было написать адрес. И я совсем запутался, что подарить 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 (неверный доступ к ячейке памяти).
Данные Thunk анализируются правильно, а исходная функция вызывается так:
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
- address+size
,
Нужны ли какие-либо специальные разрешения для изменения флагов защиты?