Не могу записать в таблицу адресов импорта

Я учусь подключать функции на 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,

Нужны ли какие-либо специальные разрешения для изменения флагов защиты?

0 ответов

Другие вопросы по тегам