Создание процесса не привязанного к файлу

Тема в разделе "WASM.WIN32", создана пользователем Aids, 30 окт 2008.

  1. Aids

    Aids New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2007
    Сообщения:
    275
    Возмозно ли создать процесс в Windows пользовательском режиме, что бы он не был привязан к конкретному файлу, а находился только в оперативке?

    Смотрел справку Небета по NativeApi. Но мне не удалось запустить исходник в полной мере. Хотя хендел процесса и получал. Если не ошибаюсь файл становится невозможно удалить после выполнения функции
    NT::ZwCreateSection(&hSection, SECTION_ALL_ACCESS, &oa, 0,
    PAGE_EXECUTE, SEC_IMAGE, hFile);

    или этой

    NT::ZwCreateProcess(&hProcess, PROCESS_ALL_ACCESS, &oa,
    NtCurrentProcess(), TRUE, hSection, 0, 0);

    Ещё пробовал следующее: на FAT32 запускаю калькулятор и стираю файл прямым обращением к жёсткому диску. Файла нет а процесс работает. Или просто с дискеты файл запускаю и вытаскиваю её.

    Хотелось бы сконструировать процесс в режиме пользователя стандартными функциями API, но только чтобы процесс не был привязан к файлу.

    Как вы думаете это можно реализовать?
     
  2. x0man

    x0man New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2008
    Сообщения:
    358
    Ну как же... просто данных в оперативке не бывает, пока чтото не запустишь.

    >>А так смотри работу ZwCreateProcess и пиши частичный аналог.
     
  3. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    Работает до-поры-до-времени.
     
  4. Aids

    Aids New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2007
    Сообщения:
    275
    Я имею ввиду запустил и удалил файл. А он остался в оперативке.
     
  5. Aids

    Aids New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2007
    Сообщения:
    275
    Aspire Калькулятор у меня работал просто замечательно. С диска ему ничего не надо было по видимому читать :)
     
  6. Dian

    Dian Member

    Публикаций:
    0
    Регистрация:
    19 июн 2008
    Сообщения:
    222
    Видимо винда просто не пыталась его свопить. А так результат не предсказуем.

    Дальше ещё дот нет будет - вот тот точно без файла - хрен
     
  7. tylerdurden

    tylerdurden New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    322
    подсказка - юзай copy on write luke :)
     
  8. blast

    blast New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2008
    Сообщения:
    170
    Можно найти нужный хэндл файл (ZwQuerySystemInformation(SystemHandleInformation)) скопировать его себе с другими атрибутами и удалить файл.
    Скопировать хэндл файла как я описал выше с атрибутами DUPLICATE_CLOSE_SOURCE, и закрыть все хэндлы файла, либо при создании процесса создавать 2 секции одну привязанную к файлу вторую нет и с одной скопировать образ в другую ну и передать хэндл воторой секции в ZwCreateProcess только при создании процесса вручную естественно нужно будет создать стэкт, основной поток, проинформировать csrss иначе нечего не будет работать, а вообще я не в курсе создастся ли процесс из секции не привязанной к файлу нужно пробовать.
     
  9. Aids

    Aids New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2007
    Сообщения:
    275
    blast спасибо. Попробую то что вы посоветовали
     
  10. 6arrep

    6arrep New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2006
    Сообщения:
    92
    Адрес:
    London
    Dian
    а разве при откате свопа читается оригинал файла на диске?
    Думаю при этом восстанавливаются сохраненные раннее из оперативки страницы памяти, куда включены секции как кода так и данных.
    А запуск из файла происходит по параметрам шапки файла а не как при редактировании, где ввиду импортов и асоциаций рабочий размер памяти процесса может варьировать.
     
  11. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Когда файл проецируется только на чтение (а так и бывает при запуске процесса) в свопе места не выделяется. По мере обращения возникают ошибки страниц и нужные страницы считываются с диска прямо из нужного файла. Когда системе требуются свободные страницы, они просто уничтожаются и при следующем обращении снова возникает ошибка страницы и снова страница считывается с оригинала на диске в файле.
    Если удалишь файл - неоткуда будет читать страницы и все свалится как карточный домик.
    Могу предложить два варианта:
    1) Заблокировать в памяти весь образ, чтобы страницы не выгружались с физической памяти. См. VirtualLock (user-mode), MmProbeAndLockPages (kernel-mode)
    2) Весь образ запротектить на PAGE_READWRITE (или PAGE_WRITECOPY, насчет этого не уверен), тогда винда выделит частные копии страниц, которые будет свопить в файл подкачки, а оригинал на диске больше не будут трогать.
     
  12. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    пысы. тема ушла в вин32
     
  13. nop_

    nop_ New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2007
    Сообщения:
    61
    См. SWAPRUN link option