Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.03.03;
Скачать: CL | DM;

Вниз

Можно ли как нибудь из своей программы менять ее же exe?   Найти похожие ветки 

 
TankMan ©   (2002-11-25 21:22) [0]

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


 
Cobalt ©   (2002-11-25 22:03) [1]

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

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


 
TankMan ©   (2002-11-25 22:05) [2]

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


 
ION T ©   (2002-11-25 22:40) [3]

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

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


 
Cobalt ©   (2002-11-25 22:59) [4]

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

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


 
TankMan ©   (2002-11-25 23:10) [5]

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


 
Pat ©   (2002-11-25 23:37) [6]

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


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

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


 
TankMan ©   (2002-11-27 01:15) [8]

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


 
paul_shmakov ©   (2002-11-27 17:09) [9]

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


 
Digitman ©   (2002-11-27 17:36) [10]

>paul_shmakov

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


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

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


 
paul_shmakov ©   (2002-11-30 02:39) [12]

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


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

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

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


 
Arkan ©   (2002-11-30 15:45) [13]

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


 
Fantasist ©   (2002-11-30 23:07) [14]


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


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


 
Digitman ©   (2002-12-01 14:18) [15]

>paul_shmakov

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

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

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

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

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


 
paul_shmakov ©   (2002-12-02 21:20) [16]

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

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

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


 
TankMan ©   (2002-12-03 01:06) [17]

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


 
Digitman ©   (2002-12-03 11:04) [18]

>paul_shmakov


> осуществлять перехват вызова ExitProcess и код трюка выполнять
> из этого перехватчика


Согласен. Наилучший вариант, хоть и не самый простой.
Единственное, что может помешать - мультиэкземплярность процесса. Но и это в принципе решаемо.


 
paul_shmakov ©   (2002-12-03 14:58) [19]

2 TankMan:
"Так всетаки можно его удалить или нет?"
а то как же!

"Я той ветки, про которую вы говорите, не видел, и не в курсе тех разговоров...насколько я понял из текста, если решили вопрос о закрытии mmf, то значит и файл можно удалить, может кто пример покажет, или всетаки тогда не только эта проблема была?"
у меня той ветки тоже не сохранилось.. но пример этого кода можно найти без проблем - это ни какой-нить секрет.
на самом деле, вариантов самоудаления (без необходимости перезагрузки) достаточно много.
1) этот вариант (под xp не работает)
2) создавать и запускать bat-файл, который удаляет exe-шник после завершения процесса
3) копировать свой же exe-шник во временный файл, открывать этот файл с флагом FILE_FLAG_DELETE_ON_CLOSE (что удалит этот файл после его закрытия) и доступом FILE_SHARE_READ, потом запускать процесс из этого временного файла, сообщая ему через командную строку, что его задача - удаление первого экземпляра. после этого первый экземпляр завершается; второй ждет завершения первого и удаляет его файл. после этого завершается сам, а операционная система определив, что все ссылки на файл закрыты удаляет и его файл.
4) и т.п.


 
TankMan ©   (2002-12-04 01:41) [20]

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


 
Fantasist ©   (2002-12-04 07:16) [21]


> хмм.. лучше было бы конечно ту ветку найти


Не находиться она, к большому сожалению. Или ее где-то в архивах надо рыть?


> файл освободится. т.е. файл можно будет удалить.


Ага. Интересно. Но вот мне известно утверждение, что система при нехватке памяти выгружает код неиспользуеммых процессов, а потом, при необходимости, снова его подгружает с диска. И что, система не рушиться?



> все оказалось просто - его значение под nt/2k всегда равно
> 4


Обалдеть! :) И как это, интересно, выяснилось?


 
paul_shmakov ©   (2002-12-04 14:41) [22]

2 TankMan:
это вполне реальное решение, практически идеинтично пункту 3) в моем предыдущем постинге. тот пункт, правда, лучше. по той причине, что временный файл удаляется сразу после удаления основного, а вот dll удалится только тогда, когда она из всех процессов выгрузится.

2 Fantasist:
"Ага. Интересно. Но вот мне известно утверждение, что система при нехватке памяти выгружает код неиспользуеммых процессов, а потом, при необходимости, снова его подгружает с диска. И что, система не рушиться?"

все верно, система по своему усмотрению свопит содержимое оперативной памяти в файл подкачки. (правда, с модулями (exe, dll и т.д.) она поступает несколько иначе - в качестве файла подкачки используется файл этого модуля [конечно при условии, что вы не правили в рантайме код этого модуля - тогда эти изменения будут скидываться в общий файл подкачки]).
но нас все это не волнует абсолютно! :) это внутренние механизмы операционной системы работы с памятью. и это никак не сказывается на том, о чем мы говорим.
мы систему нигде не обманываем - мы явно с помощью winapi выгружаем модуль.

"> все оказалось просто - его значение под nt/2k всегда равно
> 4
Обалдеть! :) И как это, интересно, выяснилось?"


ну автора этой информации я сейчас не смогу назвать - не помню. но можно и самостоятельно этот факт отследить - скачайте processexplorer от Марка Руссиновича (www.sysinternals.com), посмотрите у всех процессов список хэндлов. и увидите, что с номером 4 всегда section (memory mapped file) с типом IMAGE и размером, равным размеру образа из PE-заголовка. можно сделать некоторые выводы, которые подтверждаются тестовыми приложениями.


 
TankMan ©   (2002-12-09 14:28) [23]

Так никто мне ничем не поможет (в плане примера)?


 
alex134 ©   (2002-12-09 18:02) [24]

Поведай нам зачем это нужно ?


 
TankMan ©   (2002-12-09 20:31) [25]

Зачем это нужно? вобщем прочитай мой первый вопрос, как можно изменить свой же ехе из самого себя... мне это нужно, чтобы записывать туда определенные параметры - метод защиты от перенастройки, другими людьми...не получающими доступ к настройкам через саму программу.


 
paul_shmakov ©   (2002-12-10 14:52) [26]

2 TankMan:
"метод защиты от перенастройки, другими людьми..."
храните свои настройки в зашифрованном виде в отдельном файле или в реестре.


 
TankMan ©   (2002-12-13 23:51) [27]

>>paul_shmakov
Я думал над этим воросом... отдельный файл можно удалить... зашифровать его не проблема, расшифровать ОЧЕНЬ большая проблема, но вот его можно просто удалить... и списать если что на случайность.... а вот с данными зашифрованными в самом ехе, так не поступишь...я ж не просто так спрашиваю...


 
Zmey_Gorinich   (2002-12-20 19:39) [28]

Предлагаю воспользоваться функциями для работы с ресурсами. В NT возможно редактировать собственные ресурсы.(если я не ошибаюсь.. я такое делал года 4 назад).


 
FUF   (2002-12-22 21:26) [29]

Можно создать вторую программу, которая открывает изменённую программу и забивает её предыдущую версию...


 
Карлсон ©   (2002-12-22 22:43) [30]

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


 
[NIKEL] ©   (2002-12-22 23:11) [31]

не ну на самом деле, если надо, то под NT можно править свои же ресурсы BeginUpdateRecource, UpdateRecource, EndUpdateRecource
и все! под 9х такое не прокатит (с этими функциями) но там можно по другому - смотреть на planet-source-code.com


 
TankMan ©   (2002-12-27 05:52) [32]

А мне как раз и нужно, чтобы была универсальноесть - т.е. работала и под 9x и под NT... и всетаки... что нет тут специалистов по хукам? Или они все настолько ленивые, что не могут помочь человеку?... или занятЫе?


 
ION T ©   (2002-12-27 11:29) [33]

/А мне как раз и нужно, чтобы была универсальноесть - т.е. работала и под 9x и под NT... и всетаки... что нет тут специалистов по
хукам?/
говорили, балакали - сіли й заплакали:)

ЗЫ: почему под Мозиллой не пашут кнопочки справа?


 
Dr.Dron   (2003-01-16 09:12) [34]

Вставили дискетку с программой, запустили...
и вынули дискетку... программа работает...
т.е. файл на диске ей уже не требуется.
(Во временный каталог она не копируется проверял)
Есть пища для размышлений?


 
ZeroDivide ©   (2003-01-16 16:14) [35]

Вообще говоря я написал это в "потрепаться", но думаю что ошибся
http://www.delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1042213825&n=3


 
Anatoly Podgoretsky ©   (2003-01-16 16:19) [36]

Dr.Dron (16.01.03 09:12)
Есть теперь попробуй его поменять, конечно не вынимая дискету и не перенося ее на другой компьютер.


 
Набережных С.   (2003-01-16 17:48) [37]

>Dr.Dron (16.01.03 09:12)
Есть пища для размышлений?

Не особенно. С дискеты файл копируется в файл подкачки и уже оттуда запускается. Попробуй:
Вставь дискету, запусти с нее приложение, закрой его, снова запусти. Есть разница?



Страницы: 1 вся ветка

Текущий архив: 2003.03.03;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.021 c
3-5384
Tornado
2003-02-12 07:55
2003.03.03
Мастера, подскажите приемлимое решение, плиз


14-5789
Manulo
2003-02-12 19:26
2003.03.03
Эххх...


4-5907
Cosmic
2002-12-04 23:26
2003.03.03
SHBrowseForFolder


3-5379
serg1977
2003-02-11 16:08
2003.03.03
Создание БД MS ACCESS


3-5466
roadrunner
2003-02-12 16:38
2003.03.03
Еще вопрос про Адо