Переносим ли код?

Discussion in 'Реверсинг' started by GlOFF, 23 Sep 2007.

  1. GlOFF

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

    Joined:
    8 May 2006
    Messages:
    689
    Likes Received:
    484
    Reputations:
    4
    Интересен следующий вопрос, компилятор создает файл с кодом, данными, ресурсами. Если нет Reloc директории (Relocation Table), то код можно считать всегда переносимым :confused: , т.е. независимым от базоваго адреса загрузки.
     
    1 person likes this.
  2. 0x0c0de

    0x0c0de Elder - Старейшина

    Joined:
    25 May 2007
    Messages:
    441
    Likes Received:
    396
    Reputations:
    297
    >> Если нет Reloc директории (Relocation Table), то код можно считать всегда переносимым

    все с точностью до наоборот. Таблица перемещаемых элементов используется, чтобы файл можно было загрузить по адресу отличному от указанного в Optionalheader.imagebase (см. формат pe)
     
    1 person likes this.
  3. GlOFF

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

    Joined:
    8 May 2006
    Messages:
    689
    Likes Received:
    484
    Reputations:
    4
    Это я смотрел :)
    Я говорю про компилятор, если он не создаст таблицу перемещаемых элементов, то значит компилятор создал код без абсолютной адресации, или он просто создал код, без поддержки базового адреса загрузки отличного от "OptionalHeader.ImageBase"...
     
  4. 0x0c0de

    0x0c0de Elder - Старейшина

    Joined:
    25 May 2007
    Messages:
    441
    Likes Received:
    396
    Reputations:
    297
    Если нет таблицы перемещаемых элементов загрузка файла будет возможна только по адресу в OptionalHeader.ImageBase и ни по какому другому.

    >>создал код без абсолютной адресации

    неееее. как раз в этом случае загрузка по другому адресу невозможна=> есть привязка к конкретным адресам (если я правильно тебя понимаю)

    В общем для начала что такое таблица перемещаемых элементов - это массив указателей на rva адреса, которые будут скорректированы при смене image base. значит=> если нет этой таблицы, лоадер не сможет ниче скорректировать => загрузка по другому адресу невозможна
     
    #4 0x0c0de, 23 Sep 2007
    Last edited: 23 Sep 2007
    1 person likes this.
  5. GlOFF

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

    Joined:
    8 May 2006
    Messages:
    689
    Likes Received:
    484
    Reputations:
    4
    Под абсолютной адресацией я понимал "привязка к конкретным адресам".
    Гм.. Забавно тогда получается, большенство файлов из под компилятора, не поддерживают загрузки отличного от "OptionalHeader.ImageBase" :) Пытаюсь понять, доасмыслить работу паковщиков (После "Об упаковщиках в последний раз").

    P.S. Значит "таблицу перемещаемых элементов" можно просто выкинуть из файла. :)

    0x0c0de Спс за разьяснения, но знаю я это ;)
     
    #5 GlOFF, 23 Sep 2007
    Last edited: 23 Sep 2007
    1 person likes this.
  6. 0x0c0de

    0x0c0de Elder - Старейшина

    Joined:
    25 May 2007
    Messages:
    441
    Likes Received:
    396
    Reputations:
    297
    >>большенство файлов из под компилятора, не поддерживают загрузки отличного от "OptionalHeader.ImageBase"

    Большинству файлов это и не надо. таблица перемещаемых элементов встречается в подавляющем большинстве случаев в dll, так как у длл частенько меняются адреса загрузки.
     
  7. 0x4D617A

    0x4D617A Member

    Joined:
    23 Sep 2007
    Messages:
    11
    Likes Received:
    8
    Reputations:
    0
    Это точно...а виндовый загрузчик экзешники загружает именно по адресу указанному в "OptionalHeader.ImageBase"
     
    1 person likes this.
  8. GlOFF

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

    Joined:
    8 May 2006
    Messages:
    689
    Likes Received:
    484
    Reputations:
    4
    0x4D617A
    В описаниях формата PE никто не дает 100% гарантии. И релоки в exe - это не навинка.

    0x0c0de Я вот и хочу узнать почему
    Потому что компилятор не создает прямой адресации привязанной к полным адресам, или у exe в 99.99% случаев совпадение адресов загрузки.

    И склоняясь ко второму, можно ли тогда "таблицу перемещаемых элементов" просто выкинуть из EXE-файла?
     
    #8 GlOFF, 23 Sep 2007
    Last edited: 23 Sep 2007
    2 people like this.
  9. 0x0c0de

    0x0c0de Elder - Старейшина

    Joined:
    25 May 2007
    Messages:
    441
    Likes Received:
    396
    Reputations:
    297
    >>у exe в 99.99% случаев совпадение адресов загрузки

    да
     
  10. _Great_

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

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,119
    Reputations:
    1,139
    И у SYS. Они просто физически не могут грузиться по базовому адресу, указанному в PE хидере - он обычно ставится юзермодный. К тому же они все грузятся в одно АП (системное), и поэтому могут быть конфликты
     
    2 people like this.
  11. Ra$cal

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    но если есть желание, то в msvs можно линкер принудительно сгенерить и прицепить релоки. /NOTFIXED, или типа такого =)
     
    #11 Ra$cal, 25 Sep 2007
    Last edited: 25 Sep 2007