Сейчас на форуме: jinoweb, bartolomeo, rmn (+5 невидимых) |
eXeL@B —› Программирование —› Заполнение таблицы импорта образа, загруженного по нестандартному адресу |
Посл.ответ | Сообщение |
|
Создано: 19 июля 2017 12:49 · Поправил: Aoizora · Личное сообщение · #1 Я пишу функцию обработки импорта. Здесь нет некоторых нужных проверок: например, импорта по ординалу. Наверняка нет еще некоторых нужных вещей. Но моя цель сейчас - сделать минимальный работающий код, который заполнит таблицу импорта. Важная информация: образ загружается по произвольному адресу, то есть память для него выделяется VirtualAlloc'ом, затем в этой памяти проставляются атрибуты секций, заполняется импорт и т.д. Кодес такой: Code:
Code:
Названия библиотек и функций выводятся на консоль, но выполнение строчки Code:
не приводит к ожидаемому результату. В отладчике видно, что call'ы обращаются по адресам [402XXX]. Проблема в том, что релоки надо было обработать до заполнения импорта? Есть ли замечания по логике функции ResolveImport? |
|
Создано: 20 июля 2017 21:15 · Личное сообщение · #2 |
|
Создано: 20 июля 2017 22:10 · Поправил: VOLKOFF · Личное сообщение · #3 |
|
Создано: 21 июля 2017 05:07 · Личное сообщение · #4 |
|
Создано: 21 июля 2017 11:42 · Личное сообщение · #5 |
|
Создано: 21 июля 2017 12:03 · Личное сообщение · #6 Aoizora пишет: Можно ли как-то исхитриться и переместить файл без релоков? это надо понимать: "переместить загружаемый образ, не обрабатывая релоков?" Блин, а прочитать-то и понять-то элементарные вещи, что релоки как раз и предназначены для корректировки адресов в загружаемом файле при его перемещении? Абсолютное непонимание механизмов работы! VOLKOFF ясно прописал, что нужно делать, дальше дали ссылки, что изучать. Прочитать-то и разобраться сложно?.. |
|
Создано: 21 июля 2017 14:13 · Личное сообщение · #7 |
|
Создано: 21 июля 2017 15:30 · Поправил: Aoizora · Личное сообщение · #8 >Блин, а прочитать-то и понять-то элементарные вещи, что релоки как раз и предназначены для корректировки адресов в загружаемом файле при его перемещении? А если загрузить имидж два раза по разным адресам и найти различия в значениях двордов? PS. Релоки обработал, вроде. Код проходит по всем фиксапам и попадает в самый центр поломанных инструкций! Но с импортом какая-то проблема: адреса функций записываются куда-то не туда. У меня сомнения насчет типа указателей на адрес для исправления. Code:
DWORD* или DWORD_PTR* использовать? Последний, как я понимаю, это memsize тип и может содержать в себе дворд, но не наоборот. Однако в WinNT.h они определены одинаково. |
|
Создано: 21 июля 2017 17:32 · Личное сообщение · #9 Если это весь код обработки релоков, то это полная херня. Релоки могут быть разных типов, и даже попадаться такие, которые не надо обрабатывать. Вот что ли посмотри чьи то сорсы, там вроде доступно http://hackedme.narod.ru/Articles/Articles11.html А вообще такое под дебагером отлаживают, а не тычут пальцем в небо. ----- Yann Tiersen best and do not fuck | Сообщение посчитали полезным: sendersu |
|
Создано: 21 июля 2017 17:33 · Личное сообщение · #10 Не получается вкурить теорию, написано запутанно. Code:
До этого у Iczelion'а я читал, что массивы LookupTable и IAT дублируют друг друга, в них записаны одни и те же адреса имен функций. При этом LookupTable необязательная таблица, и имена можно доставать из IAT. Здесь же (на нашей вики) написано, что просматривать импорт обязательно надо по LookupTable. Я получаю адрес функции из DLL при помощи GetProcessAddress или используя свою функцию для разбора таблицы экспорта. Как мне записать этот адрес в IAT? Я получаю указатель PIMAGE_THUNK_DATA на FirstThunk (не original) и записываю адрес функции в PIMAGE_THUNK_DATA::u1.Function? |
|
Создано: 21 июля 2017 18:17 · Личное сообщение · #11 Хз даже что тебе ответить. Я уже даже сорсы привел, там можно было посмотреть: // если есть IAT то сохраним в неё найденный адрес if (ImportTable->AddresTableRVA) { *(ULONG*)(ImportTable->AddresTableRVA + filebase + IAT_Index) = addr; } else // иначе сохраним туда откуда брали { *(ULONG*)RVA = addr; } Ну да ладно, я вообще мимо проходил, развлекайтесь... ----- Yann Tiersen best and do not fuck | Сообщение посчитали полезным: Rio |
|
Создано: 21 июля 2017 20:04 · Личное сообщение · #12 |
|
Создано: 22 июля 2017 16:43 · Личное сообщение · #13 |
|
Создано: 23 июля 2017 12:14 · Личное сообщение · #14 Еще такой вопрос. Допустим, PE-файл не содержит секции релоков, тогда его надо загрузить по ожидаемому адресу загрузки в OptionalHeader.ImageBase, пусть это будет 400000. Но PE-загрузчик тоже загружен по адресу 400000. Что делать в таком случае? Как в загрузчике gr8'та анпамить память по адресу 400000 и загружать туда образ? Как тогда загрузчик сможет продолжить свою работу после анмапинга его памяти? |
|
Создано: 24 июля 2017 10:12 · Личное сообщение · #15 Aoizora пишет: Допустим, PE-файл не содержит секции релоков, тогда его надо загрузить по ожидаемому адресу загрузки 2 варианта: 1. Релоки в этом файле не нужны, он может быть загружен по любому адресу. 2. Всё настроено на абсолютные адреса. В этом случае лучше считайте, что работаете с "кривым" ехе-шником, который "иногда" работает правильно. Вряд ли потенции хватит сделать его перемещаемым, забейте, это выше Ваших возможностей!!! |
|
Создано: 24 июля 2017 11:19 · Поправил: cppasm · Личное сообщение · #16 Его и не надо никуда перемещать. Перемещать надо загрузчик чтобы освободить необходимый регион начиная с ImageBase. Как - это уже второй вопрос. Либо собрать загрузчик с релоками и их обрабатывать, либо сделать его позиционно независимым (что как по мне проще). Ничего кривого в exe без релоков нету - они там особо не нужны в принципе, разве что для ASLR. Aoizora пишет: Как тогда загрузчик сможет продолжить свою работу после анмапинга его памяти? Никак. Его предварительно надо скопировать в другую область памяти и передать туда управление. А потом уже анмапить память и т.д. | Сообщение посчитали полезным: Rio |
|
Создано: 24 июля 2017 11:32 · Личное сообщение · #17 Попробую разобраться в статье про реконструкцию релоков: http://www.cs.columbia.edu/~vpappas/papers/reloc.raid14.pdf >Его предварительно надо скопировать в другую область памяти и передать туда управление. А потом уже анмапить память и т.д. Тогда придется сделать его в виде шеллкода. Это не так сложно, я думаю. Напишу позиционно-независимый код, упакую в отдельную секцию и сдамплю эту секцию. |
eXeL@B —› Программирование —› Заполнение таблицы импорта образа, загруженного по нестандартному адресу |