Вызов функции из DLL

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by fire64, 25 Sep 2010.

  1. fire64

    fire64 Elder - Старейшина

    Joined:
    1 Apr 2008
    Messages:
    251
    Likes Received:
    22
    Reputations:
    5
    Подскажите, как вызвать не экспортную функцию из dll.

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

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    примерно так:
    Code:
    type
      TMyProc = function(par1,par2: Integer): Integer;
      ....
     var
      MyProc: TMyProc = nil;
      ...
      MyProc:= TMyProc($00089400); // здесь должен быть адрес, по которому загружена процедура
      .....
      i:= MyProc(par1,par);
    
     
    #2 alexey-m, 25 Sep 2010
    Last edited: 25 Sep 2010
  3. fire64

    fire64 Elder - Старейшина

    Joined:
    1 Apr 2008
    Messages:
    251
    Likes Received:
    22
    Reputations:
    5
    Ок, сейчас попробую.
     
  4. alexey-m

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    Ах да, забыл сказать, не забудь указать соглашение по которому вызывается функция
     
  5. fire64

    fire64 Elder - Старейшина

    Joined:
    1 Apr 2008
    Messages:
    251
    Likes Received:
    22
    Reputations:
    5
    гм.
    Сделал библиотеку с кодом

    Code:
    int    Test(  )
    {
        return 16;
    }
    
    через IDA дезасемблировал ее, в HexReys'е вышло следующее:

    Code:
    signed int __cdecl sub_10003A30()
    {
      return 16;
    }
    
    Потом написал программу, загрузил библиотеку и использовал код:

    Code:
    int    Test(  )
    {
        int funcexec = ((int (__cdecl *)( ))0x10003A30)( );
    
        return funcexec;
    }
    

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

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    1: test.dll должна быть загружена в адресное пространство твоей проги
    2: указывай правильное соглашение вызова
    3: адрес функции не обязательно будет такой 0x10003A30, как его показывает IDA, он может совсем быть другим, поэтому тебе его надо опредилять динамически
     
  7. fire64

    fire64 Elder - Старейшина

    Joined:
    1 Apr 2008
    Messages:
    251
    Likes Received:
    22
    Reputations:
    5
    Насчет 1 и 2. все ок

    Насчет 3, как определить адрес функции в памяти, зная физическое смещение функции в dll файле ?

    Мне уже подсказали:
    int x = ( (int (__cdecl*)()) ((size_t)GetModuleHandle("test.dll")+0x3A30) ) ();
     
  8. R0nin

    R0nin Member

    Joined:
    11 Jul 2010
    Messages:
    261
    Likes Received:
    24
    Reputations:
    8
    Code:
    HANDLE h = LoadLibrary( dll_path_name );
    void (*f)(void) = GetProcAddress( h, "func_name_from_dll" );
    
    f();
     
  9. alexey-m

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    R0nin, ты вопрос внимательно читал?
    То, что ты написал - это динамическая загрузка DLL с последующим получением адреса и вызовом экспортируемой функции)