Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Izual
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,525
01.02.2016, 04:10     Список параметров функции из DLL #1
В runtime загружаю DLL'ки, вывожу список функций содержащийся в них, но так и не нашёл вариантов как экспортировать типы аргументов и возвратного значения.. Пару статей указали на то, что если создатели библиотеки использовали стандарт (name mangeling?), то можно экпортировать, но если нет - то фиг вам)
Так вот если нельзя, то можно может хотя бы размер бит-аргументов узнать? (т.е. общий размер, например в какой то функции под названием GetParent, допустим 4 аргумента, все они int_32, т.е. 4х4байт=32, а return там bool - 1 байт, т.е. в сумме 33 байта. (вот это число 33 байта можно ли как нибудь вытащить?)

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

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

Получение значения через список параметров C++
Пустой список параметров в c и c++ C++
C++ Builder Вызов функции DLL VB.NET в DLL C++
C++ Builder Список dll
Список формальных параметров в функции C++
C++ Как понять список формальных параметров функции Bar?
C++ Передача параметров в функции
Список уже загруженных DLL в системе C++ WinAPI
C++ Добавление своей dll в список dll подгружаемых процессом чужого процесса
В чем причина ошибки при получении адреса функции из dll с помощью функции GetProcAddress? C++ WinAPI
Ошибка об отсутствии MSVCP140D.dll, ucrtbased.dll, CONCRT140D.dll, VCRUNTIME140D.dll Visual C++
C++ Вызвать функцию из dll с неопределённым числом параметров

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

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

(круглый)
nikolay1982
92 / 92 / 38
Регистрация: 22.01.2014
Сообщений: 310
02.04.2016, 15:56     Список параметров функции из DLL #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
Izual
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,525
02.04.2016, 16:15  [ТС]     Список параметров функции из DLL #4
Ну я решил сделать так:
1. Из Длл выгрузить имена функций.
2. Поставил MSDN 2008, написал парсер для него, на ночь поставил - получил более 90% полноценных файлов описывающих функции. (тут и аргументы, и типы, и описания)
3. Ну и тоскать все эти файлы с собой.. По другому всё равно не сделать, т.к. даже с учётом что можно как то вытащить хотя бы аргументы, то описание всё равно нужно будет. (по крайней мере в будующем)

Конешно косяк будет, если например ДЛЛка левая или ещё что то подобное случится, именно по этому и хотелось хотя бы кол-во байт узнать (в run-time), чтоб уменьшить вероятность краша перед использованием.
nikolay1982
92 / 92 / 38
Регистрация: 22.01.2014
Сообщений: 310
02.04.2016, 17:19     Список параметров функции из DLL #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 могут быть переменное количество параметров.
Yandex
Объявления
02.04.2016, 17:19     Список параметров функции из DLL
Ответ Создать тему
Опции темы

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