получение параметров функции по указателю и имени
От: Arier  
Дата: 18.09.07 14:19
Оценка:
Нужно узнать число параметров у функции в dll, зная адрес данной функции и её имя.Ну или подскажите способ вызова функций по адресу и имени!Спасибо
Re: получение параметров функции по указателю и имени
От: Кодт Россия  
Дата: 18.09.07 15:15
Оценка:
Здравствуйте, Arier, Вы писали:

A>Нужно узнать число параметров у функции в dll, зная адрес данной функции и её имя.


В С++ рефлексии нет.

A>Ну или подскажите способ вызова функций по адресу и имени!Спасибо


int __stdcall the_foo(char, double, int) { ..... }

typedef void(*VoidFunc)(); // все функции можно привести к этому типу
VoidFunc vf = foo;

typedef int (__stdcall *FooType)(char,double,int);
FooType some_foo = (FooType)vf; // получили из обезличенного указателя - указатель нужного типа
int x = some_foo('a',1.23,45); // и вызвали


Конкретно что касается DLL под виндами,
HMODULE hLib = LoadLibrary("the.dll");
FooType some_foo = (FooType) GetProcAddress(hLib, "the_foo"); // если функция была экспортирована под этим именем


Ну и чтоб два раза не вставать, упомяну, что
— экспортные имена у функций из С++ных библиотек, как правило, декорированы (mangled, decorated) — содержат суффикс с информацией о типе, это нужно для перегрузки
— можно заставить компилятор экспортировать/импортировать недекорированные имена — они объявляются как extern "C"
— однако, для разных конвенций вызова такие имена будут остаточно декорированы в стиле Си или WinAPI — "_the_foo" (конвенция __cdecl) или "the_foo" (конвенция __stdcall)
— в .def-файле можно указать линкеру, как именно экспортировать функцию — вплоть до того, что её именем будет целое число
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[2]: получение параметров функции по указателю и имени
От: Sergey Chadov Россия  
Дата: 18.09.07 17:49
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Ну и чтоб два раза не вставать, упомяну, что

К>- экспортные имена у функций из С++ных библиотек, как правило, декорированы (mangled, decorated) — содержат суффикс с информацией о типе, это нужно для перегрузки
К>- можно заставить компилятор экспортировать/импортировать недекорированные имена — они объявляются как extern "C"
К>- однако, для разных конвенций вызова такие имена будут остаточно декорированы в стиле Си или WinAPI — "_the_foo" (конвенция __cdecl) или "the_foo" (конвенция __stdcall)
К>- в .def-файле можно указать линкеру, как именно экспортировать функцию — вплоть до того, что её именем будет целое число

Ну и тогда уж надо упомянуть о UnDecorateSymbolName, которая позволяет в случае хорошо декорированного имени получить-таки сигнатуру.
--
Sergey Chadov

... << RSDN@Home 1.2.0 alpha rev. 685>>
Re[2]: получение параметров функции по указателю и имени
От: Arier  
Дата: 19.09.07 06:54
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, Arier, Вы писали:


A>>Нужно узнать число параметров у функции в dll, зная адрес данной функции и её имя.


К>В С++ рефлексии нет.


A>>Ну или подскажите способ вызова функций по адресу и имени!Спасибо


К>
К>int __stdcall the_foo(char, double, int) { ..... }

К>typedef void(*VoidFunc)(); // все функции можно привести к этому типу
К>VoidFunc vf = foo;

К>typedef int (__stdcall *FooType)(char,double,int);
К>FooType some_foo = (FooType)vf; // получили из обезличенного указателя - указатель нужного типа
К>int x = some_foo('a',1.23,45); // и вызвали
К>


К>Конкретно что касается DLL под виндами,

К>
К>HMODULE hLib = LoadLibrary("the.dll");
К>FooType some_foo = (FooType) GetProcAddress(hLib, "the_foo"); // если функция была экспортирована под этим именем
К>


К>Ну и чтоб два раза не вставать, упомяну, что

К>- экспортные имена у функций из С++ных библиотек, как правило, декорированы (mangled, decorated) — содержат суффикс с информацией о типе, это нужно для перегрузки
К>- можно заставить компилятор экспортировать/импортировать недекорированные имена — они объявляются как extern "C"
К>- однако, для разных конвенций вызова такие имена будут остаточно декорированы в стиле Си или WinAPI — "_the_foo" (конвенция __cdecl) или "the_foo" (конвенция __stdcall)
К>- в .def-файле можно указать линкеру, как именно экспортировать функцию — вплоть до того, что её именем будет целое число

Здравствуйте, проблема в том, что мне необходимо вызвать максимальное число функций Win32 API при этом используя только dll. То есть достать адреса и имена функций можно, но нужно каким-то способом определить число параметров, для вызова...вот проблема...
Re[3]: получение параметров функции по указателю и имени
От: Кодт Россия  
Дата: 19.09.07 14:57
Оценка:
Здравствуйте, Sergey Chadov, Вы писали:

SC>Ну и тогда уж надо упомянуть о UnDecorateSymbolName, которая позволяет в случае хорошо декорированного имени получить-таки сигнатуру.

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

Поскольку jit-компиляторы C++ — это... редкость, что ли,.. то пользы от UnDecorateSymbolName маловато будет.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[3]: получение параметров функции по указателю и имени
От: Кодт Россия  
Дата: 19.09.07 14:57
Оценка:
Здравствуйте, Arier, Вы писали:

< оверквотинг выброшен >

A>Здравствуйте, проблема в том, что мне необходимо вызвать максимальное число функций Win32 API при этом используя только dll. То есть достать адреса и имена функций можно, но нужно каким-то способом определить число параметров, для вызова...вот проблема...


А по-подробнее можно?
Вообще, эта тема абсолютно выходит за рамки С++ и относится к низкоуровневому программированию или каким-то отдельным моментам винапи.
Определись с этим, и мы перебросим ветку в соответствующий форум.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[4]: получение параметров функции по указателю и имени
От: Arier  
Дата: 19.09.07 15:21
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, Arier, Вы писали:


К>< оверквотинг выброшен >


A>>Здравствуйте, проблема в том, что мне необходимо вызвать максимальное число функций Win32 API при этом используя только dll. То есть достать адреса и имена функций можно, но нужно каким-то способом определить число параметров, для вызова...вот проблема...


К>А по-подробнее можно?

К>Вообще, эта тема абсолютно выходит за рамки С++ и относится к низкоуровневому программированию или каким-то отдельным моментам винапи.
К>Определись с этим, и мы перебросим ветку в соответствующий форум.

Ну вообщем да, относиться к низкоуровневому программированию...поскольку решение нашлось нетривиальное и заключается в забивании стека пустыми параметрами по максимуму, то есть максимальное число параметров у Win32 API функции.Вопрос в принципе исчерпан, но проблема в другом, теперь нужно отлавливать исключения, а делать это в ассемблерной части...то есть секции try-catch не позволяют это сделать, или всё же можно как-то распростронить их на ассемблерный код??
Re[4]: получение параметров функции по указателю и имени
От: Arier  
Дата: 19.09.07 15:25
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, Arier, Вы писали:


К>< оверквотинг выброшен >


A>>Здравствуйте, проблема в том, что мне необходимо вызвать максимальное число функций Win32 API при этом используя только dll. То есть достать адреса и имена функций можно, но нужно каким-то способом определить число параметров, для вызова...вот проблема...


К>А по-подробнее можно?

К>Вообще, эта тема абсолютно выходит за рамки С++ и относится к низкоуровневому программированию или каким-то отдельным моментам винапи.
К>Определись с этим, и мы перебросим ветку в соответствующий форум.

Задача в том, чтобы вызвать к примеру все функции библиотеки user32.dll, при этом вовсе не обязательно передавать правильные параметры, нужно просто заставить программу зайти в функцию и по возможности отловить исключения возникающие при этом.вот такое задание...=)
Re[5]: получение параметров функции по указателю и имени
От: Sergey Chadov Россия  
Дата: 19.09.07 16:05
Оценка:
Здравствуйте, Arier, Вы писали:

A>Ну вообщем да, относиться к низкоуровневому программированию...поскольку решение нашлось нетривиальное и заключается в забивании стека пустыми параметрами по максимуму, то есть максимальное число параметров у Win32 API функции.Вопрос в принципе исчерпан, но проблема в другом, теперь нужно отлавливать исключения, а делать это в ассемблерной части...то есть секции try-catch не позволяют это сделать, или всё же можно как-то распростронить их на ассемблерный код??


Обработка исключений реализуется виндой. Как использовать в программе ассемблере см. например http://www.wasm.ru
--
Sergey Chadov

... << RSDN@Home 1.2.0 alpha rev. 685>>
Re[5]: получение параметров функции по указателю и имени
От: Кодт Россия  
Дата: 19.09.07 16:31
Оценка:
Здравствуйте, Arier, Вы писали:

A>Задача в том, чтобы вызвать к примеру все функции библиотеки user32.dll, при этом вовсе не обязательно передавать правильные параметры, нужно просто заставить программу зайти в функцию и по возможности отловить исключения возникающие при этом.вот такое задание...=)


Стресс-тестирование user32.dll?
Во-первых, там большинство функций экспортируются с ординалами, а те, которые с именами — не декорированы, поскольку потребители — не С++ные программы, а любые.
Во-вторых, исключения там очень простые: либо функция возвращает код ошибки, либо возникает структурное исключение (чаще всего — защита памяти), либо она успевает сделать нечто деструктивное, например, удалить все файлы из текущего каталога.
То есть, ловить особо нечего.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[6]: получение параметров функции по указателю и имени
От: Arier  
Дата: 19.09.07 18:18
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Стресс-тестирование user32.dll?

К>Во-первых, там большинство функций экспортируются с ординалами, а те, которые с именами — не декорированы, поскольку потребители — не С++ные программы, а любые.
К>Во-вторых, исключения там очень простые: либо функция возвращает код ошибки, либо возникает структурное исключение (чаще всего — защита памяти), либо она успевает сделать нечто деструктивное, например, удалить все файлы из текущего каталога.
К>То есть, ловить особо нечего.

Да мне не ловить, мне нужно чтобы программа при этом не падала...а она из-за первого неправильного обращения к памяти падает...=)
Re[7]: получение параметров функции по указателю и имени
От: Кодт Россия  
Дата: 19.09.07 19:00
Оценка: +1
Здравствуйте, Arier, Вы писали:

A>Да мне не ловить, мне нужно чтобы программа при этом не падала...а она из-за первого неправильного обращения к памяти падает...=)


И пусть падает. Потому что если сегодня ты поймал AV, то завтра не поймаешь (кто-то удачно выстрелит в незащищённую страницу) и огребёшь произвольные наведённые ошибки.
Так что вместо повышения живучести лучше сейчас побороться за повышение правильности.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[8]: получение параметров функции по указателю и имени
От: Arier  
Дата: 19.09.07 20:44
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, Arier, Вы писали:


A>>Да мне не ловить, мне нужно чтобы программа при этом не падала...а она из-за первого неправильного обращения к памяти падает...=)


К>И пусть падает. Потому что если сегодня ты поймал AV, то завтра не поймаешь (кто-то удачно выстрелит в незащищённую страницу) и огребёшь произвольные наведённые ошибки.

К>Так что вместо повышения живучести лучше сейчас побороться за повышение правильности.

будем пробовать...спасибо за советы!=)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.