Что нового

[Новая функция] Запись в саму себя

  • Автор темы VitAl2013
  • Дата начала
V

VitAl2013

Гость
Берём скрипт, компилируем в ехе. При работе такого ехе он сохраняет свои настройки (папки по умолчанию, язык интерфейса и т.д. - можно много чего туда полезного положить) внутри себя. В идеале надо научить его понимать внутреннюю структуру самого себя, чтоб можно было писать ссылки ниже ехе, например "...\script.exe\include\defaults.ini". Может понадобиться сделать другой пакер в exe для этого, а то может внутренняя иерархия сейчас хаотична и не приспособлена для таких манипуляций.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 175
Репутация
2 331
Написано вроде много, а понять не удалось. Конкретнее и попроще можно - что именно требуется?
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1 541
Репутация
326
Метод записи "в себя" противоречит операционной системе. Т.е. пока программа выполняется, ты ее даже скопировать не сможешь! (Бывали случаи когда даже открытая папка не копировалась :D(но это скорее всего глюк))
 

SyDr

Сидра
Сообщения
651
Репутация
158
CreatoR сказал(а):
Написано вроде много, а понять не удалось. Конкретнее и попроще можно - что именно требуется?
А у меня немного проявляются экстрасенсорные возможности :smile:
Человек хочет иметь возможность хранить данные, не создавая никаких файлов и не делая никаких записей в реестре. (Имеется в виду, что даже после завершения работы скрипта :smile:)
Ни одна из известных мне программ так не умела.

Могу только предложить хранить данные в отдельных потоках. Будет весело ;D
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1 541
Репутация
326
SyDr [?]
А у меня немного проявляются экстрасенсорные возможности
Тогда и у меня тоже. Грубо говоря человек хочет сделать файл-архив. В который будут включены любые файлы, и будет включена возможность поддержки путей типа:
VitAl2013 [?]
script.exe\include\defaults.ini
Ой да не говори :D
 
Автор
V

VitAl2013

Гость
Про потоки и тем более хранение в них данных это я пока не понял.

Ближе всех приблизился к желаемому Medic84
...сделать файл-архив. В который будут включены любые файлы, и будет включена возможность поддержки путей...
Объясню по другому:
1. На выходе получаем файл proga.exe
2. Он по сути архив. В котором скрипт (пусть script.au3), интерпретатор и ресурсы.
3. Скрипт выполняет свою работу и предположительно находиться в оперативной памяти. Считывает, изменяет файлы ресурсы.

Любой (современный) архиватор умеет дописывать внутрь своих архивов информацию, стирать и изменять. Вопрос как он это делает, раскрывает всё в темп папки или всё крутит в оперативной памяти это не так важно. Важно что может.

Что такое exe сам по себе. Из того что я знаю программа перед преобразованием в exe проходит 2 стадии компилирования и линковки, наружу торчит только хвост функции main. По сути это архив, только данные не архивируются, а компилируются. А что если вмешаться в принцип создания exe файла? Или, например, на основе 7zip архиватора сделать sxf архив (ну так упрощённо, можно более изощрённо) при запуске которого бы происходило раскрытие (в темпы или в оперативу) файла скрипта и файла интерпретатора с последующим запуском, затем происходило бы использование изначального exe как архива. Не помню какой архиватор так мог, но оттуда я и взял пути ниже *.exe уровня. Он так мог в своём клиенте. Пишешь ему в строке такой путь, а он открывает его как будто это папка. Да к стати, может же винда работать с зипами и жатыми дисками как с обычными папками? - может. Ну и вот, а почему бы не научить autoit работать со своими exe-шниками также?

На счёт скепсиса. Я видел виртуальные винчестеры хранимые в оперативной памяти. По моему это задача похлеще.

И вообще как-то не конструктивно. Складывается впечатление, что лишь бы унизить (типа вот выдумщик ещё один, нука мы его опустим), а не понять и, например, высказать свои "почему нет в популярном изложении".
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 175
Репутация
2 331
VitAl2013 [?]
Вопрос как он это делает, раскрывает всё в темп папки или всё крутит в оперативной памяти это не так важно. Важно что может.
Делается это механизмами упаковки и распаковки данных, и не в память а во временные папки. В нашем случае можно использовать консольную версию 7zip.

почему бы не научить autoit работать со своими exe-шниками также?
Также это как, обращаться к сжатому архиву как к папке? ну насколько мне известно там тоже происходит предварительная распаковка, а мы уже видим виртуальную оболочку результата. И научить AutoIt это делать можно, главное знать что конкретно требуется.

И вообще как-то не конструктивно. Складывается впечатление, что лишь бы унизить (типа вот выдумщик ещё один, нука мы его опустим)
И с какого перепугу приходит такое впечатление? Никто никого тут не собирается унижать/опускать, просто все пытаются понять в чём затея. А скептизм как мне кажется, проявляется от недостатка опыта в AutoIt :whistle:
 
Автор
V

VitAl2013

Гость
главное знать что конкретно требуется
Прям не знаю как конкретней ещё... там есть какое-нибудь варианты? 50на50 или там звонок другу, помощь зала? :-[

Ну попробую ещё раз. Примерный текст скрипта (@ScriptName.au3).

Код:
Вложить при компиляции: файл.ini в папку @ScriptName.exe\ресурсы\
...
Считать значение параметра №1 из @ScriptFullPath\@ScriptName.exe\ресурсы\файл.ini
...
Записать значение параметра №2 в @ScriptFullPath\@ScriptName.exe\ресурсы\файл.ini
И с какого перепугу приходит такое впечатление?
Значит я ошибся
 

SyDr

Сидра
Сообщения
651
Репутация
158
Назови хоть одну программу, которая умеет так делать.
Ни один архиватор никогда ничего не писал сам в себя. Только в отдельные архивы.
В любом случае понадобиться промежуточный файл. Это устраивает?

Ещё раз про потоки: практически идеальный вариант. Минусы: необходимость использования файловой системы NTFS. Архив придёться создавать винраром.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 175
Репутация
2 331
VitAl2013 [?]
Прям не знаю как конкретней ещё... там есть какое-нибудь варианты? 50на50 или там звонок другу, помощь зала?
А вот сарказм некчему.

Ну попробую ещё раз. Примерный текст скрипта (@ScriptName.au3).
Хорошо, чуть позже выложу exe'шник который это выполняет (рядом будут и исходники), если меня конечно не подведёт теория :smile:
 

SyDr

Сидра
Сообщения
651
Репутация
158
Написал скриптик. Работает следующим образом:
Распаковывает файлы Script.au3 и Script.dat в временную папку.
Запускает на выполнение Script.au3 с параметрами, переданными основному скрипту и рабочей папкой основного файла (один exe-файл).
Дожидается окончания работы Script.au3
Достаёт из себя файлы, необходимые для компиляции скрипта.
Компилирует скрипт пересборки. ;)
Запускает его и завершает свою работу.
Скрипт пересборки удаляет основной файл.
Компилирует на его место файл с изменённым Script.dat
Запускает скрипт очистки и завершает свою работу.
Скрипт очистки удаляет всё лишнее из временной папки.

Громоздко и долго, но результат работает.
Скомпилированный скрипт, добавлющий в Script.dat строчку "Line" весит при этом чуть больше 1 Мб.
Подойдёт такой вариант?

Только что придумал ещё один вариант: Rarjpeg. Только теперь он будет называться 7zipexe (Ну или архив какого-либо другого типа). Вроде бы полёт нормальный и скрипт не ругается на дописанный в себя архив. Правда, опять таки, нужен промежуточный файл, который это дело будет пересобирать. Зато в этом случае не надо заново компилировать скрипт.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 175
Репутация
2 331
SyDr
А как он компилирует? в архив помещён сам [Программа для декомпиляции]? :-\
 
Автор
V

VitAl2013

Гость
SyDr
Не вижу ссылок. :blink: Это глюк?
 

SyDr

Сидра
Сообщения
651
Репутация
158
CreatoR [?]
А как он компилирует? в архив помещён сам [Программа для декомпиляции]?
Да ;) Он, бинарник для компиляции, upx, исходный код "автономного комплекса", начальный скрипт и файл с настройками. В любом случае, нужна как минимум одна компиляция. У меня две. Режил пожертвовать скоростью ради размера ;).


VitAl2013 [?]
Не вижу ссылок.
Это глюк?
Пример в архиве. Распаковать 7zExe.exe как архив.

Recycle.au3
Код:
DirRemove(@WorkingDir, 1)

StandAloneRebuild.au3
Код:
$sCompileTo = $CMDLineRaw
$sWorkindDir = @WorkingDir & "\"
FileDelete($sCompileTo)
RunWait($sWorkindDir & 'Aut2exe.exe /in "' & $sWorkindDir & 'StandAloneComplex.au3" /out "' & $sCompileTo & '"', $sWorkindDir)
Exit Run($sCompileTo & ' /ErrorStdOut /AutoIt3ExecuteScript "' & $sWorkindDir & 'Recycle.au3"', $sWorkindDir)

StandAloneComplex.au3
Код:
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Compression=4
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
If Not @Compiled Then Exit
$sWorkindDir = @WorkingDir

$sTempWDir = _TempFile(@TempDir, '~', '.autoit', 7) & '\'
DirCreate($sTempWDir)

FileInstall('Script.au3', $sTempWDir & 'Script.au3')
FileInstall('Script.dat', $sTempWDir & 'Script.dat')
RunWait(@ScriptFullPath & ' /ErrorStdOut /AutoIt3ExecuteScript "' & $sTempWDir & 'Script.au3" ' & $CMDLineRaw, $sTempWDir)

FileInstall('Aut2exe.exe', $sTempWDir & 'Aut2exe.exe')
FileInstall('AutoItSC.bin', $sTempWDir & 'AutoItSC.bin')
FileInstall('StandAloneRebuild.au3', $sTempWDir & 'StandAloneRebuild.au3')
FileInstall('StandAloneComplex.au3', $sTempWDir & 'StandAloneComplex.au3')
FileInstall('upx.exe', $sTempWDir & 'upx.exe')
FileInstall('Recycle.au3', $sTempWDir & 'Recycle.au3')
RunWait($sTempWDir & 'Aut2exe.exe /in "' & $sTempWDir & 'StandAloneRebuild.au3" /out StandAloneRebuild.exe', $sTempWDir)
Exit Run($sTempWDir & 'StandAloneRebuild.exe ' & @ScriptFullPath, $sTempWDir)

; #FUNCTION# ====================================================================================================================
; Name...........: _TempFile
; Description ...: Generate a name for a temporary file. The file is guaranteed not to exist yet.
; Syntax.........: _TempFile([$s_DirectoryName = @TempDir[, $s_FilePrefix = "~"[, $s_FileExtension = ".tmp"[, $i_RandomLength = 7]]]])
; Parameters ....: $s_DirectoryName - Optional: Name of directory for filename, defaults to the users %TEMP% directory
;                  $s_FilePrefix    - Optional: File prefixname, defaults to "~"
;                  $s_FileExtension - Optional: File extenstion, defaults to ".tmp"
;                  $i_RandomLength  - Optional: Number of characters to use to generate a unique name, defaults to 7
; Return values .: Success - Filename of a temporary file which does not exist
; Author ........: Dale (Klaatu) Thompson
; Modified.......: Hans Harder - Added Optional parameters
; Remarks .......:
; Related .......:
; Link ..........;
; Example .......; Yes
; ===============================================================================================================================
Func _TempFile($s_DirectoryName = @TempDir, $s_FilePrefix = "~", $s_FileExtension = ".tmp", $i_RandomLength = 7)
	Local $s_TempName
	; Check parameters
	If Not FileExists($s_DirectoryName) Then $s_DirectoryName = @TempDir ; First reset to default temp dir
	If Not FileExists($s_DirectoryName) Then $s_DirectoryName = @ScriptDir ; Still wrong then set to Scriptdir
	; add trailing \ for directory name
	If StringRight($s_DirectoryName, 1) <> "\" Then $s_DirectoryName = $s_DirectoryName & "\"
	;
	Do
		$s_TempName = ""
		While StringLen($s_TempName) < $i_RandomLength
			$s_TempName = $s_TempName & Chr(Random(97, 122, 1))
		WEnd
		$s_TempName = $s_DirectoryName & $s_FilePrefix & $s_TempName & $s_FileExtension
	Until Not FileExists($s_TempName)

	Return ($s_TempName)
EndFunc   ;==>_TempFile


http://autoit.rv.ua/files/Other/Test.7z


НО! Это вариант неполноценный, неправильный, негодный и недостойный использования. Использовать его не рекомендую :smile:
OffTopic:
(Несмотря на то, что сам написал)


Сегодня-завтра напишу пример (возможно, даже полноценный), основанный на RarJpeg.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 175
Репутация
2 331
Вобщем вот, используется 7zip (модуль для Install-пакетов).

* В архиве есть сам скрипт, его скомпилированная версия, и готовый SFX-архив.
* Скрипт определяет откуда он запущен, и соответственно выполняет действия - если с обычной папки, то гинерирует SFX-архив, если из временной папки (предполагается что SFX-архив туда будет распаковывать), то запускает тело скрипта (вывод параметра в ini, и запись в тот же параметр другого значения), и по окончанию собирает всё обратно, с уже изменёнными данными.
* Для демонстраций работы, файл «MyInstaller.exe» нужно запустить один раз, увидеть результат, и затем запустить снова (Внимание: для сбора архива требуется время, поэтому запускать не сразу), и сравнить результат ;)
* Файл Config.txt определяет настройки, для подробностей см. доки к 7zip.

Скачать (967.34 kb).
 

SyDr

Сидра
Сообщения
651
Репутация
158
Попробую тоже описать своё чудо :smile: :

Тоже используется 7-zip. Консольная версия.
* В архиве сама "UDF", скрипт примера, скомпилированный скрипт примера и сам 7-zip
* Используется две функции:
_StandAloneAddOrUpdateFiles($sPathToFiles, $nScriptSize)
$sPathToFiles - путь к папке для включения в скрипт. Будет удалена после окончания работы. Будьте осторожны ;D
$nScriptSize - размер exe-файла скрипта. Укажете меньше и вы его обрежете :D Укажете больше -> будете таскать с собой лишнии данные.
Возвращаемое значение - нет. Работа скрипта будет завершена автоматически.

_StandAloneExtractFiles($sExtractTo = "0", $sArchiveName = 'Data.zip')
$sArchiveName - что-то позновато заметил >_< Нигде не используется
$sExtractTo - куда извлекать. Если равно 0 - будет создана папка во временной папке
Возвращаемое значение - путь к папке. @extended равен размеру основного exe-файла.

* Для демонстрации примера запускаем FirstTest.exe Честно отвечаем на вопрос. Чуть-чуть ждём. Запускаем exe ещё раз. Честно отвечаем на вопрос. Видим сообщение: размер основного скрипта и путь к папке. Нажимаем ОК. Видим ещё одно сообщение. Чуть-чуть ждём и... запускаем ещё раз. Ну и дальше по ситуации...

* Настроек нет. :laugh:
Скачать
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 175
Репутация
2 331
SyDr [?]
Попробую тоже описать своё чудо
У меня что то записанная строка не отображается (пустой msgbox)...

Этот комплекс использует установленный в системе AutoIt, или я что-то не понял, как всё таки компилируется скрипт? И для чего 7zip?
 

SyDr

Сидра
Сообщения
651
Репутация
158
Структура файла:
Скомпилированный скрипт.
Архив.
Севен-зип.
24 байта - размеры скрипта, архива и севен-зипа.
Потом этот файл разбирается >_< Достаётся севен-зип и распаковывает экзе-шник как архив. Можно было эффективнее, но это и для новых бет или с использованием WinApi.


CreatoR [?]
У меня что то записанная строка не отображается (пустой msgbox)...
Даже не знаю, из-за чего может быть. Подумал, что из-за пробелов в путях... Но нет, с ними тоже работает нормально. Какой по счёту MsgBox? Каков ответ на первый вопрос? Сколько раз запускался экзешник? Попробуй снова скрипта скомпилировать.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 175
Репутация
2 331
SyDr [?]
Какой по счёту MsgBox?
второй.

Каков ответ на первый вопрос?
Да.

Сколько раз запускался экзешник?
2.

Попробуй снова скрипта скомпилировать.
Результат тот же :(

А что с моим вопросом, он самый важный по этой теме :blum:
[?]
Этот комплекс использует установленный в системе AutoIt, или я что-то не понял, как всё таки компилируется скрипт? И для чего 7zip?
 

SyDr

Сидра
Сообщения
651
Репутация
158
При ответе "Да" второго MsgBox'а просто не может быть ;)
Похоже моё чудо только у меня и работает. Надо исправлять :smile:

7-zip по-сути, нужен для распаковки прикрепляемого к скрипту архива. Второе: при использовании прикрепления архива есть возможность потом открывать скрипт, как sfx-архив. В моей версии к скрипту прикрпеляются два файла: архив с файлами и 7z.exe для его распаковки. Была идея дать возможность прикрпелять любое число файлов и не архивировать их. Но в этом случае размер будет больше.
Скрипт оформлен в виде UDF. Использует <File.au3> для получения имени папки в темпе.
Промежуточные данные хранятся в Data.zip.

В файле описание со скриншотами. На первые пять этапов скринов нет. Там идёт компиляция и первый запуск скрипта.

http://autoit.rv.ua/files/Other/Problem_20091107_1026.7z
 
Верх