Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вызов функции из DLL 
:(
    Опции темы
fire64
Дата 25.9.2010, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 18.7.2007

Репутация: нет
Всего: нет



Подскажите, как вызвать не экспортную функцию из dll.

Адрес функции в виде 00089400, а так же список аргументов известен.
PM MAIL   Вверх
okkonst
Дата 25.9.2010, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 5.9.2010
Где: Воронеж

Репутация: нет
Всего: 1



Цитата(fire64 @ 25.9.2010,  13:26)
Подскажите, как вызвать не экспортную функцию из dll.

Адрес функции в виде 00089400, а так же список аргументов известен.

гм. Если ты знаешь адрес - в чем проблема? Так же как экспортную (по позднему связыванию). Только, вместо MyFunc = GetProcAddress(...)  делаешь прямое присвоение значения адреса...
PM MAIL   Вверх
fire64
Дата 25.9.2010, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 18.7.2007

Репутация: нет
Всего: нет



Так что ли ?

Код

int    Test( int arg1 )
{
    int funcexec = ((int (__cdecl *)( int ))0x1005CA80)( arg1 );

    return funcexec;
}


Это сообщение отредактировал(а) fire64 - 25.9.2010, 14:46
PM MAIL   Вверх
fire64
Дата 25.9.2010, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 18.7.2007

Репутация: нет
Всего: нет



гм.
Сделал библиотеку с кодом

Код

int    Test(  )
{
    return 16;
}


через IDA дезасемблировал ее, в HexReys'е вышло следующее:

Код

signed int __cdecl sub_10003A30()
{
  return 16;
}


Потом написал программу, загрузил библиотеку и использовал код:

Код

int    Test(  )
{
    int funcexec = ((int (__cdecl *)( ))0x10003A30)( );

    return funcexec;
}



В результате программа закрывается с ошибкой в в test.dll
PM MAIL   Вверх
586
Дата 25.9.2010, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



fire64,
Значит, DLL загружена по другому адресу.

Код
int x = ( (int (__cdecl*)()) ((size_t)GetModuleHandle("test.dll")+0x3A30) ) ();

PM   Вверх
fire64
Дата 25.9.2010, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 18.7.2007

Репутация: нет
Всего: нет



Ок, теперь еще уточнение:

Можно вместо GetModuleHandle использовать LoadLibrary ?

Как указывать адрес функции ?

Пример: адрес в IDA 10002710

Значит надо писать
Код

((size_t)LoadLibrary("Test.dll")+0x10002710)


или

Код

((size_t)LoadLibrary("Test.dll")+0x2710)

PM MAIL   Вверх
Abyx
Дата 26.9.2010, 00:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 601
Регистрация: 3.11.2009

Репутация: 2
Всего: 10



Цитата(fire64 @  25.9.2010,  18:17 Найти цитируемый пост)
Можно вместо GetModuleHandle использовать LoadLibrary ?

можно. LoadLibrary сначала вызывает GetModuleHandle и если ммодуль не найден, то грузит его


Цитата(fire64 @  25.9.2010,  18:17 Найти цитируемый пост)
LoadLibrary("Test.dll")+0x2710

именно так, 0x2710 это RVA - смещение в памяти относительно базового адреса модуля
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0709 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.