Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,552
#1

Список параметров функции из DLL - C++

01.02.2016, 04:10. Просмотров 510. Ответов 4
Метки нет (Все метки)

В runtime загружаю DLL'ки, вывожу список функций содержащийся в них, но так и не нашёл вариантов как экспортировать типы аргументов и возвратного значения.. Пару статей указали на то, что если создатели библиотеки использовали стандарт (name mangeling?), то можно экпортировать, но если нет - то фиг вам)
Так вот если нельзя, то можно может хотя бы размер бит-аргументов узнать? (т.е. общий размер, например в какой то функции под названием GetParent, допустим 4 аргумента, все они int_32, т.е. 4х4байт=32, а return там bool - 1 байт, т.е. в сумме 33 байта. (вот это число 33 байта можно ли как нибудь вытащить?)

Вообще конешно в идеале хотелось бы вытащить полностью инфу (конкретные типы), может есть пример как это делается если dll'ка помечена создателем Microsoft? (т.е. предполагаю что у них то всё по стандарту)

И ещё один под вопрос, где взять документацию по всей библиотеке (например user32.dll), т.е. все функции, все параметры, возможно описания, ещё какие то плюшки.. Руками перебирать сайт MSDN не хочется, может есть что то уже скомпанованное?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.02.2016, 04:10
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Список параметров функции из DLL (C++):

Вызвать функцию из dll с неопределённым числом параметров - C++
Нужно вызвать из dll функцию с неопределённым числом параметров. пока что работаю с таким вызовом char res; char (*dll) (char* ...);...

функции с переменным количеством параметров - C++
для некоторого класса необходимо чтобы его конструктор принимал переменное количество параметров. как это делается - понятно. я...

Функции с переменным числом параметров - C++
Помогите пожалуйста исправить ошибку в программе!!! Проблема в том, что не учитывается степень разряда при переводе в восьмеричную...

Список функций из стандартных dll библиотек (lib.exe MVS) - C++
В общем нужен список функций (желательно и хедеров, в которых они находятся) исходя из имени стандартной библиотеки dll. Наткнулся в...

Кто может поделиться файлами ogg.dll, vorbis.dll и vorbisfile.dll - 32-х и 64-битными версиями? - C++
Движок перевожу на платформу Win64 и нужно, чтобы разрядность ЕХЕ и DLL совпадали, а в интернете искал 64-битные версии ogg.dll, vorbis.dll...

Вызов функции из dll - C++
Доброго времени суток! Пытаюсь вызвать функцию, которая находится в библиотеке следующим способом: HINSTANCE dllhandle =...

4
kolobok0
46 / 46 / 8
Регистрация: 24.01.2010
Сообщений: 225
04.02.2016, 15:51 #2
В наш век инета - быстрее через него.
Но если инфы совсем ёк - то глазками, больше никак.
Т.е. либо аида наша всё(декомпиляция), либо тупо вызываете функцию(благо имя самой функции найти можно и соглашение по очистке стэка) ну а далее смотреть, что юзается с приходящего стэка и ресгистров в самой функции. Дело долгое, муторное и требует внимательности.

(круглый)
0
nikolay1982
117 / 117 / 43
Регистрация: 22.01.2014
Сообщений: 375
02.04.2016, 15:56 #3
Цитата Сообщение от Izual Посмотреть сообщение
допустим 4 аргумента, все они int_32, т.е. 4х4байт=32, а return там bool - 1 байт, т.е. в сумме 33 байта
Это значит, в стэк передается четыре аргумента int32_t , а результат в регистре EAX (тип вызова stdcall,cdecl).
Для незадокументированных dll можно диассемблировать и посмотреть аргумент return. По этому значению можно угадать сколько у функции аргументов в DWORD. Но это грубое упрощение, в расчете на то, что в функции стандартный предсказуемый эпилог. Иначе надо будет учитывать другие инструкции.
Что касается стандартных dll.
Можно просмотреть загловочные файлы из-под установленного Masm-а.
Например: Masm/include/user32.inc.
Но это дает данные о том, сколько параметров у функции, и есть ли результат.
Для просмотра, какие параметры у функции придется смотреть справку WinAPI.
У меня она старая 17 Мб занимает(English), а 2 Гб справки устанавливать на компьютер не интересно.
Можно просматривать заголовочные файлы.
Можно даже хитрее сделать: Написать скрипт, который бы получал по DLL список экспортируемых функции(dumpbin,pexports в помощь), и пытался найти их определения в папке include С/С++ компилятора.
Что-то вроде:
Bash
1
2
3
4
5
6
pexports user32.dll >user32.def
echo "Function List:"> user32.lst
for n in `cat user32.def`;
do
    fgrep -r $n c:/Pograms/MinGW/Include >> user32.lst
done
0
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,552
02.04.2016, 16:15  [ТС] #4
Ну я решил сделать так:
1. Из Длл выгрузить имена функций.
2. Поставил MSDN 2008, написал парсер для него, на ночь поставил - получил более 90% полноценных файлов описывающих функции. (тут и аргументы, и типы, и описания)
3. Ну и тоскать все эти файлы с собой.. По другому всё равно не сделать, т.к. даже с учётом что можно как то вытащить хотя бы аргументы, то описание всё равно нужно будет. (по крайней мере в будующем)

Конешно косяк будет, если например ДЛЛка левая или ещё что то подобное случится, именно по этому и хотелось хотя бы кол-во байт узнать (в run-time), чтоб уменьшить вероятность краша перед использованием.
0
nikolay1982
117 / 117 / 43
Регистрация: 22.01.2014
Сообщений: 375
02.04.2016, 17:19 #5
Можно получить количество байт на параметры с помощью исследавания lib файлов. Дело в том, что имена функций в либ файлах отличаются от тех имен, которые прописаны на экспорт в dll.
Пример:
Bash
1
objdump -t libuser32.a | tail
[ 2](sec 3)(fl 0x00)(ty 0)(scl 3) (nx 0) 0x00000000 .bss
[ 3](sec 4)(fl 0x00)(ty 0)(scl 3) (nx 0) 0x00000000 .idata$7
[ 4](sec 5)(fl 0x00)(ty 0)(scl 3) (nx 0) 0x00000000 .idata$5
[ 5](sec 6)(fl 0x00)(ty 0)(scl 3) (nx 0) 0x00000000 .idata$4
[ 6](sec 7)(fl 0x00)(ty 0)(scl 3) (nx 0) 0x00000000 .idata$6
[ 7](sec 1)(fl 0x00)(ty 0)(scl 2) (nx 0) 0x00000000 _ActivateKeyboardLayout@8
[ 8](sec 5)(fl 0x00)(ty 0)(scl 2) (nx 0) 0x00000000 __imp__ActivateKeyboardLayout@8
[ 9](sec 0)(fl 0x00)(ty 0)(scl 2) (nx 0) 0x00000000 __head_libuser32_a
Да, lib файлы из-под mingw можно открыть с помощью 7z(Кстати lib файлы MSVC тоже). Это будет выглядеть как архив, в корне которого 1.txt содержит список функций.
Так вот, в декорации объектного имени и содержится "@8". Это как я понимаю и есть количество байт по параметры для stdcall. И только для stdcall, cdecl функции в таком "@" не нуждается, так как в функциях cdecl могут быть переменное количество параметров.
1
02.04.2016, 17:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.04.2016, 17:19
Привет! Вот еще темы с ответами:

Экспорт функции DLL - C++
Вечер добрый. Работаю над проектом, в котором из DLL экспортируются функции для другого проекта. Столкнулся с проблемой, что сначала была...

Вызов функции DLL VB.NET в DLL C++ - C++ Builder
Как вызывать функции dll VB.NET через dll С++, которая приинжекчена к процессу проводника?

Список dll - C++ Builder
Добрый день уважаемые форумчани, возник такой вопрос, почему мое приложение (XE3) на разных Пк использует разные подключаемые системные...

Список формальных параметров в функции - C++
Не понимаю цель формальных параметров. Зачем, например, вводить (int a, int b) в функции int summ(int a,int b) { Return a+b; } ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru