VC/Debug MODE: Код (Text): int Function() { MessageBoxA(NULL, "Test", "Test", MB_OK); return 10; } int main(int argc, char* argv[]) { Function(); DWORD addr = (DWORD)Function; return 0; } Почему если навести мышь на Function тултип покажет реальный адрес ф-ии, а вот в переменной addr будет адрес метки? Как получить реальный адрес ф-ии чтобы можно было пройтись по всем opcode'am? К примеру: Код (Text): PBYTE real = (PBYTE)Function; while(true) { size_t len = IsOpcode(real); (DWORD)real += len; (...) }
xrc2 Чее? В чем разница между реальным адресом функции и адресом метки?))) Что вообще такое адрес метки? ))) Paganel Одна хрень. Имя free-function сводится к указателю.
Да я собсно это и хочу выяснить.... Я об этом: Код (Text): int Function() { MessageBoxA(NULL, "Test", "Test", MB_OK); return 9; } int main(int argc, char *argv[]) { Function(); PBYTE ff = (PBYTE)Function; for (int i = 0; i < 5; ++i) printf("%d\n", ff[i]); printf("*****************"); ff = (PBYTE)0x004121A0;//Это реальный адрес ф-ии, я его получил когда зашел в ф-ию Function() и после зашел в Disassemby for (int i = 0; i < 5; ++i) printf("%d\n", ff[i]); return 0; } вопрос почему вывод разный? потому что в первом случае мы получили адрес на метку в которой стоит jmp [на реальный адрес]. А во втором случае все верно.. но как его получать в с++? или хотя бы автономно? Т.е. пройдите по отладчиком вызов ф-ии Function() вы увидите call [адрес метки] // который мы собсно то и получаем а в адресе метки стоит: jmp [реальный адрес] В релизе по моему такого нет... только в Debug mode (VC 7.1-2005)
xrc2 Так скомпилирован код на С/С++ - не знаю зачем, наверное есть причины. В коде на FASM, например, такого нет - одна из причин по которой мне и понравился FASM.
xrc2 PBYTE ff = (PBYTE)Function; printf("%p", ff); Что скажет? // Это реальный адрес ф-ии, я его получил когда зашел в ф-ию Function() и после зашел в Disassemby Каким образом ты решил, что то, что ты увидел в дизасме - "реальный адрес функции"?
Ты знаешь что такое EIP (регистр такой есть), Воин дзена ??? Ладно не парься ребята из RSDN'a оказались шустрее http://rsdn.ru/forum/message/3042657.flat.aspx#3042657
xrc2 afaik это вставляет линковщик для поддержки фичи "Edit and Continue" - когда можно при дебаге, не останавливая процесса, изменить код, перекомпилировать и продолжить отладку нового кода с текущей позиции. И нужно это, ибо сами функции могут при перекомпиляции разбухнуть, и тогда без переходников полетят все метки, а пересчитывать все call'ы, vmt и указатели на функции весьма проблематично. Попробуй отключить в настройках проекта "Edit and continue".
так какие проблемы ввести дефайн для отладки и всё: #ifdef _DEBUG ff = { выдираем адрес начала функции из команды jmp } #endif Соответственно в обоих сборках будет работать верно.