Текущий архив: 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.54 MB
Время: 0.008 c