Как загрузить исполняемый код по адресу 0x10000?

Тема в разделе "WASM.WIN32", создана пользователем gvozdoder, 9 окт 2007.

  1. gvozdoder

    gvozdoder New Member

    Публикаций:
    0
    Регистрация:
    9 окт 2007
    Сообщения:
    7
    Есть скомпилированный код, но он расчитан на запуск по смещению 0x10000. С помощью editbin удалось сделать, чтобы он запускался с 0x11000, но не меньше. Есть ли способ сделать чтобы код начинался с адреса 0x10000?

    PS. Природа смещений 0x10000 и 0x1000, из которых складывается 0x11000, мне известна.
    PPS. Пытался загружать код по стандартному смещению 0x400000, чтобы потом скопировать его в 0x10000, но оказалось, что 0x10000 уже кем-то занято (там, похоже, был расположен environment).
     
  2. tylerdurden

    tylerdurden New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    322
    Напиши драйвер который на ProcessNotify будет выделять память по адресу 0x10000 достаточную для копирования всего кода, а на старте кода копируй его туда и все.

    П.С. А ты пробывал освободить память по этим адресам ?
     
  3. Cr4sh

    Cr4sh New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2006
    Сообщения:
    668
    а данные? а абсолютные метки? если код без фиксапов то удачи
    хотя если фиксапов нет, то можно просто ловить ексцепшны при акцессе к адрессам памяти лежащим в раёне 0x10000, получать контекст и патчить код окторый туда обратился с учётом новой базы
     
  4. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    Создатй свой екзешник с базой 0x10000 и при запуске пусть он заменит свой образ на нужный код.
     
  5. tylerdurden

    tylerdurden New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    322
    Cr4shА данные пусть там и лежат где были
     
  6. gvozdoder

    gvozdoder New Member

    Публикаций:
    0
    Регистрация:
    9 окт 2007
    Сообщения:
    7
    tylerdurden
    Хочется обойтись без драйвера :)

    asd
    Екзешник с базой 0x10000 загружает код по адресу 0x11000. Способа обойти это мне найти не удалось.

    all
    Задача, грубо говоря, запустить скомпилированный под DOS/4GW бинарь под виндой. Я понимаю, что мне нужно будет заменять системные вызовы и тому подобное барахло, это будет второй этап работы, мне он понятен.
     
  7. Cr4sh

    Cr4sh New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2006
    Сообщения:
    668
    ты о структуре исполняемого файла понятие иммешь? =) акцесс к тому что находится в секции инициализированых/неинициализированых данных осуществляется по абсолютному а не по относительному адрессу, если бинарник не базонезависимый и без фиксапов то код находящийся по новой базе будет обращаться к данным относительно старого базового адресса
     
  8. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    gvozdoder
    ну так передвинь его на 0x1000 перед исполнением. PE заголовок, если мне память не изменяет, доступен для исполнения.
     
  9. Freecod

    Freecod New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2006
    Сообщения:
    136
    Очень похоже на лабу по ОСям, работа с памятью =)
    Одногрупник делал, спрошу.
     
  10. gvozdoder

    gvozdoder New Member

    Публикаций:
    0
    Регистрация:
    9 окт 2007
    Сообщения:
    7
    asd
    Не вопрос, сдвину. Насколько безопасно затирать PE заголовок? Он разве никому не нужен?

    tylerdurden
    Не пробовал. Там же чьи-то данные лежат. Вдруг понадобятся системным дллкам.
     
  11. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    gvozdoder
    если испортишь заголовок, то не сможешь пользоваться api для получения ресурсов, дла получения экспортируемых из твоего ехе ф-ий, может ещё чего, что тебе я думаю совершенно не надо. Так что издевайся над ним как хочеш
     
  12. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    gvozdoder
    Естесственно, ведь VA первой секции обычно 0x1000. Интересно, если её поставить в 0 или хотя бы в 0x100.. А вот сам образ ниже 0х10000 опустить уже нельзя (теоретически).

    Вообще, я бы посоветовал перечитать все доки по играм с РЕ форматом и работе загрузчика. Ну и на сами сорцы не мешало бы глянуть.

    Действительно, при загрузке образа не по адресу 0х10000 на этом месте находятся переменные окружения, а если образ на этом адресе, то они поднимаются выше. Подозреваю, что их всё-таки можно переместить после загрузки образа, скопировав в другое место и пофиксив PEB, но надо смотреть.
     
  13. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    кстати, кому могут понадобиться переменные окружения, кроме самой проги? Может их грохнуть просто?

    IceStudent
    Сомнительно. Помнится в памяти ничего друг на друга налазить не должно.

    ps: попробовал сейчас изменить RVA и VirtualSize первой секций на RVA = 0 и VirtualSize = VirtualSize+0x1000 - ничего хорошего не вышло.
     
  14. gvozdoder

    gvozdoder New Member

    Публикаций:
    0
    Регистрация:
    9 окт 2007
    Сообщения:
    7
    IceStudent
    PEB == Process Environment Block?
     
  15. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    знаешь толк в извращениях
    для записи недоступен, если мне не изменяет память..

    пиши базонезависимый код или код с релокоме.. после старта проги с базой 10000 переносешь код в выделенную память (сталобыть память надо выделеть). после анмапа выделяешь память по адресу 11000, копируешь туда код, парсешь релоки и все нормально
     
  16. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    gvozdoder
    Да.
     
  17. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    И вообще VirtualProtect на заголовок натравить можно и поставить ему какие угодно атрибуты:)
     
  18. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    asd
    +1. ставим entry point на фиктивный код, который перенесет всю тушу на страницу (0x1000) назад, затерев PE-заголовок и вызовет оригинальный код.
    все будет чики-пуки вплоть до вызова первой WinApi, которой потребуется загловок, например, для работы с ресурсами..
     
  19. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Есть альтернативный подход: загружаем код куда получится (адрес a), создаём парочку селекторов в LDT (один - для кода cs, другой - для данных ds = es = ss), рассчитывая их базу как a-0x10000. Для общения с внешним миром, конечно, нужны заглушки, загружающие нужные cs/ds/es/ss. Создание селектора под NT-семейством делается функцией NtSetLdtEntries из ntdll.dll, под 9x таки нужен драйвер, делающий VMMCall _Allocate_LDT_Selector.
     
  20. gvozdoder

    gvozdoder New Member

    Публикаций:
    0
    Регистрация:
    9 окт 2007
    Сообщения:
    7
    IceStudent
    Блок по адресу 0x10000 я перенес, еще перенес блок, который был по адресу 0x20000, т. к. он мне тоже мешал. Возникло 2 проблемы:
    1) VirtualAlloc возвращает ошибку при попытке аллокации по адресу 0x10000. LastError == ERROR_INVALID_ADDRESS. VirtualFree для старых блоков перед этим вызывал, разумеется.
    2) После переноса перестали работать некоторые функции CRT, а именно fopen. Это не очень критично, т. к. перед системным вызовом я могу вернуть все обратно.
    diamond
    Круто! Я предполагал, что такой способ может быть возможен, но не знал как его реализовать. Спасибо, попробую.