Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Вызов функции из DLL


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

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

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

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

гм. Если ты знаешь адрес - в чем проблема? Так же как экспортную (по позднему связыванию). Только, вместо MyFunc = GetProcAddress(...)  делаешь прямое присвоение значения адреса...

Автор: fire64 25.9.2010, 14:22
Так что ли ?

Код

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

    return funcexec;
}

Автор: fire64 25.9.2010, 15:14
гм.
Сделал библиотеку с кодом

Код

int    Test(  )
{
    return 16;
}


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

Код

signed int __cdecl sub_10003A30()
{
  return 16;
}


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

Код

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

    return funcexec;
}



В результате программа закрывается с ошибкой в в test.dll

Автор: 586 25.9.2010, 16:29
fire64,
Значит, DLL загружена по другому адресу.

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

Автор: fire64 25.9.2010, 17:17
Ок, теперь еще уточнение:

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

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

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

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

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


или

Код

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

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

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


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

именно так, 0x2710 это RVA - смещение в памяти относительно базового адреса модуля

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)