Как сделать, чтобы в коде были базовые поправки?

Тема в разделе "WASM.BEGINNERS", создана пользователем amvoz, 14 ноя 2009.

  1. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Друзья!
    Вот штутдирую фоормат PE-файла, решил немного поэксперементировать. Решил изменить ImageBase hiew'ом (Загрузить exe файл по другому исполняемому адресу) получилось (+понадобилось изменить ещё одно место в коде). Но, поскольку, приложение было messagebox.exe, то написалась чушь всякая, ибо для вызываемой функции MessageBox в стек клались СТАРЫЕ адреса строк. А так как код сместился на дельта-смещение, то, как вы поняли, по этим адресам находился мусор какой-то, а не нужные строки.

    ...Фактически вопрос свёлся бы к вопросу о среде программирования- почему среда программирования MASM (код был скомпилирован с её помощью) не предполагает базовых поправок? Но точно так же обстоят дела и с Dev C++ компилятор, встроенный туда тоже не делает базовых поправок.

    Как так? А если чё случится? Код ведь не выполнится корректно?
    Или, может, авторы предполагают, что *exe файлы всегда грузятся по своим адресам, а по чужим грузятся только *dll (не всегда, а иногда, естественно).

    В общем, прошу разъяснить это вопрос. Спасибо.
     
  2. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    для задания базы есть опция линкера: /BASE
    а для библиотек есть релоки.
     
  3. zeroday

    zeroday New Member

    Публикаций:
    0
    Регистрация:
    16 окт 2009
    Сообщения:
    27
    amvoz Линкуй с ключом /FIXED:NO и будет тебе счастье.
     
  4. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Действительно, спасибо, формируется соответсвующая секция. Только вот не работает.
    То есть на этот раз я правлю в Hiew одно поле- базовый адрес.
    Прога нормально по нему загружается.
    Базовые поправки тоже корректные, я просмотрел, благо их немного, несколько штук всего. Только вот они почему-то по нужным адресам не прибавляются... Есть какие-нибудь предположения?

    Может, когда адрес правишь вручную, дельта-смещение не прибавляется/отнимается?
     
  5. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    конечно нет.
     
  6. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    Совершенно верно. Релокация проверяется когда модуль грузится по адресу отличному от ImageBase. Ты подправил адрес, модуль грузится по новому, но этот адрес равен ImageBase.
     
  7. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    надо читать "Релокация происходит", конечно же )
     
  8. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    А, понял на самом деле, спасибо
    Ну, блин, облом какой...
    А вот скажите пожалуйста, что значит /BASE? Просто я пишу /BASE:3900000 а он меня кидает на адрес
    60000... Пишу 20000 кидает на 41000. Всё бы разрешилось, знай я за ключи. Но!
    Я отыскал в пакете masm информцию по ключам линковщика
    C:\masm32\help\masm32.chm

    Нашёл там LINK Options и вот:
    /ALIGN:#
    /BASE:{address|@filename,key}
    /COMMENT:comment
    /DEBUG

    ...И так далее без комментариев,ключей 20. А как я узнаю (например), какое смещение имеется ввиду- файловое или секционное (первый пункт)? Подскажите, пожалуйста.
    ...Ну, я понимаю, что address|@filename,key значит адрес или имя файла... Какое имя файла? Короче, дальше я уже не понимаю. Извините.
     
  9. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    /BASE:0x40000

    ня? :)
     
  10. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    только не забываем о выравнивании секций при выборе базы.
     
  11. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    В смысле?
    Я его не меняю- по крайней мере, явно, оно как было 1000h так и останется

    ...Вот только на английском что-то нашёл
    http://msdn.microsoft.com/en-us/library/f7f5138s%28VS.71%29.aspx