Занятые области памяти

Тема в разделе "LANGS.C", создана пользователем float, 19 окт 2010.

  1. float

    float New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2010
    Сообщения:
    113
    а если попробовать в моем загрузчике создать секцию по адресу 4000000 и достаточным размером, и забить в нее массив нулей?

    типа
    #pragma section( ".mem" )
    __declspec(allocate(".mem")) char buffer[0x40000];

    а прибить секцию к адресу вроде тоже как-то можно.


    upd:
    собственно насколько я понял, релоки как раз и могут разместить мою секцию по нужному мне адресу. Но msdn молчит. Их вообще в VC++ можно прописать какой-нибудь директивой?
     
  2. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    нет, так сделать нельзя. Все секции должны непрерывно следовать друг за другом. Если будешь так делать, это то же самое, что тебе советовали в ответе №4

    поковыряйся в опциях линкера. Там вроде две опции есть, чтобы в итоге были добавлены релоки.
     
  3. deLight

    deLight New Member

    Публикаций:
    0
    Регистрация:
    26 май 2008
    Сообщения:
    879
    Я так и не понял что конкретно мешает вам приравнять базу образа пакера к базе пакуемого бинаря?
    При загрузке вы (если нет травы, то образ вашего модуля) уже на целевых адресах.
    Себя анмапнули, бинарь на это место распаковали, в чем проблема?
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Зачем его писать, если есть системный.
     
  5. deLight

    deLight New Member

    Публикаций:
    0
    Регистрация:
    26 май 2008
    Сообщения:
    879
    Clerk
    Рассматривается вариант, при котором упакованный бинарь не содержит релоков.
    Манипуляции, описанные выше, нужны в любом случае. Загрузчик нативный или свой - роли тут не играет.
     
  6. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    было уже. стуб распаковщика поместить ниже 400000. проследить чтоб в нем не было бсс и ресурсов. точнее бсс одна нужна - на начало запакованного кода. запакованный блок пририсовываем в хвост с учетом выравнивания по бсс, расширяем дату на него. переназначаем бсс так чтоб оно покрыло все нужное под распакованный код место.
    гдето так
     
  7. deLight

    deLight New Member

    Публикаций:
    0
    Регистрация:
    26 май 2008
    Сообщения:
    879
    qqwe
    Некрасивая база может не понравиться эвристикам, не тру.
    Хотя способ более красивый, без анмапов и прочего.
     
  8. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    deLight
    Зачем без релоков ?
     
  9. deLight

    deLight New Member

    Публикаций:
    0
    Регистрация:
    26 май 2008
    Сообщения:
    879
    Clerk
    Прочитайте с первых постов, задача иная стоит изначально и она решаема.
    Зачем это другой вопрос.
     
  10. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    deLight
    Если память занята, то каким бы образом она не освобождалась, ни к чему хорошему это не приведёт. Тотже стек потока - если на момент его останова была адресация локальных переменных например в ядро, то после смены стека поток отвалится. Необходимо резервировать память соновным модулем, меняя его базу.
     
  11. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    ну скомпельте свой распаковщик в шел или с релоками, перенесите и распаковывайте на его место как уже говорили. не помню кто. правда, не знаю как ваши ав к изменению атрибутов памяти отнесутся.

    как вариант - колдовать с мапом даты перед распаковщиком. только не знаю выйдет ли.

    еще вариант - вызвать распаковщик из стандартного пролога (скажем, вместо мэйн). а само место под прогу объявить как дату (с запакованным образом) и бсс (чтоб места не жрало). распаковщик воткнуть куда нибудь. тогда все будет на местах. единственно что - ехекутировать дату потом нужно будет.
     
  12. deLight

    deLight New Member

    Публикаций:
    0
    Регистрация:
    26 май 2008
    Сообщения:
    879
    Clerk
    1) Стек потока не может находиться на целевых адресах, тк они зарезервированы основным модулем, но при этом база та же, не обязательно смещать ее
    назад как в #26.

    2) Поток один, какие остановы? В контексте первичного потока происходит unmap образа основного модуля, далее на эти адреса
    кладется распакованный бинарь.

    Никаких проблем нет, по факту.

    qqwe
    Ав к этому отнестись никак не могут при всем желании, для статического анализа признаков нет.
    В момент распаковки целевого образа эмулятор уже лежит.
     
  13. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    deLight
    #1:
     
  14. deLight

    deLight New Member

    Публикаций:
    0
    Регистрация:
    26 май 2008
    Сообщения:
    879
    Clerk
    Память в этом месте не может быть занята, если образ пакера загружается по адресам, на которые впоследствии будет распакован модуль.
    Сколько это еще повторить раз не знаю. Засыпаете уже все что-ли?
     
  15. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    deLight
    С образом всё понятно, темболее я и сам это написал выше. Сосредоточтесь.
     
  16. deLight

    deLight New Member

    Публикаций:
    0
    Регистрация:
    26 май 2008
    Сообщения:
    879
    Clerk
    Без комментариев.
    В качестве развития научно-познавательных интересов, объясните присутсвующим как в области, занятой
    основным модулем (ImageBase...ImageBase+SizeOfImage) может размещаться стек потока.

    Ребята тоже ждут, тк они такого явно не проектировали:
    [​IMG]

    Соломон Руссиновичу (Катлер уже оглох от смеха): "Марк, когда они уже издадут WinInternals на белорусском?"
     
  17. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    deLight
    Стек потока не в пределах первичного образа, а в пределах распаковываемого. А тебе есчо рано такими фотками кидать, сосунок.
     
  18. deLight

    deLight New Member

    Публикаций:
    0
    Регистрация:
    26 май 2008
    Сообщения:
    879
    Clerk
    Ну наконец-то! Я теперь с вами?

    float
    Если собрать теперь все вместе - генерируется модуль, база загрузки которого равна базе пакуемого бинарника.
    Размер образа должен быть не меньше чем соответственно поле SizeOfImage целевого модуля. Этим обеспечивается
    резервирование нужной вам области памяти. Получив управление упаковщик выделяет в адресном пространстве регион
    нужного размера и переносит туда упакованный модуль и базонезависимый код, который делает следующее: выгружает
    промапленный на необходимые адреса основной модуль (или ставит всему региону аттрибуты RW) и загружает в эту область
    нужный бинарник. Тут по сути два варианта или грузить самому, дублируя практически все необходимые действия загрузчика
    (настройка импорта, фикс значений в списке модулей) или заюзать способ с трассировкой нативного лоадера - достаточно красивое,
    но несколько сложное для новичка решение от нашего чудо-vx'ера.
     
  19. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    > Если собрать теперь все вместе - генерируется модуль, база загрузки которого равна базе пакуемого бинарника.
    пост номер 4 =)
     
  20. deLight

    deLight New Member

    Публикаций:
    0
    Регистрация:
    26 май 2008
    Сообщения:
    879
    n0name
    Претензий нет, после небольшого перерыва начинайте компиляцию.