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

C++

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

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

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

В 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++
Не понимаю цель формальных параметров. Зачем, например, вводить (int a, int b) в функции int summ(int a,int b) { Return a+b; } ...

Как понять список формальных параметров функции Bar? - C++
class Foo { void friend Bar(Foo & foo); private: int data;

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

Пустой список параметров в c и c++ - C++
Работаю в visual studio 2010. Прочитал, что в C пустой список параметров означает, что компилятор не проверяет аргументы и этой функции...

Получение значения через список параметров - C++
Доброго времени суток! есть переменная: int *X=NULL; Необходимо передать её адрес в функцию в которой выделяется для неё память и...

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

В чем причина ошибки при получении адреса функции из dll с помощью функции GetProcAddress? - C++ WinAPI
Здравствуйте.Не могу получить адрес функции из dll с помощью функции GetProcAddress. dll: #include<windows.h> HHOOK _hook; int...

Список уже загруженных DLL в системе - C++ WinAPI
Изначальная задача - загрузка DLL и вызов её функционала. Перед началом использования, возник вопрос, а какие из DLL, лежащие у себя в...

Передача параметров в функции - C++
Здравствуйте Помогите, пожалуйста, разобраться с передачей параметров. Задание : создать класс "Треугольник", определить углы и тип...

Передача параметров функции - C++
Не могу передать значение переменной функции. По идее все правильно, но она берет только последнее значение, а ещё может зациклиться. ...

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

Передача параметров функции - C++
доброго времени суток:) есть программа реализующая метод градиентного спуска. но да это неважно есть функция Norm. значение этой...


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

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

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

Конешно косяк будет, если например ДЛЛка левая или ещё что то подобное случится, именно по этому и хотелось хотя бы кол-во байт узнать (в run-time), чтоб уменьшить вероятность краша перед использованием.
nikolay1982
93 / 93 / 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
Ответ Создать тему
Опции темы

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