Старый 02.11.2013, 20:34   #11
<Gh0St>
 
Аватар для <Gh0St>
 
Регистрация: 22.03.2012
Сообщений: 75
Репутация: 19
По умолчанию

Немного отойдя от темы "TLS", возник другой вопрос.
Допустим, нужно вручную просмотреть таблицу импорта.
Как это можно сделать: помещаем указатель на таблицу импорта в PIMAGE_IMPORT_DESCRIPTOR из
IMAGE_DATA_DIRECTORY[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress + ImageBase.
Затем в цикле for( ; impdesc->Characteristics; impdesc++) просматриваем таблицу импорта.

Это справедливо для бинарников в С++, но при работе с фалами Делфи, возникает проблема.
Проблема в том, что Characteristics == 0, хотя указатель устанавливается на верный адрес.
А дело вот, в чём:
- "Современные версии Delphi начиная с 5 используют OMF формат объектников, в то время как все C++ компиляторы генерируют файлы COFF формата".

Подскажите, как просмотреть таблицу импорта?
__________________
- Про опыт говорят: "Мы так свои ошибки называем"
<Gh0St> вне форума   Ответить с цитированием
Старый 03.11.2013, 12:46   #12
JKornev
 
Регистрация: 03.11.2013
Сообщений: 10
Репутация: 0
По умолчанию

Цитата:
Это справедливо для бинарников в С++, но при работе с фалами Делфи, возникает проблема.
Проблема в том, что Characteristics == 0, хотя указатель устанавливается на верный адрес.
Здравствуйте, формат обьектных файлов никаким образом не влияет на PE, цикл просмотра импорта вроде как правильно составлен. У вас есть бинарник пруф?
JKornev вне форума   Ответить с цитированием
Старый 03.11.2013, 13:39   #13
<Gh0St>
 
Аватар для <Gh0St>
 
Регистрация: 22.03.2012
Сообщений: 75
Репутация: 19
По умолчанию

Да, бинарник есть, вот:
http://rghost.ru/49904494
__________________
- Про опыт говорят: "Мы так свои ошибки называем"
<Gh0St> вне форума   Ответить с цитированием
Старый 03.11.2013, 14:39   #14
JKornev
 
Регистрация: 03.11.2013
Сообщений: 10
Репутация: 0
По умолчанию

Согласно специфики PE, импорт заканчивается нулевым дескриптором(полностью). Сорри сам не досмотрел ваш пост.
Как говорится, если хочешь узнать о всех нестандартных подходах в PE, смело залазь под капот бинарников Builder'a
JKornev вне форума   Ответить с цитированием
Старый 03.11.2013, 14:50   #15
<Gh0St>
 
Аватар для <Gh0St>
 
Регистрация: 22.03.2012
Сообщений: 75
Репутация: 19
По умолчанию

Разбираюсь чуть по чуть, был бы рад, если бы подсказали, в чём различия и как правильно просматривать таблицу импорта.
__________________
- Про опыт говорят: "Мы так свои ошибки называем"
<Gh0St> вне форума   Ответить с цитированием
Старый 03.11.2013, 15:12   #16
JKornev
 
Регистрация: 03.11.2013
Сообщений: 10
Репутация: 0
По умолчанию

В завершающем элементе все поля структуры IMAGE_IMPORT_DESCRIPTOR равны нулю, вот вам грааль знаний по формату PE
JKornev вне форума   Ответить с цитированием
Старый 03.11.2013, 16:37   #17
<Gh0St>
 
Аватар для <Gh0St>
 
Регистрация: 22.03.2012
Сообщений: 75
Репутация: 19
По умолчанию

Цитата:
Сообщение от JKornev Посмотреть сообщение
В завершающем элементе все поля структуры IMAGE_IMPORT_DESCRIPTOR равны нулю
да, именно так, спасибо за совет!

в связи с этим, проблема решилась следующим образом, написал функцию:
Код:
bool isEmptyImport(const PIMAGE_IMPORT_DESCRIPTOR impdesc) {
	if(impdesc->Characteristics == 0 && 
		impdesc->FirstThunk == 0 &&
		impdesc->ForwarderChain == 0 &&
		impdesc->Name == 0 &&
		impdesc->OriginalFirstThunk == 0 &&
		impdesc->TimeDateStamp == 0) {

			return true;
	}
	
	return false;
}
и изменил цикл:
Код:
for( ; !isEmptyImport(impdesc); impdesc++)
всё заработало! ещё раз спасибо!
__________________
- Про опыт говорят: "Мы так свои ошибки называем"
<Gh0St> вне форума   Ответить с цитированием
Старый 09.11.2013, 17:58   #18
<Gh0St>
 
Аватар для <Gh0St>
 
Регистрация: 22.03.2012
Сообщений: 75
Репутация: 19
По умолчанию

Возник вопрос по таблице импорта.
Например, импорт находится в .rdata, параметры секции следующие:
Код:
Virtual Size: 0x124
Virtual Address: 0x2000
Raw Size: 0x200
Raw Address: 0xA00
В Data Directories параметры следующие:
Код:
Import Directory RVA: 0x206C
Import Directory Size: 0x28

Import Address Table Directory RVA: 0x2000
Import Address Table Directory Size: 0x1C
1) Подскажите, от куда получаются такие размеры в Data Directories? Похоже, размеры зависят от количества импортируемых библиотек и функций. В тестируемой программе импортируется одна библиотека и 6 функций.

Допустим, понадобилось перенести секцию .rdata и изменить её размер так, что её параметры стали следующими:
Код:
Virtual Size: 0x1000
Virtual Address: 0x8000
Raw Size: 0x200
Raw Address: 0x2E00
Физический размер секции остался прежним, изменилось физическое смещение секции в файле, и виртуальный размер.

В Data Directories произвёл следующие изменения:
Код:
Import Directory RVA: 0x806C
Import Directory Size: 0x28

Import Address Table Directory RVA: 0x8000
Import Address Table Directory Size: 0x1C
Затем поместил существующий импорт в изменённую секцию .rdata, но этого оказалось недостаточно.
Подскажите:
2) Как правильно перенести таблицу импорта?

Секция переместилась, у неё изменились некоторые параметры, но весь импорт был помещён обратно в секцию, однако таблица импорта всё равно не работает.
Подскажите, что ещё нужно сделать? Что я упустил?
Благодарю.
__________________
- Про опыт говорят: "Мы так свои ошибки называем"
<Gh0St> вне форума   Ответить с цитированием
Старый 14.11.2013, 09:51   #19
<Gh0St>
 
Аватар для <Gh0St>
 
Регистрация: 22.03.2012
Сообщений: 75
Репутация: 19
По умолчанию

Проблема с переносом таблицы импорта решена.
Решение оформил в виде статьи https://rdot.org/forum/showthread.php?t=2937
__________________
- Про опыт говорят: "Мы так свои ошибки называем"
<Gh0St> вне форума   Ответить с цитированием
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход



Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. Перевод: zCarot