143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|
1 | |
Список параметров функции из DLL01.02.2016, 04:10. Показов 2711. Ответов 4
Метки нет (Все метки)
В runtime загружаю DLL'ки, вывожу список функций содержащийся в них, но так и не нашёл вариантов как экспортировать типы аргументов и возвратного значения.. Пару статей указали на то, что если создатели библиотеки использовали стандарт (name mangeling?), то можно экпортировать, но если нет - то фиг вам)
Так вот если нельзя, то можно может хотя бы размер бит-аргументов узнать? (т.е. общий размер, например в какой то функции под названием GetParent, допустим 4 аргумента, все они int_32, т.е. 4х4байт=32, а return там bool - 1 байт, т.е. в сумме 33 байта. (вот это число 33 байта можно ли как нибудь вытащить?) Вообще конешно в идеале хотелось бы вытащить полностью инфу (конкретные типы), может есть пример как это делается если dll'ка помечена создателем Microsoft? (т.е. предполагаю что у них то всё по стандарту) И ещё один под вопрос, где взять документацию по всей библиотеке (например user32.dll), т.е. все функции, все параметры, возможно описания, ещё какие то плюшки.. Руками перебирать сайт MSDN не хочется, может есть что то уже скомпанованное?
0
|
01.02.2016, 04:10 | |
Ответы с готовыми решениями:
4
Список формальных параметров в функции Список параметров для функции Format! Как понять список формальных параметров функции Bar? Как сделать список возможных параметров для своей функции |
50 / 49 / 10
Регистрация: 24.01.2010
Сообщений: 225
|
|
04.02.2016, 15:51 | 2 |
В наш век инета - быстрее через него.
Но если инфы совсем ёк - то глазками, больше никак. Т.е. либо аида наша всё(декомпиляция), либо тупо вызываете функцию(благо имя самой функции найти можно и соглашение по очистке стэка) ну а далее смотреть, что юзается с приходящего стэка и ресгистров в самой функции. Дело долгое, муторное и требует внимательности. (круглый)
0
|
127 / 126 / 59
Регистрация: 22.01.2014
Сообщений: 462
|
||||||
02.04.2016, 15:56 | 3 | |||||
Это значит, в стэк передается четыре аргумента int32_t , а результат в регистре EAX (тип вызова stdcall,cdecl).
Для незадокументированных dll можно диассемблировать и посмотреть аргумент return. По этому значению можно угадать сколько у функции аргументов в DWORD. Но это грубое упрощение, в расчете на то, что в функции стандартный предсказуемый эпилог. Иначе надо будет учитывать другие инструкции. Что касается стандартных dll. Можно просмотреть загловочные файлы из-под установленного Masm-а. Например: Masm/include/user32.inc. Но это дает данные о том, сколько параметров у функции, и есть ли результат. Для просмотра, какие параметры у функции придется смотреть справку WinAPI. У меня она старая 17 Мб занимает(English), а 2 Гб справки устанавливать на компьютер не интересно. Можно просматривать заголовочные файлы. Можно даже хитрее сделать: Написать скрипт, который бы получал по DLL список экспортируемых функции(dumpbin,pexports в помощь), и пытался найти их определения в папке include С/С++ компилятора. Что-то вроде:
0
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|
02.04.2016, 16:15 [ТС] | 4 |
Ну я решил сделать так:
1. Из Длл выгрузить имена функций. 2. Поставил MSDN 2008, написал парсер для него, на ночь поставил - получил более 90% полноценных файлов описывающих функции. (тут и аргументы, и типы, и описания) 3. Ну и тоскать все эти файлы с собой.. По другому всё равно не сделать, т.к. даже с учётом что можно как то вытащить хотя бы аргументы, то описание всё равно нужно будет. (по крайней мере в будующем) Конешно косяк будет, если например ДЛЛка левая или ещё что то подобное случится, именно по этому и хотелось хотя бы кол-во байт узнать (в run-time), чтоб уменьшить вероятность краша перед использованием.
0
|
127 / 126 / 59
Регистрация: 22.01.2014
Сообщений: 462
|
||||||
02.04.2016, 17:19 | 5 | |||||
Можно получить количество байт на параметры с помощью исследавания lib файлов. Дело в том, что имена функций в либ файлах отличаются от тех имен, которые прописаны на экспорт в dll.
Пример:
[ 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 | |
02.04.2016, 17:19 | |
Помогаю со студенческими работами здесь
5
Передача параметров через список параметров формы Добавление своей dll в список dll подгружаемых процессом чужого процесса Количество параметров и возвращаемых параметров у функции передача параметров dll fasm Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |