Запись в файл во время его выполнения

Тема в разделе "WASM.WIN32", создана пользователем vitek1, 4 ноя 2007.

  1. vitek1

    vitek1 New Member

    Публикаций:
    0
    Регистрация:
    4 ноя 2007
    Сообщения:
    4
    Интересует вопрос: как изменить ресурсы запущенного приложения (самого себя).
    Перекопал много инфы, везде говорят, что нельзя. Поэтому спрашиваю у истинных специалистов (ведь нет ничего невозможного). И еще: сильно не бейте, программирую на Delphi, так что надо, чтобы предложенный вариант там можно было реализовать.
     
  2. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    http://wasm.ru/article.php?article=lockfileswork
     
  3. vitek1

    vitek1 New Member

    Публикаций:
    0
    Регистрация:
    4 ноя 2007
    Сообщения:
    4
    Мне нужна запись, поэтому прямое обращение не подходит (я смогу записать только в тех пределах, которые уже занимает файл. Я же не смогу дописать еще несколько кластеров?). Вариант с драйвером то же не подходит, т.к. программа должна быть самодостаточной (один исполняемый файл), а первый способ я так понял приведет к ошибкам (если честно не особо понял сам метод)
     
  4. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    ..какие ресурсы, уточните.
    если это к примеру константа(даже массивная типо битмапы), то проще тебе сделать копию йиё, память выделив уже аллоком, и изменять.
    а если это процедура, к примеру, и она вся динамическая, то круто сделать буффер, в буффер загнать шеллкод,
    а в шеллкоде код типа
    Код (Text):
    1.  пыщ пыщ
    2.  йёки матаки
    3.  саки мана, ки
    4.  ;в общем твой код
    5.  ret
    вот и типо звать его
    Код (Text):
    1.  pProc{..:pointer}:=@Buffer[0]{..:array[0..SHELLCODE_SIZE};
    2.  asm
    3.   push param1
    4.   push param2
    5.   call pProc
    6.  end;
    ----------------------------
    ..угу. оесли тебе надо на винте себя переделать, то создавай копию, запускай её с опр. параметрами, в которых будет ясно расположение цели, в которой и будет фикситься всёчонадо..
    ..но вряд ле ты это имел в виду..
    кстате, если модифицируемый код несложный, то подумай о vbs! прикольная штучка для ратов централизованных ))
     
  5. MagnumGT

    MagnumGT New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    122
    Comer_
    Брат, переходи на русский
    тебя сложно читать )))))


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

    Либо весь код ехе писать базонезависимым, что на Делфи крайне затруднительно.

    Более того, человек довольно поверхностно представляет, как это, обойти и закрыть хэндлы, или написать драйвер.

    Я думаю, самым простым решением было бы - сделать копию себя, но с измененными ресурсами, а при завершении просто запустить батник, который заменит оригинал и удалит себя. Во первых никакого гемора с файерами ( ведь так просто никто исполнить кодес в АП чужого процесса не даст), а во вторых - крайне просто реализовать.
     
  6. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    К тому же, чтобы изменить файл на диске юзая твой метод, нужно после передачи управления на шелкодес тушить процесс, а потом заново его запускать.
    не ну это кагбе само собою, даже писать стыдно было =//

    Я думаю, самым простым решением было бы - сделать копию себя, но с измененными ресурсами, а при завершении просто запустить батник, который заменит оригинал и удалит себя.
    ну тогда яб сказал рациональней запускать эту копию с параметрами типо:
    сегос2.ехе -пщпщ "Ц:\Виннт\сегос.ехе"
    ..угу, а та, имея параметр "-пщпщ" сделает просто while(!DeleteFile(Param[2])){Sleep(10)};

    думаю и для нубеса такой вореянт сойдёт ;)

    /*now listening*/: Roxette -- Crash, Boom, Bang..
     
  7. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    /OFFTOP

    Спасибо за исходник! Нужно будет взять на вооружение )))
     
  8. vitek1

    vitek1 New Member

    Публикаций:
    0
    Регистрация:
    4 ноя 2007
    Сообщения:
    4
    Прочитал варианты, уточню задачу:
    должен быть один exe'шник, который бы сам в себе хранил и изменял информацию (например, настройки программы) ДАЖЕ КОГДА У ПОЛЬЗОВАТЕЛЯ ПОЛНЫЕ ОГРАНИЧЕНИЯ (запись во все места, реестр временные папки и пр.). Соответственно, создать копию, переписать, удалить, переименовать не подходит.
    Нашел очень неплохой вариант: создаем обертку, в ее ресурсы помещаем наше приложение и настройки. При запуске, обертка извлекает exe (главное прил.) из ресурсов в поток, запускает какое-нибудь стандартное виндовое приложение (cmd.exe), изменяет память его процесса на сохраненное в потоке, само закрывается, а оставшееся выполняться главное прил. уже может модифицировать секцию ресурсов обертки.
    Одно НО: все файерволы на WriteProcessMemory нещадно ругаются, а мне нужно гладко, т.к. если обычный пользователь увидит такое сообщение, он выкмнет мое приложение в урну.
    Уважаемые гуру, за месяц я так решения и не нашел.
     
  9. k3internal

    k3internal New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2007
    Сообщения:
    607
    vitek1
    Для того, что бы изменить файл, тебе нужен для начала его хэндл. Где искать хэндл файлов открытых и исполняющихся я хз. Судя по сорца Нэббета, хэндла файла нету, ибо после отмапливания он закрывается. Мап ясен хрен через механизмы фс связан с файлом. Исходя из всего этого, файл запущенный на выполнение ты можешь открыть, читать и переименовывать. Разве тебе этого недостаточно ? Ты можешь открыть сам себя в эксклюзиве, сделать изменённую копию, перед собственным завершением вызвать 2й изменённый ехек с параметром, и второй ехек удалит первый. Думаю достаточно.
     
  10. vitek1

    vitek1 New Member

    Публикаций:
    0
    Регистрация:
    4 ноя 2007
    Сообщения:
    4
    Нельзя сделать копию, т.к. создать новый файл нельзя - запрещено правами
     
  11. ntldr

    ntldr New Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    125
    vitek1
    А ини файлы юзать нельзя из моральных соображений? Ведь можно сделать простые и понятные ини файлы, вместо горы всякой кривизны которую тут предлагают.
     
  12. k3internal

    k3internal New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2007
    Сообщения:
    607
    Так наруш правила!
     
  13. k3internal

    k3internal New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2007
    Сообщения:
    607
    И вапще, ресурсы можно в отдельных файлах хранить