Хотелось бы кое-что понять о PE-формате IAT
в принципе, я понимаю, что такое союзы, они разделяют одну и ту же память, и что бы ни случилось с 1 членом, это влияет на другие и наоборот.... теперь я пытаюсь понять эту часть кода :
struct _IMAGE_THUNK_DATA64 { union { ULONGLONG ForwarderString; // PBYTE ULONGLONG Function; // PDWORD ULONGLONG Ordinal; ULONGLONG AddressOfData; // PIMAGE_IMPORT_BY_NAME } u1; } IMAGE_THUNK_DATA64; typedef IMAGE_THUNK_DATA64 * PIMAGE_THUNK_DATA64;
я пытаюсь прочитать/разобрать таблицу адресов импорта процессов, и теперь то, что я делаю, в основном таково
:
if (!memory::Read(process_base_address + import_desc.FirstThunk,&first_thunk,sizeof(first_thunk))) return 0;
я читаю данные из firstThunk и храню их внутри моего IMAGE_THUNK_DATA который имеет размер 8 байт так как он использует объединение теперь реальный вопрос заключается в следующем
- когда я выполняю эту операцию чтения памяти, какую именно переменную я читаю, является ли она последней, которая была записана в предположение из моего целевого процесса?
- как бы я прочитал, например, порядковый номер из этого союза, содержащего то же самое значение, что и функция, которая неверна
- наконец-то я нашел несколько человек, делающих это
auto function_address = process_base_address + import_desc.FirstThunk + func_index * sizeof(std::uintptr_t);где индекс функции равен 0,1,2 и т. д. и делая это без чтения этой строки из памяти, я получаю доступ к массиву указателей функций, который, как я предполагаю, находится в разделе [.rdata], и если я пытаюсь прочитать его из памяти с помощью ReadprocessMemory, я получаю адрес фактической функции внутри раздела [.text] и, умножив его на 8 байт, я иду к следующему указателю функции в памяти.
я надеюсь, что кто-то может прояснить это, так как я пытаюсь понять это уже 3 дня и до сих пор не понимаю, как это должно работать.
Что я уже пробовал:
я сделал то, что написал в своем вопросительном абзаце, но мне хотелось бы понять его больше.