Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Можно ли как нибудь из своей программы менять ее же exe? [D5, Win95/98, Win2k]


Страницы:   1 2

TankMan ©   (2002-11-25 21:22:00) 

У меня проблема, нужно записать из самой программы в момент ее работы, строку в ехе файл, ее же самой, может, это как-то возможно? Ведь программа, насколько я знаю, всеравно все в память загружается, и что мешает мне ее исправить? Вообщем может подскажет кто, как это можно реализовать (елси возможно)?


TankMan   (2002-12-03 01:06:00) [21]

Так всетаки можно его удалить или нет? Я той ветки, про которую вы говорите, не видел, и не в курсе тех разговоров...насколько я понял из текста, если решили вопрос о закрытии mmf, то значит и файл можно удалить, может кто пример покажет, или всетаки тогда не только эта проблема была?


paul_shmakov   (2002-12-02 21:20:00) [22]

2 Digitman:
не, возражать не буду :) если я не ошибаюсь, то мы тогда пришли к выводу, что в случае использования vcl и сомнений, что все пройдет нормально (в смысле деинициализация), лучше осуществлять перехват вызова ExitProcess и код трюка выполнять из этого перехватчика.

2 Fantasist:
"И как это примерно (идея, в смысле)?"
хмм.. лучше было бы конечно ту ветку найти, потому как много мы тогда исписали. смысл в том, что под nt/2k единственное, что мешает удалить exe-шник - это memory mapped file, который создается из самого exe-шника. стоит хэндл на этот memory mapped file закрыть, и модуль выгрузится из адресного пространства процесса, файл освободится. т.е. файл можно будет удалить.
вот только вопрос - как найти хэндл этого mmf? все оказалось просто - его значение под nt/2k всегда равно 4.

под win9x аналогичная ситуация - там используется FreeLibrary(GetModuleHandle(NULL)).


Digitman   (2002-12-01 14:18:00) [23]

>paul_shmakov

Да, о том речь идет.
Давай пока не будем про ХР. Разумеется, этот трюк был расчитан на ОС, отличные от ХР.

>vcl там ничему особо и не мешало

Мне вот помнится - мешала.
Простейшая ситуация вроде бы такова:

program SelfModifier;
...
begin
Application.Initialize;
.. конструкторы форм/модулей ....
Application.Run;
.. код "трюка" ...
end;

Поскольку код "трюка" выполняется до кода неявной штатной деинициализации VCL (до кода деинциализации дело попросту не доходит), здесь и возникают проблемы.
Возрази, если я чего-то упускаю из виду.


Fantasist   (2002-11-30 23:07:00) [24]


> месяцев назад обсуждали, используемый для самоудаления exe-шника?
> (ветка называлась вроде "дескриптор со значением 4" или
> что-то в этом духе)


И как это примерно (идея, в смысле)?


Arkan   (2002-11-30 15:45:00) [25]

народ, а кто-нить может кинуть на мыло этот пример с самоудалением экзешника??? или линк!


paul_shmakov   (2002-11-30 02:39:00) [26]

2 Digitman:
"Да уж ты не загибай уж)
Можно, все можно)
Только VCL сильно мешает этому
Тот, кто знает, кто кому и почему мешает, тот решил эту проблему))))))"


насколько я понимаю, речь идет о том же методе, который мы с вами несколько месяцев назад обсуждали, используемый для самоудаления exe-шника? (ветка называлась вроде "дескриптор со значением 4" или что-то в этом духе)

если так, то под xp это уже не работает :(

p.s. а vcl там ничему особо и не мешало... :)


TankMan   (2002-11-27 23:26:00) [27]

:))) мне стало намного легче :))


Digitman   (2002-11-27 17:36:00) [28]

>paul_shmakov

Да уж ты не загибай уж)
Можно, все можно)
Только VCL сильно мешает этому
Тот, кто знает, кто кому и почему мешает, тот решил эту проблему))))))


paul_shmakov   (2002-11-27 17:09:00) [29]

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


TankMan   (2002-11-27 01:15:00) [30]

Так ктонибудь ответит на вопрос?


TankMan   (2002-11-26 00:09:00) [31]

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


Pat   (2002-11-25 23:37:00) [32]

http://src.fitkursk.ru/articles/art0000051.asp


TankMan   (2002-11-25 23:10:00) [33]

И в итоге...?.


Cobalt   (2002-11-25 22:59:00) [34]

Щас перезагрузился в Вин98 - такая фича не прокатила.

НЕТ, вы не поняли меня. Я имел в виду файл Winamp.exe (во время его работы)
В ВинХР - файл программы (я так понимаю по умолчанию) не держиться все время открытым, а вот в других ОСях - это уже надо экспериментировать...


ION T   (2002-11-25 22:40:00) [35]

где смогли программисты Мелкомягкого? Нульсофтовый ВинАмп сначала закрывает файл, переименовывает, загружает и игрет с места где закончил (это заметно при использовании амповых фейдеров или файл-треккеров), точно так же как и когда пишет теги в файл...

> всеравно все в память загружается
В памяти ты и можешь почти всё преспокойно править, но на диск оно не сохранится...


TankMan   (2002-11-25 22:05:00) [36]

Раз программисты Мелкомягкого смогли, значит можно... значит можно, но КАК? Может кто знает?


Cobalt   (2002-11-25 22:03:00) [37]

Во время работы программы её файл открывается на чтение, и никакая запись в этот файл не разрешена.

Это как бы раньше было, теперь (в ХР) - играет ВинАмп - взял, и переименовал файл - легко.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо