Запуск процесса из памяти

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

  1. debugx

    debugx New Member

    Публикаций:
    0
    Привет всем,
    есть масссив байт, считываю в него содержимое файла C:\Windows\notepad.exe, теперь хочу из этого массива байт породить процесс, т.е. запустить процесс из памяти. Подскажите как это сделать?
     
  2. jaja

    jaja New Member

    Публикаций:
    0
    http://www.wasm.ru/article.php?article=memfile
     
  3. Aspire

    Aspire New Member

    Публикаций:
    0
    jaja Не запустится таким макаром блокнот. Он без релоков.
     
  4. MSoft

    MSoft New Member

    Публикаций:
    0
    нда... рановато человек начал процессы из памяти запускать
     
  5. Clerk

    Clerk Забанен

    Публикаций:
    0
    Сохранить массив из памяти на диск и запустить.
     
  6. MSoft

    MSoft New Member

    Публикаций:
    0
    Clerk
    +1, убил просто
     
  7. ohne

    ohne New Member

    Публикаций:
    0
    а хуле - так половина говнокрипторов и работает
     
  8. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    >>а хуле - так половина гуан*рипторов и работает
    Это значит нужно быть таким же ? )
     
  9. K10

    K10 New Member

    Публикаций:
    0
    Aspire
    Если память мне не изменяет, в той статье запускающий стаб копирует себя в другое место, освобождает на своем месте память, куда и помещает запускаемый файл, т.е. по адресу 00400000
     
  10. Clerk

    Clerk Забанен

    Публикаций:
    0
    MSoft
    Шутка но с долей правды, как без NtCreateProcess запустить его. Например процесс который должен "запустить из памяти" имеет имя run.exe, как сделать notepad.exe - в юзермоде решений я не вижу, так как имена эти сохраняются при передаче имени секции в тот сервис. Хотя вопрос наверно не об этом, а о том как настроить релоки, подгрузить всё что в импорте и пр., без обращения к файлу на диске, а использую образ в памяти. В таком случае решения есть, это перехват NtCreateFile для того, чтобы возвратить иной от ошибки статус, NtCreateSection чтобы забить ноль, на место хэндла файла, NtMapViewOfSection чтобы подставить свою проекцию и пр. Или создать секцию в директории KnownDlls\, в принципе нужно подумать. Если не устраивают подобные ухищрения, то написать загрузчик.
    Кстати можно попробовать использовать хэндл секции который является одним из параметров для NtCreateProcess. Можно клонировать адресное пространство, можно попробовать поставить хэндл не файлоовой секции(не знаю в этом случае что произойдёт).
     
  11. ohne

    ohne New Member

    Публикаций:
    0
    EvilsInterrupt
    нет, это к тому что смешного мало
    и вообще какая вам какая разница - вам же легче работать будет)
     
  12. Freeman

    Freeman New Member

    Публикаций:
    0
    K10 дада :)

    он поидее должен быть SEC_IMAGE, когдато уже сморел в ту сторону
    Код (Text):
    1. if (!((PSECTION)SectionToMap)->u.Flags.Image) {
    2. ...
    3. return STATUS_SECTION_NOT_IMAGE;
     
  13. deLight

    deLight New Member

    Публикаций:
    0
    http://hellknights.void.ru/uploads/peloader.cpp
     
  14. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Aspire
    Кто сказал, что в целевом АП будут те же виртуальные адреса?
    Требуется ведь создать процесс, а не поток. Если бы поток тогда вполне сошел бы и пе лоадер.
    А так можно попробовать сделать объект Section которая будет отображаьтб не файл на диске, а файл подкачки а потом NtCreateProcess и передать туда этот Section
     
  15. juicy_emad

    juicy_emad New Member

    Публикаций:
    0
    deLight
    Неплохо. А с запакованными файлами работает? (UPX, EXECryptor)
     
  16. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    juicy_emad
    Ну сорс вообще мой. И оччень стааарый. А на запакованных файлах не тестил.
     
  17. deLight

    deLight New Member

    Публикаций:
    0
    Можно как вариант помещать код загрузчика на свободные адреса изначально, т.е. линковать с нужной нам базой. Так получается и необходимости писать шеллкод нет и не требуется обрабатывать релоки, ну и весь остальной геммор с "перелетами" на другие адреса тоже отпадет.
     
  18. _int2e_

    _int2e_ New Member

    Публикаций:
    0
    Нельзя.
    Т.к. многие АВ выдают HEUR/Mal. по одной только базе.
    База нужна стандартная, иначе не спасет не один криптор
     
  19. deLight

    deLight New Member

    Публикаций:
    0
    int2e
    Ну о палевности же речи не шло, а говорили "как запустить из памяти".
    По поводу АВ, раз уж речь зашла...
    здравый смысл подсказывает что вызов NtCreateProcess, учитывая что ей передается уже расшифрованный бинарник, будет провоцировать громкий аверский крик в 100% случаев.
    верно?
     
  20. debugx

    debugx New Member

    Публикаций:
    0
    процесс не запускается. Вот на этом условии завершается праздник жизни:
    Код (Text):
    1. if( !poh->DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress )
    2. {