Интересует вопрос: как изменить ресурсы запущенного приложения (самого себя). Перекопал много инфы, везде говорят, что нельзя. Поэтому спрашиваю у истинных специалистов (ведь нет ничего невозможного). И еще: сильно не бейте, программирую на Delphi, так что надо, чтобы предложенный вариант там можно было реализовать.
Мне нужна запись, поэтому прямое обращение не подходит (я смогу записать только в тех пределах, которые уже занимает файл. Я же не смогу дописать еще несколько кластеров?). Вариант с драйвером то же не подходит, т.к. программа должна быть самодостаточной (один исполняемый файл), а первый способ я так понял приведет к ошибкам (если честно не особо понял сам метод)
..какие ресурсы, уточните. если это к примеру константа(даже массивная типо битмапы), то проще тебе сделать копию йиё, память выделив уже аллоком, и изменять. а если это процедура, к примеру, и она вся динамическая, то круто сделать буффер, в буффер загнать шеллкод, а в шеллкоде код типа Код (Text): пыщ пыщ йёки матаки саки мана, ки ;в общем твой код ret вот и типо звать его Код (Text): pProc{..:pointer}:=@Buffer[0]{..:array[0..SHELLCODE_SIZE}; asm push param1 push param2 call pProc end; ---------------------------- ..угу. оесли тебе надо на винте себя переделать, то создавай копию, запускай её с опр. параметрами, в которых будет ясно расположение цели, в которой и будет фикситься всёчонадо.. ..но вряд ле ты это имел в виду.. кстате, если модифицируемый код несложный, то подумай о vbs! прикольная штучка для ратов централизованных ))
Comer_ Брат, переходи на русский тебя сложно читать ))))) К тому же, чтобы изменить файл на диске юзая твой метод, нужно после передачи управления на шелкодес тушить процесс, а потом заново его запускать. Либо весь код ехе писать базонезависимым, что на Делфи крайне затруднительно. Более того, человек довольно поверхностно представляет, как это, обойти и закрыть хэндлы, или написать драйвер. Я думаю, самым простым решением было бы - сделать копию себя, но с измененными ресурсами, а при завершении просто запустить батник, который заменит оригинал и удалит себя. Во первых никакого гемора с файерами ( ведь так просто никто исполнить кодес в АП чужого процесса не даст), а во вторых - крайне просто реализовать.
К тому же, чтобы изменить файл на диске юзая твой метод, нужно после передачи управления на шелкодес тушить процесс, а потом заново его запускать. не ну это кагбе само собою, даже писать стыдно было =// Я думаю, самым простым решением было бы - сделать копию себя, но с измененными ресурсами, а при завершении просто запустить батник, который заменит оригинал и удалит себя. ну тогда яб сказал рациональней запускать эту копию с параметрами типо: сегос2.ехе -пщпщ "Ц:\Виннт\сегос.ехе" ..угу, а та, имея параметр "-пщпщ" сделает просто while(!DeleteFile(Param[2])){Sleep(10)}; думаю и для нубеса такой вореянт сойдёт /*now listening*/: Roxette -- Crash, Boom, Bang..
Прочитал варианты, уточню задачу: должен быть один exe'шник, который бы сам в себе хранил и изменял информацию (например, настройки программы) ДАЖЕ КОГДА У ПОЛЬЗОВАТЕЛЯ ПОЛНЫЕ ОГРАНИЧЕНИЯ (запись во все места, реестр временные папки и пр.). Соответственно, создать копию, переписать, удалить, переименовать не подходит. Нашел очень неплохой вариант: создаем обертку, в ее ресурсы помещаем наше приложение и настройки. При запуске, обертка извлекает exe (главное прил.) из ресурсов в поток, запускает какое-нибудь стандартное виндовое приложение (cmd.exe), изменяет память его процесса на сохраненное в потоке, само закрывается, а оставшееся выполняться главное прил. уже может модифицировать секцию ресурсов обертки. Одно НО: все файерволы на WriteProcessMemory нещадно ругаются, а мне нужно гладко, т.к. если обычный пользователь увидит такое сообщение, он выкмнет мое приложение в урну. Уважаемые гуру, за месяц я так решения и не нашел.
vitek1 Для того, что бы изменить файл, тебе нужен для начала его хэндл. Где искать хэндл файлов открытых и исполняющихся я хз. Судя по сорца Нэббета, хэндла файла нету, ибо после отмапливания он закрывается. Мап ясен хрен через механизмы фс связан с файлом. Исходя из всего этого, файл запущенный на выполнение ты можешь открыть, читать и переименовывать. Разве тебе этого недостаточно ? Ты можешь открыть сам себя в эксклюзиве, сделать изменённую копию, перед собственным завершением вызвать 2й изменённый ехек с параметром, и второй ехек удалит первый. Думаю достаточно.
vitek1 А ини файлы юзать нельзя из моральных соображений? Ведь можно сделать простые и понятные ини файлы, вместо горы всякой кривизны которую тут предлагают.