Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.09.2015, 10:39   #1
kotov-zhenja
Пользователь
 
Регистрация: 03.07.2010
Сообщений: 38
По умолчанию Определить общее количество функций, которые экспортируются в исполняемый файл

В библиотеке WINNT есть поле NumberOfFunctions определяющее общее количество функций, которые экспортируются в исполняемый файл. Как его выцедить???
kotov-zhenja вне форума Ответить с цитированием
Старый 17.09.2015, 10:43   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

читайте PE-заголовок библиотеки.
описание формата найти не сложно.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 17.09.2015, 10:49   #3
kotov-zhenja
Пользователь
 
Регистрация: 03.07.2010
Сообщений: 38
По умолчанию

Цитата:
читайте PE-заголовок библиотеки.
описание формата найти не сложно.
На раскаль не могу найти описание, и есть ли она в WINDOWS??
kotov-zhenja вне форума Ответить с цитированием
Старый 17.09.2015, 10:54   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

спецификация не зависит от языка.
http://download.microsoft.com/downlo...b45/pecoff.doc
Цитата:
и есть ли она в WINDOWS??
причем тут ОС, когда dll/exe это всего лишь файл.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 17.09.2015, 10:55   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

На "Раскаль" и не будет
И Раскаля не будет
Тебе нужно искать в интернете описание РЕ заголовка - там сказано с какого байта это поле в файле начинается.
вот хотя бы тут: https://msdn.microsoft.com/en-us/library/ms809762.aspx
можно и на русском статьи найти про структуру.

А читать из него уже функциями языка, на котором пишешь. Если это паскаль то read\blockread
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.09.2015, 11:07   #6
kotov-zhenja
Пользователь
 
Регистрация: 03.07.2010
Сообщений: 38
По умолчанию

Цитата:
Сегмент экспортируемых данных, .edata



Сегмент .edata содержит экспортируемые данные для приложения или DLL. Когда он присутствует, этот сегмент содержит каталог для манипуляций информацией об экспортируемых данных

WINNT.H

typedef struct _IMAGE_EXPORT_DIRECTORY {
ULONG Characteristics;
ULONG TimeDateStamp;
USHORT MajorVersion;
USHORT MinorVersion;
ULONG Name;
ULONG Base;
ULONG NumberOfFunctions;
ULONG NumberOfNames;
PULONG *AddressOfFunctions;
PULONG *AddressOfNames;
PUSHORT *AddressOfNameOrdinals;
} IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;

Поле Name в этом каталоге идентифицирует имя исполнимого модуля. Поля NumberOfFunctions и NumberOfNames содержат количество функций и имен функций, экспортируемых из модуля

Поле AddressOfFunctions - это смещение на список указателей экспортируемых функций. Поле AddressOfNames указывает на начало списка имен экспортируемых функций, разделенных нулями. AddressOfNameOrdinals - смещение на список 2-х байтовых целых чисел - номеров экспортируемых функций.

Эти три AddressOf... поля - относительные виртуальные адреса в адресном пространстве процесса, в которое был загружен данный файл. После загрузки модуля, относительные виртуальные адреса нужно увеличить на базовый адрес загрузки модуля для получения точных адресов в адресном пространстве загрузившего процесса. Однако, перед загрузкой файла, эти адреса могут быть определены вычитанием из соответствующего поля AddressOf... виртуального адреса заголовка сегмента (VirtualAddress) и добавлением к результату смещения на тело сегмента (PointerToRawData) - полученное значение можно использовать как смещение в файле. Следующий пример иллюстрирует эту технику:

PEFILE.C

int WINAPI GetExportFunctionNames (
LPVOID lpFile,
HANDLE hHeap,
char **pszFunctions)
{
IMAGE_SECTION_HEADER sh;
PIMAGE_EXPORT_DIRECTORY ped;
char *pNames, *pCnt;
int i, nCnt;

/* Получим заголовок секции и указатель на каталог данных
для сегмента .edata */
if ((ped = (PIMAGE_EXPORT_DIRECTORY)ImageDirec toryOffset
(lpFile, IMAGE_DIRECTORY_ENTRY_EXPORT)) == NULL)
return 0;
GetSectionHdrByName (lpFile, &sh, ".edata");

/* Определим смещение на имена экспортируемых функций */
pNames = (char *)(*(int *)((int)ped->AddressOfNames -
(int)sh.VirtualAddress +
(int)sh.PointerToRawData +
(int)lpFile) -
(int)sh.VirtualAddress +
(int)sh.PointerToRawData +
(int)lpFile);

/* Подсчет размера памяти для размещения всех строк. */
pCnt = pNames;
for (i=0; i<(int)ped->NumberOfNames; i++)
while (*pCnt++);
nCnt = (int)(pCnt. pNames);

/* Выделение памяти для имен функций. */
*pszFunctions = HeapAlloc (hHeap, HEAP_ZERO_MEMORY, nCnt);

/* Копируем все строки в выделенный буфер. */
CopyMemory ((LPVOID)*pszFunctions, (LPVOID)pNames, nCnt);

return nCnt;
}

Заметьте, что в этой функции переменной pNames присваивается сначала адрес смещения, а уже затем действительное смещение. Оба они, и адрес смещения, и собственно смещение, являются относительными виртуальными адресами и должны быть странслированы в действительный адрес, как показано в этой функции. Вы могли бы написать подобную функцию для определения целых идентификаторов или адресов функций, но зачем зря напрягаться, если я уже все сделал для Вас ? Функции GetNumberOfExportedFunctions, GetExportFunctionEntryPoints, и GetExportFunctionOrdinals уже есть в библиотеке PEFILE.DLL.
Может примерчик кто нибудь подкинет как работать с заголовками РЕ файлов
kotov-zhenja вне форума Ответить с цитированием
Старый 17.09.2015, 11:27   #7
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,761
По умолчанию

Погуглить не судьба? Вот например статья хорошая http://rsdn.ru/article/baseserv/peloader.xml
FaTaL вне форума Ответить с цитированием
Старый 17.09.2015, 11:47   #8
kotov-zhenja
Пользователь
 
Регистрация: 03.07.2010
Сообщений: 38
По умолчанию

Цитата:
Погуглить не судьба? Вот например статья хорошая http://rsdn.ru/article/baseserv/peloader.xml
Спасибо конечно, но эту статью я уже читал. Количество функций она не выдает

Stilet в заголовке этого нет

http://cs.usu.edu.ru/docs/pe/

Последний раз редактировалось Stilet; 17.09.2015 в 12:41.
kotov-zhenja вне форума Ответить с цитированием
Старый 17.09.2015, 12:44   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
в заголовке этого нет
А это тогда что?:
Безымянный.jpg
Смещение: 14H байт от начала секции экспорта.
Значит нужно найти смещение к секции и к ней прибавить 14H.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.09.2015, 12:46   #10
kotov-zhenja
Пользователь
 
Регистрация: 03.07.2010
Сообщений: 38
По умолчанию

Stilet огромное спасибо, побежал за очками
kotov-zhenja вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дано 10 вещественных чисел. Определить количество элементов, которые меньше последнего ( Паскаль ) студент96 Помощь студентам 9 16.06.2014 17:21
Pascal ABC. Даны три массивы. Определить общее количество элементов массивов, значение которых лежат в интервале (подпрограмма) MarsLoveMoon Паскаль, Turbo Pascal, PascalABC.NET 6 24.04.2014 19:28
определить количество четных чисел и количество нечетных чисел массива, которые вводятся в МЕМО, вывести в поле компонента Edit. Pyxy Помощь студентам 2 21.03.2012 23:24
В строке определить количество слов, которые содержат букву «а» (Delphi) Dark Raven Помощь студентам 2 19.01.2012 16:56
Как определить количество слов, которые содержат ровно три буквы JegorX Паскаль, Turbo Pascal, PascalABC.NET 1 15.11.2011 15:52