Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2003.03.03;
Скачать: [xml.tar.bz2];

Вниз

Можно ли как нибудь из своей программы менять ее же 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 вся ветка

Форум: "WinAPI";
Текущий архив: 2003.03.03;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.69 MB
Время: 0.062 c
1-5479
Dr.Abolo
2003-02-19 12:35
2003.03.03
перехват клавиши


1-5517
Кило
2003-02-20 16:32
2003.03.03
Как передать в Rave Report картинку не из Базы Данных ?


8-5656
Romeo
2002-11-18 10:45
2003.03.03
Библиотека MKL


14-5852
Oleg_Gashev
2003-02-14 02:37
2003.03.03
Скриншот почтового ящика Буша


14-5781
VictorT
2003-02-12 14:14
2003.03.03
Правописание.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский