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

Discussion in 'WASM.BEGINNERS' started by debugx, Mar 13, 2009.

  1. debugx

    debugx New Member

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

    jaja New Member

    Blog Posts:
    0
    Joined:
    Jul 23, 2008
    Messages:
    243
    http://www.wasm.ru/article.php?article=memfile
     
  3. Aspire

    Aspire New Member

    Blog Posts:
    0
    Joined:
    May 19, 2007
    Messages:
    1,028
    jaja Не запустится таким макаром блокнот. Он без релоков.
     
  4. MSoft

    MSoft New Member

    Blog Posts:
    0
    Joined:
    Dec 16, 2006
    Messages:
    2,854
    нда... рановато человек начал процессы из памяти запускать
     
  5. Clerk

    Clerk Забанен

    Blog Posts:
    0
    Joined:
    Jan 4, 2008
    Messages:
    6,689
    Location:
    РБ, Могилёв
    Сохранить массив из памяти на диск и запустить.
     
  6. MSoft

    MSoft New Member

    Blog Posts:
    0
    Joined:
    Dec 16, 2006
    Messages:
    2,854
    Clerk
    +1, убил просто
     
  7. ohne

    ohne New Member

    Blog Posts:
    0
    Joined:
    Feb 28, 2009
    Messages:
    431
    а хуле - так половина говнокрипторов и работает
     
  8. EvilsInterrupt

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

    Blog Posts:
    0
    Joined:
    Oct 28, 2003
    Messages:
    2,428
    Location:
    Russia
    >>а хуле - так половина гуан*рипторов и работает
    Это значит нужно быть таким же ? )
     
  9. K10

    K10 New Member

    Blog Posts:
    0
    Joined:
    Oct 3, 2008
    Messages:
    1,590
    Aspire
    Если память мне не изменяет, в той статье запускающий стаб копирует себя в другое место, освобождает на своем месте память, куда и помещает запускаемый файл, т.е. по адресу 00400000
     
  10. Clerk

    Clerk Забанен

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

    ohne New Member

    Blog Posts:
    0
    Joined:
    Feb 28, 2009
    Messages:
    431
    EvilsInterrupt
    нет, это к тому что смешного мало
    и вообще какая вам какая разница - вам же легче работать будет)
     
  12. Freeman

    Freeman New Member

    Blog Posts:
    0
    Joined:
    Feb 10, 2005
    Messages:
    1,385
    Location:
    Ukraine
    K10 дада :)

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

    deLight New Member

    Blog Posts:
    0
    Joined:
    May 26, 2008
    Messages:
    879
    http://hellknights.void.ru/uploads/peloader.cpp
     
  14. wasm_test

    wasm_test wasm test user

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

    juicy_emad New Member

    Blog Posts:
    0
    Joined:
    Jul 15, 2008
    Messages:
    82
    deLight
    Неплохо. А с запакованными файлами работает? (UPX, EXECryptor)
     
  16. wasm_test

    wasm_test wasm test user

    Blog Posts:
    0
    Joined:
    Nov 24, 2006
    Messages:
    5,582
    juicy_emad
    Ну сорс вообще мой. И оччень стааарый. А на запакованных файлах не тестил.
     
  17. deLight

    deLight New Member

    Blog Posts:
    0
    Joined:
    May 26, 2008
    Messages:
    879
    Можно как вариант помещать код загрузчика на свободные адреса изначально, т.е. линковать с нужной нам базой. Так получается и необходимости писать шеллкод нет и не требуется обрабатывать релоки, ну и весь остальной геммор с "перелетами" на другие адреса тоже отпадет.
     
  18. _int2e_

    _int2e_ New Member

    Blog Posts:
    0
    Joined:
    Mar 1, 2009
    Messages:
    124
    Нельзя.
    Т.к. многие АВ выдают HEUR/Mal. по одной только базе.
    База нужна стандартная, иначе не спасет не один криптор
     
  19. deLight

    deLight New Member

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

    debugx New Member

    Blog Posts:
    0
    Joined:
    Nov 26, 2008
    Messages:
    13
    процесс не запускается. Вот на этом условии завершается праздник жизни:
    Code (Text):
    1. if( !poh->DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress )
    2. {