![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Добрый день! Кто может подсказать, почему, когда я подгружаю стороннюю длл написанную на с++ и получаю полный список экспорта этой длл, я вижу не функцию, к примеру, _Activate, а нечто вроде ?@@_Activate...(дословно не скажу, всё дома осталось) и ещё много других символов. Я знаю только, что это определяется при компиляции длл, но с какой целью? И как сконвертировать такое имя функции к нормальному виду? Укажите, пожалуйста, где прочитать. И если найдётся кусок кода для изучения, буду премного благодарен. Кстати, тот же PE Explorer показал не только нормальные имена функций, но и их прототипы. Умеет же как-то.
Задача - найти в длл несколько функций с определёнными именами и получить их RV-адреса. 1. Подгружаю длл и получаю список экспорта (за основу взял великолепный код от Rouse_) 2. Заношу все получаемые функции в список строк 3. В списке ищу соответствие. 4. Если соответствие найдено - получаю адрес вызовом GetProcAddress П.3 валится из-за несоответствия имён что у меня и что нашла процедура. Заранее спасибо за любую помощь! |
#2
|
|||
|
|||
![]() Это декорация, так на любом языке. Просто в секции экспорта не указываются входные параметры (их нужно либо просто знать, либо использовать библиотеки импорта), поэтому за счет декорирования имен разделяются перегруженные функции. Так же указывается соглашение о вызовах
Цитата:
А зачем искать соответствие? Если такой функции нет, то GetProcAddress вернет NULL, так в мсдн написано |
#3
|
|||
|
|||
![]() Прежде всего, спасибо за помощь!
Цитата:
В том-то и дело, что не выходит. Смотри, нужная мне функция имеет имя, положим, _pNetGet, я так понял, это класс (заголовочного файла у меня нет, dll не имеет документации к себе). Я делаю GetProcAddress с параметром 'имя_функции'. Но GetProcAddress ничего не находит, ибо в экспорте они лежат "замангленные" (даже узнал как называется). Соответственно, GetProcAddress не может найти функцию, название которой искажено (ошибка "Не найдена функция"). У меня есть программа для получения экспорта из dll, писал когда-то. Она корректно воспринимает имена функций, т.е. без этого мусора, прочие снифферы делают либо также, либо искажают имена. В связи с этим вопрос: должна ли в данном конкретном случае GetProcAddress корректно находить функцию по "нормальному" имени? |
#4
|
|||
|
|||
![]() По корректному имени должна
|
Этот пользователь сказал Спасибо ChinYan за это полезное сообщение: | ||
_dss (04.03.2012)
|
#5
|
|||
|
|||
![]() Цитата:
|
#6
|
|||
|
|||
![]() Пришлите свою dll, мне тоже интересно посмотреть =)
|
#7
|
|||
|
|||
![]() Цитата:
|