Реальный адрес ф-ии

Тема в разделе "LANGS.C", создана пользователем xrc2, 1 авг 2008.

  1. xrc2

    xrc2 New Member

    Публикаций:
    0
    Регистрация:
    5 апр 2008
    Сообщения:
    47
    VC/Debug MODE:


    Код (Text):
    1. int Function()
    2. {
    3.     MessageBoxA(NULL, "Test", "Test", MB_OK);
    4.     return 10;
    5. }
    6.  
    7. int main(int argc, char* argv[])
    8. {
    9.     Function();
    10.     DWORD addr = (DWORD)Function;
    11.     return 0;
    12. }
    Почему если навести мышь на Function тултип покажет реальный адрес ф-ии, а вот в переменной addr будет адрес метки?
    Как получить реальный адрес ф-ии чтобы можно было пройтись по всем opcode'am?

    К примеру:

    Код (Text):
    1. PBYTE real = (PBYTE)Function;
    2. while(true)
    3. {
    4.     size_t len = IsOpcode(real);
    5.     (DWORD)real += len;
    6.     (...)
    7. }
     
  2. Paganel

    Paganel New Member

    Публикаций:
    0
    Регистрация:
    29 июн 2008
    Сообщения:
    9
    Если сделать так
    DWORD addr = (DWORD) &Function;
    Если я конешно правильно тебя понял.
     
  3. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    xrc2

    Чее? В чем разница между реальным адресом функции и адресом метки?))) Что вообще такое адрес метки? )))


    Paganel

    Одна хрень. Имя free-function сводится к указателю.
     
  4. xrc2

    xrc2 New Member

    Публикаций:
    0
    Регистрация:
    5 апр 2008
    Сообщения:
    47
    Да я собсно это и хочу выяснить....


    Я об этом:

    Код (Text):
    1. int Function()
    2. {
    3.     MessageBoxA(NULL, "Test", "Test", MB_OK);
    4.     return 9;
    5. }
    6.  
    7. int main(int argc, char *argv[])
    8. {
    9.         Function();
    10.  
    11.     PBYTE ff = (PBYTE)Function;
    12.     for (int i = 0; i < 5; ++i)
    13.         printf("%d\n", ff[i]);
    14.     printf("*****************");
    15.     ff = (PBYTE)0x004121A0;//Это реальный адрес ф-ии, я его получил когда зашел в ф-ию Function() и после зашел в Disassemby
    16.     for (int i = 0; i < 5; ++i)
    17.         printf("%d\n", ff[i]);
    18.  
    19.     return 0;
    20. }
    вопрос почему вывод разный? потому что в первом случае мы получили адрес на метку в которой стоит jmp [на реальный адрес]. А во втором случае все верно.. но как его получать в с++? или хотя бы автономно?

    Т.е. пройдите по отладчиком вызов ф-ии Function() вы увидите
    call [адрес метки] // который мы собсно то и получаем
    а в адресе метки стоит:
    jmp [реальный адрес]

    В релизе по моему такого нет... только в Debug mode (VC 7.1-2005)
     
  5. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    xrc2
    Так скомпилирован код на С/С++ - не знаю зачем, наверное есть причины. В коде на FASM, например, такого нет - одна из причин по которой мне и понравился FASM.
     
  6. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    xrc2

    PBYTE ff = (PBYTE)Function;
    printf("%p", ff);

    Что скажет?

    // Это реальный адрес ф-ии, я его получил когда зашел в ф-ию Function() и после зашел в Disassemby

    Каким образом ты решил, что то, что ты увидел в дизасме - "реальный адрес функции"?
     
  7. xrc2

    xrc2 New Member

    Публикаций:
    0
    Регистрация:
    5 апр 2008
    Сообщения:
    47
    Ты знаешь что такое EIP (регистр такой есть), Воин дзена :)???
    Ладно не парься ребята из RSDN'a оказались шустрее :)
    http://rsdn.ru/forum/message/3042657.flat.aspx#3042657
     
  8. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    xrc2

    Бугаго и досвидос)))
     
  9. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    xrc2
    afaik это вставляет линковщик для поддержки фичи "Edit and Continue" - когда можно при дебаге, не останавливая процесса, изменить код, перекомпилировать и продолжить отладку нового кода с текущей позиции. И нужно это, ибо сами функции могут при перекомпиляции разбухнуть, и тогда без переходников полетят все метки, а пересчитывать все call'ы, vmt и указатели на функции весьма проблематично. Попробуй отключить в настройках проекта "Edit and continue".
     
  10. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    так какие проблемы ввести дефайн для отладки и всё:

    #ifdef _DEBUG
    ff = { выдираем адрес начала функции из команды jmp }
    #endif

    Соответственно в обоих сборках будет работать верно.