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

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

  1. float

    float New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2010
    Сообщения:
    113
    Пишу я загрузчик PE в память. Так как все pe обычно базозависимые, приходится грузить файл по их imagebase. Проблема в том, что в этом месте память уже занята стеком какого-то левого потока. При попытке освободить ее, все падает. Как можно решить эту проблему?
    С, vs2010
     
  2. sysexit

    sysexit New Member

    Публикаций:
    0
    Регистрация:
    27 авг 2010
    Сообщения:
    176
    Интересно можно так?:

    Проанализировать чем занят блок, допустим если стек потока, тогда суспендить поток, выделить новую память под стек, поменять контекст того потока скопировать туда данные, освободить нужную память, возобновить поток. Что-то в этом роде?

    Или бред?
     
  3. float

    float New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2010
    Сообщения:
    113
    Это конечно можно, но уж очень черезжопно. Я вообще думал что можно как-то линкеру указать, что какая-либо область памяти зарезервирована под мое приложение.
     
  4. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    конечно можно
    ImageBase + SizeOfImage
     
  5. float

    float New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2010
    Сообщения:
    113
    ну вот у калькулятора допустим imagebase 4000000h. У него базозависимый код, т.е. надо грузить его по этому адресу. А стек потока взял и разместился по адресу, равному imagebase+sizeofimage/2, то есть влезет только половина памяти его. По этому я хочу как-то зарезервировать допустим память от 4000000 до 7000000 под себя еще на этапе линкования
     
  6. Phyber

    Phyber New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2010
    Сообщения:
    96
    float
    Проблему можно решить немного другой реализацией загрузчика.
    Думайте головой,как сделать по другому ничего не портя при этом и не освобождая.
     
  7. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    > А стек потока взял и разместился по адресу, равному imagebase+sizeofimage/2
    невозможно, потому что память [imagebase, imagesize + sizeofimage] уже выделена.
     
  8. sysexit

    sysexit New Member

    Публикаций:
    0
    Регистрация:
    27 авг 2010
    Сообщения:
    176
    Например?
     
  9. float

    float New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2010
    Сообщения:
    113
    было бы замечательно, но поток создается еще перед заходом в _tmain()
     
  10. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    ну если тебе надо грузить именно свой ехе по другому адресу и у тебя есть возможность делать манипуляции с линкером, тогда лучше добавь релоки. Это проще и работать будет везде. Более-менее разумного решения подобной проблемы я в сети не встречал. Обычно или закрывали глаза на частичную несовместимость, или писали базонезависимый код. Релоки - это самое правильное решение, предусмотренное самой виндой
     
  11. Phyber

    Phyber New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2010
    Сообщения:
    96
    sysexit
    Сказано же, думайте головой.
     
  12. float

    float New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2010
    Сообщения:
    113
    загрузчик мой, ехе чужой. Вы уверены что релоки могут решить проблему инструкций подобной этой?:
    [​IMG]
    где юзается абсолютная адрессация.
     
  13. sysexit

    sysexit New Member

    Публикаций:
    0
    Регистрация:
    27 авг 2010
    Сообщения:
    176
    Конечно уверены, почитайте о релоках.
     
  14. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    float
    пишите дизасм-енджин-генератор-релоков)))
    а если по теме, то манипулировать флагами /BASE, /FIXED, /STACK и тд...
    ЗЫ по-моему свой PE-лоудер еще не написал только ленивый)))
     
  15. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    sysexit
    не выйдет. текущие адреса стека уже находятся в регистрах (ebp, например), самом стеке, памяти, итд (fs:0, например).
    float
    для того они и предназначены
     
  16. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    ну релоки были созданы для одного единственного случая - абсолютной адресации. Для относительной адресации они вообще не нужны. Но, если ехе чужой, ничего ты не сделаешь. В свое время сталкивался с такими же проблемами - потом забил на файлы без релоков.
     
  17. sysexit

    sysexit New Member

    Публикаций:
    0
    Регистрация:
    27 авг 2010
    Сообщения:
    176
    Пройтись и поправить все значения в стеке которые принадлежат адресам старого стека?(естественно бажно, ну все же). Контекст потока разве сложно править?
     
  18. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    > было бы замечательно, но поток создается еще перед заходом в _tmain()
    память выделяется еще до создания потока.
     
  19. IceCrashLdr

    IceCrashLdr New Member

    Публикаций:
    0
    Регистрация:
    29 июн 2010
    Сообщения:
    193
    Снять атрибуты с памяти.
    Дать стеку "просраться" предварительно выравнять память(в смысле соединить всю память, так что бы память была не разрывной с 400000 - image_to_load + sizeof(stack) посчитать полее точно) , у стека получится большое смещения, но память будет валидной так что overflow не будет ...
     
  20. ziral2088

    ziral2088 New Member

    Публикаций:
    0
    Регистрация:
    16 авг 2009
    Сообщения:
    283
    float
    может легче создать новый процесс? и в нем делать уже манипуляции