секции в ехе

Тема в разделе "WASM.WIN32", создана пользователем netcat, 2 ноя 2008.

  1. netcat

    netcat New Member

    Публикаций:
    0
    Регистрация:
    29 окт 2008
    Сообщения:
    3
    Почему виртуальные адреса секций после загрузки ехе отличаются от реальных и как получить их реальное значение? Сравнивал дамп ехе с оригинальным после описания секций появляется какой-то участок забитый нулями из-за него все сдвигается.
     
  2. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    хз для чего это нужно. По всем адресам (физическим и виртуальным) тебе надо перед задаванием подобных вопросов хотя бы раз посмотреть на формат РЕ (тот же Мэтт Питрек) - обрати внимание на заголовки секций. Там все просто и понятно.
     
  3. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    потомучто в файле секции выравниваются по границе 0x200 байт, а в памяти по границе 0x1000 байт,

    поэтому если 1я секция в файле начинается со смещения 0x400, 2я c 0x600, 3я c 0x800,
    то в памяти 1я секция начинается с смещения 0x1000, 2я c 0x2000, 3я c 0x3000,

    кроме того, если в секции есть неинициализированные данные (или код), то размер сеции в памяти будет больше размера секции на диске.
     
  4. netcat

    netcat New Member

    Публикаций:
    0
    Регистрация:
    29 окт 2008
    Сообщения:
    3
    А как тогда рассчитать рельный адрес?
     
  5. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    netcat
    организовать цикл с проверкой "А попадает ли искомый рва в диапазаон рва какой-либо секции? если нет, может он попадает в заголовок? Если нет, наверно это оверлей!"
     
  6. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    netcat
    Такие "пляски" в исполняемом нужны для оптимизации. В физическом файле используется выравнивание 0x200, т.к. это обычно размер сектора. В виртуальной памяти используется выравнивание 0x1000, т.к. это размер страницы. Например код, который без выравнивания займет две страницы физической памяти с выравниванием может занять только одну. Сейчас это, может быть, менее актуально -- физической памяти стало больше.

    Значения физического/виртуального выравнивания могут меняться, но должны быть кратными значениям, которые я сейчас не помню точно :). Но их можно посмотреть в спецификации и поэкспериментировать. Например, секции моего любимого FAR'а физически выравнены на 0х1000, а не на 0х200.

    Смотря что считать "реальным" адресом. Если есть физическое смещение в файле, то из него надо вычесть физический адрес секции (получишь смещение адреса в секции) и сложить с виртуальным адресом секции и базовым адресом загрузки. Получишь виртуальный адрес смещения. Физический и вирутальный адреса секции берутся из ее заголовка.