Проблема с функциями, экспортироваными программой

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Frostman, 21 Aug 2012.

  1. Frostman

    Frostman New Member

    Joined:
    17 Aug 2012
    Messages:
    12
    Likes Received:
    0
    Reputations:
    0
    Привет всем! У меня вот следующая проблема: есть программа, она имеет ряд функций, которые экспортирует. Вот смотрю в IDA PRO список экспортируемых функций, выбираю самую простую:
     
    #1 Frostman, 21 Aug 2012
    Last edited: 22 Aug 2012
  2. Kaimi

    Kaimi Well-Known Member

    Joined:
    23 Aug 2007
    Messages:
    1,732
    Likes Received:
    811
    Reputations:
    231
    Мне кажется обычно динамические библиотеки экспортируют функции, а не "программы".

    Т.е. этот код заведомо рабочий и его не стоило приводить?

    Но код опять не приводим. Действительно, зачем?

    [​IMG]

    Отлично. Архив с кучей файлов, причем хрен знает, что искать в нем.
     
    _________________________
  3. Frostman

    Frostman New Member

    Joined:
    17 Aug 2012
    Messages:
    12
    Likes Received:
    0
    Reputations:
    0
    3. Код? Или лог?


    4. Да. я асм плохо знаю, но когда происходит вызов функции, записывается значения точки, куда должно возвратится выполнение программы, в стек.
    ПС: да, судя написанного мною инсепшн рулит=)

    5. Запуск программы осуществятся файломСобственно в дебаггере у него есть таблица экспорта функций. Подключаюсь к нему через LoadLibrary.
     
    #3 Frostman, 21 Aug 2012
    Last edited: 22 Aug 2012
  4. Kaimi

    Kaimi Well-Known Member

    Joined:
    23 Aug 2007
    Messages:
    1,732
    Likes Received:
    811
    Reputations:
    231
    Отлично, но я бы все же предпочел полный код, который совершает вызов... Ну да ладно.

    Code:
    double __cdecl ABS(int a1, int a2) 
    { 
    if ( *(double *)a2 < 0.0 ) 
    { *(double *)a1 = -1.0 * *(double *)a2;
    }
     else 
    { 
    *(_DWORD *)a1 = *(_DWORD *)a2; 
    *(_DWORD *)(a1 + 4) = *(_DWORD *)(a2 + 4);
    }
    return *(double *)a1;
    }
    
    *(double *)a2, *(double *)a1 - что-то мне подсказывает, что в a1 и a2 требуется передавать указатели, а не значения переменных.

    А сей фрагмент
    *(_DWORD *)a1 = *(_DWORD *)a2;
    *(_DWORD *)(a1 + 4) = *(_DWORD *)(a2 + 4);

    вызывает доп подозрение, что за указателем должен скрываться не int, а какой-нибудь double или int64, или long long скажем, короче что-то 64 битное
     
    _________________________
    #4 Kaimi, 21 Aug 2012
    Last edited: 21 Aug 2012
  5. Kaimi

    Kaimi Well-Known Member

    Joined:
    23 Aug 2007
    Messages:
    1,732
    Likes Received:
    811
    Reputations:
    231
    Может приведешь уже код полностью, где ты проводишь все нужные операции и получаешь в результате ошибку?
     
    _________________________
  6. Frostman

    Frostman New Member

    Joined:
    17 Aug 2012
    Messages:
    12
    Likes Received:
    0
    Reputations:
    0
    перечитай мой прошлый комментарий. Ошибка при вызове функции. а если ошибки нету - совсем другие значения
     
  7. КOT

    КOT Banned

    Joined:
    14 Jun 2012
    Messages:
    26
    Likes Received:
    6
    Reputations:
    2
    НА кот бы взглянуть
     
  8. Frostman

    Frostman New Member

    Joined:
    17 Aug 2012
    Messages:
    12
    Likes Received:
    0
    Reputations:
    0
    Не могу дать код. Вот так кот
     
    #8 Frostman, 21 Aug 2012
    Last edited: 22 Aug 2012
  9. КOT

    КOT Banned

    Joined:
    14 Jun 2012
    Messages:
    26
    Likes Received:
    6
    Reputations:
    2
    Попробуй щас
    Code:
    typedef double (*ABS)(double *, troubl *,double *,troubl *);
    
    int _tmain(int argc,_TCHAR* argv[])
    {
    HINSTANCE hMod = LoadLibrary(L"info.exe");
    if (hMod!=NULL)
    {
    ABS func = (ABS)GetProcAddress(HMod,"ABS");
    if (func!=NULL)
    {
    double x=0;
    double y =-2;
    double z = func(&x,&y);
    }
    }
    return 0;
    }
    
    
     
  10. Frostman

    Frostman New Member

    Joined:
    17 Aug 2012
    Messages:
    12
    Likes Received:
    0
    Reputations:
    0
    у меня такого нету troubl *, какой нужно модулю подключить?
    ПС: кодю под VC++
     
    #10 Frostman, 21 Aug 2012
    Last edited: 22 Aug 2012