zeroaceee Ответов: 1

Хотелось бы кое-что понять о 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 дня и до сих пор не понимаю, как это должно работать.

Что я уже пробовал:

я сделал то, что написал в своем вопросительном абзаце, но мне хотелось бы понять его больше.

1 Ответов

Рейтинг:
1

KarstenK

Вы поняли, что союзы разделяют одну и ту же память, но вам также нужно понять, что каждый член только интерпретирует та же память как свою собственную ценность. Это изобретение старожилов для сохранения памяти.

Так что у вас есть все значения читайте с первого взгляда. Используйте отладчик или распечатайте значения, чтобы увидеть его.


zeroaceee

@KarstenK но как, когда я печатаю там значения, я получаю одно и то же значение для всех из них, а также пытаюсь привести их к тем типам, которые ничего не меняют и указывают на недопустимую память, можете ли вы показать мне пример чтения памяти из внешнего процесса и печати там значений?