PDA

Показать полную графическую версию : [решено] Склеивание с exe файлами.


Страниц : [1] 2

leprecon
20-03-2009, 21:20
Как склеиться с определенным файлом? Нужно чтоб перед запуском выполнялся скрипт и отработки скрипта выполнялось приложение, или завершалось, зависит от действий пользователя. (Нужно поставить окошко с паролем перед запуском и если пароль верный то приложение запускалось, а если нет то убивалось.

D_Master
20-03-2009, 21:30
leprecon, зачем склеивать?
#NoTrayIcon
#include <GUIConstants.au3>
$Form1 = GUICreate("Введите пароль", 339, 55)
$Label1 = GUICtrlCreateLabel("Введите пароль:", 16, 16, 88, 17)
$password = GUICtrlCreateInput("", 112, 14, 121, 21)
$test = GUICtrlCreateButton("Проверить", 248, 13, 75, 25, 0)
GUISetState(@SW_SHOW)

;пароль:
$passw = "password"

While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $test
$pass = GUICtrlRead($password)
If $pass == $passw Then
MsgBox(64, "Успешно!", "Пароль введен верно!" & @CRLF & "Запускаем Notepad.")
Run(@WindowsDir & "\notepad.exe")
Else
MsgBox(16, "Ошибка!", "Введен неверный пароль!")
EndIf
EndSwitch
WEnd

leprecon
20-03-2009, 21:52
Я тоже так думал, но это спасет только от неграмотных пользователей. Более менее разбирающиеся полезут в папку с программой и попытаются запуститься с самого exe-шника. ( ну я бы поступил так :) )

proxy
20-03-2009, 21:55
вариант:
#include <Array.au3>

#region: - Option
Opt('TrayIconDebug', 1)
Opt('TrayIconHide', 0)
#endregion

HotKeySet('{ESC}', '_Pro_Exit')

Global $sPass = '123'
Global $iAuth = 0
Local $sProcessName = 'notepad.exe'
Local $sProcessPid, $aAutoItProcList, $i

While 1
$sProcessPid = ProcessExists($sProcessName)
If $sProcessPid <> 0 Then
$iAuth = 0
If IsArray($aAutoItProcList) Then
For $i=1 To $aAutoItProcList[0][0]
If $sProcessPid == $aAutoItProcList[$i][1] Then
$iAuth = 1
ExitLoop
EndIf
Next
EndIf
If $iAuth = 0 Then $aAutoItProcList = _ProcessListEx($sProcessName)
Else
$iAuth = 0
EndIf

Sleep(10)
WEnd

Func _Pro_Exit()
Exit
EndFunc

;===============================================================================
;
; Function Name: _ProcessListEx()
;
; Function Description: Gets Process List with extended info, plus can retrieve only a processes with specific resources strings.
;
; Parameter(s): $sResourceName [Optional] - Resource name of the process filename, i.e. "CompiledScript".
; $sInResString [Optional] - String to check in the resource name.
; $iWholeWord [Optional] - Defines if the $sInResString will be compared as whole string (default is 1).
;
; Requirement(s): None.
;
; Return Value(s): On Success - Return 2-dimentional array, where:
; $aRet_List[0][0] = Total processes (array elements).
; $aRet_List[N][0] = Process Name.
; $aRet_List[N][1] = PID (Process ID).
; $aRet_List[N][2] = Process File Path.
; On Failure - Return '' (empty string) and set @error to:
; 1 - Unable to Open Kernel32.dll.
; 2 - Unable to Open Psapi.dll.
; 3 - No Processes Found.
;
; Author(s): G.Sandler (a.k.a MrCreatoR) - CreatoR's Lab (http://creator-lab.ucoz.ru)
;
;=====================================================================
Func _ProcessListEx($sResourceName="", $sInResString="", $iWholeWord=1)
Local $aProcList = ProcessList()
Local $hKernel32_Dll = DllOpen('Kernel32.dll'), $hPsapi_Dll = DllOpen('Psapi.dll')
Local $aOpenProc, $aProcPath, $sFileVersion, $aRet_List[1][1]

If $hKernel32_Dll == -1 Then Return SetError(1, 0, '')

If $hPsapi_Dll == -1 Then $hPsapi_Dll = DllOpen(@SystemDir & '\Psapi.dll')
If $hPsapi_Dll == -1 Then $hPsapi_Dll = DllOpen(@WindowsDir & '\Psapi.dll')
If $hPsapi_Dll == -1 Then Return SetError(2, 0, '')

Local $vStruct = DllStructCreate('int[1024]')
Local $pStructPtr = DllStructGetPtr($vStruct)
Local $iStructSize = DllStructGetSize($vStruct)

For $i = 1 To UBound($aProcList)-1
$aOpenProc = DllCall($hKernel32_Dll, 'hwnd', 'OpenProcess', _
'int', BitOR(0x0400, 0x0010), 'int', 0, 'int', $aProcList[$i][1])

If Not IsArray($aOpenProc) Or Not $aOpenProc[0] Then ContinueLoop

DllCall($hPsapi_Dll, 'int', 'EnumProcessModules', _
'hwnd', $aOpenProc[0], _
'ptr', $pStructPtr, _
'int', $iStructSize, _
'int*', 0)

$aProcPath = DllCall($hPsapi_Dll, 'int', 'GetModuleFileNameEx', _
'hwnd', $aOpenProc[0], _
'int', DllStructGetData($vStruct, 1), _
'str', '', _
'int', 2048)

DllCall($hKernel32_Dll, 'int', 'CloseHandle', 'int', $aOpenProc[0])

If Not IsArray($aProcPath) Or StringLen($aProcPath[3]) == 0 Then ContinueLoop

$sFileVersion = FileGetVersion($aProcPath[3], $sResourceName)

If $aProcList[$i][0] == $sResourceName Then
If $sResourceName == "" Or $sFileVersion == $sInResString Or _
($iWholeWord == 0 And StringInStr($sFileVersion, $sInResString)) Then

If NOT _Check_Win($aProcList[$i][1]) Then ContinueLoop

$aRet_List[0][0] += 1
ReDim $aRet_List[$aRet_List[0][0]+1][3]
$aRet_List[$aRet_List[0][0]][0] = $aProcList[$i][0] ;Process Name
$aRet_List[$aRet_List[0][0]][1] = $aProcList[$i][1] ;PID (Process ID)
$aRet_List[$aRet_List[0][0]][2] = $aProcPath[3] ;Process File Path
EndIf
EndIf
Next

DllClose($hKernel32_Dll)
DllClose($hPsapi_Dll)

If $aRet_List[0][0] < 1 Then
$iAuth = 0
Return SetError(3, 0, '')
EndIf

If $iAuth == 0 Then _Check_Pass($aRet_List)
Return $aRet_List
EndFunc

Func _Check_Win($iPID)
Local $hHWD = _ProcessGetWindow($iPID, 1)
If StringInStr(WinGetTitle($hHWD), ' - Блокнот') Then
If $iAuth == 0 Then
WinSetState($hHWD, '', @SW_HIDE)
EndIf
Return 1
EndIf
Return 0
EndFunc

Func _Check_Pass($aRet_List)
Local $sInputPass, $i, $hHWD

$sInputPass = InputBox('Права доступа', 'Введите пароль доступа к Notepad', '', '*', 150, 150)

If $sInputPass == $sPass Then
;~ $iAuth = 1
For $i=1 To $aRet_List[0][0]
$hHWD = _ProcessGetWindow($aRet_List[$i][1], 1)
WinSetState($hHWD, '', @SW_SHOW)
WinActivate($hHWD)
Next
Else
;~ $iAuth = 0
For $i=1 To $aRet_List[0][0]
ProcessClose($aRet_List[$i][1])
Next
EndIf
EndFunc

Func _ProcessGetWindow($iPID, $iRet=-1)
Local $aWinList = WinList()
Local $aRet[2]

If IsString($iPID) Then $iPID = ProcessExists($iPID)

For $i = 1 To UBound($aWinList)-1
If WinGetProcess($aWinList[$i][1]) = $iPID Then
$aRet[0] = $aWinList[$i][0] ;Title
$aRet[1] = $aWinList[$i][1] ;WinHandle

If $iRet = 0 Then Return $aRet[0]
If $iRet = 1 Then Return $aRet[1]

Return $aRet
EndIf
Next

Return SetError(1, 0, $aRet)
EndFunc

amel27
21-03-2009, 06:10
имхо FileInstall как раз для таких случаев - при компиляции скрипт "всасывает" файл проги в себя, при запуске - скрипт проверяет пароль, при успехе извлекает файл в нужное место и запускает, при закрытии проги удаляет файл
;#NoTrayIcon
$sPassw = "qwerty"
$sInput = InputBox("Проверка прав доступа", "Введите пароль:", "", "*")
If Not($sPassw==$sInput) Then Exit MsgBox(16, "Ошибка", "Пароль неверен!")

FileInstall("C:\Program Files\MyProgram\MyExe.exe", "C:\Program Files\MyProgram\MyExe.exe", 1)
$iPID = Run("C:\Program Files\MyProgram\MyExe.exe", "C:\Program Files\MyProgram")
If $iPID=0 Then Exit(1)

Sleep(500)
ProcessWaitClose($iPID)
Sleep(500)
FileDelete("C:\Program Files\MyProgram\MyExe.exe")

leprecon
21-03-2009, 12:09
А если скрипт уже откомпилирован? Засосать его внутрь себя уже не получится?

amel27
21-03-2009, 13:56
leprecon, нет - упаковка и включение в EXE происходит только в процессе компиляции

Str_ani_ck
27-07-2009, 14:15
leprecon, нет - упаковка и включение в EXE происходит только в процессе компиляции »

А как зделать чтобы скрипт в себя всосал папку с файлами? Только распаковывать их никуда не нужно?

amel27
27-07-2009, 15:12
Только распаковывать их никуда не нужно? »а зачем тогда "всасывать"? :o

Str_ani_ck
27-07-2009, 15:24
а зачем тогда "всасывать"? »

Так можно или нет????

Суть ни в этом надо их распаковывать или нет, а втом можно всосать папку с файлами или нет???
Если можно, то напишите примерчик по :help: жалуйста

amel27
27-07-2009, 17:27
Str_ani_ck, FileInstall не поддерживает каталоги, поэтому вижу только два варианта:

- перечислить явно все файлы в FileInstall (нужен полный список файлов);
- запаковать папку в архив (любым доступным архиватором) и приаттачить к EXE, примеры для WinRAR:

вариант 1:
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Run_Before="c:\Program Files\WinRAR\RAR.exe" a c:\attach.rar C:\TEST\*
#AutoIt3Wrapper_Res_File_Add=C:\attach.rar, Files, TEST
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****


вариант 2:
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Run_Before="c:\Program Files\WinRAR\RAR.exe" a c:\attach.rar C:\TEST\*
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

If Not(@Compiled) Then FileInstall("c:\attach.rar", "C:\TEST\")


P.S. 1-й вариант более капризный, не для всех SciTE работает и не всегда :dont-know

Creat0R
27-07-2009, 19:41
Есть ещё вариант с обработкой файлов и построением списка FileInstall'ов:


$sRet_FI_Lines = _FileInstallGetFolder("C:\Temp", "D:\Dest", 0, "*.txt")
ConsoleWrite("+Return:" & @CRLF & $sRet_FI_Lines & @CRLF & @CRLF & "!Error = " & @error & @CRLF & @CRLF)

MsgBox(64, "Return #1:", $sRet_FI_Lines & @CRLF & @CRLF & "!Error = " & @error)

$sRet_FI_Lines = _FileInstallGetFolder(@ProgramFilesDir & "\AutoIt3", "$aDest[$i]", 1, "*.exe")
ConsoleWrite("+Return:" & @CRLF & $sRet_FI_Lines & @CRLF & @CRLF & "!Error = " & @error & @CRLF & @CRLF)

MsgBox(64, "Return #2:", $sRet_FI_Lines & @CRLF & @CRLF & "!Error = " & @error)

Func _FileInstallGetFolder($sSource, $sDest, $nFlag = 0, $sMask = "*", $nCompiled = False)
Local $hSearch, $sNext_File, $sRet_FI_Lines = ""

If (Not $nCompiled) Or ($nCompiled And @Compiled) Then
$hSearch = FileFindFirstFile($sSource & "\" & $sMask)
If $hSearch = -1 Then Return SetError(1, 0, "")

;Check if it's a $Var (or $Array[$i][N]...)
Local $iAddAsVar = StringRegExp($sDest, "(?i)\A\$([0-9a-z_])+(\[(\$[0-9a-z_]+|\d+)+\]+|)+$")

While 1
$sNext_File = FileFindNextFile($hSearch)
If @error Then ExitLoop ;No more files

If $iAddAsVar Then
$sRet_FI_Lines &= 'FileInstall("' & $sSource & '\' & $sNext_File & '", ' & _
$sDest & ' & "\' & $sNext_File & '", ' & $nFlag & ')' & @CRLF
Else
$sRet_FI_Lines &= 'FileInstall("' & $sSource & '\' & $sNext_File & '", "' & _
$sDest & '\' & $sNext_File & '", ' & $nFlag & ')' & @CRLF
EndIf
WEnd

FileClose($hSearch)
EndIf

If $sRet_FI_Lines = "" Then Return SetError(2, 0, "")
Return StringStripWS($sRet_FI_Lines, 3)
EndFunc

Str_ani_ck
27-07-2009, 20:22
а зачем тогда "всасывать"? »
Ну почему нельзя ответить на вопрос????

Creat0R
27-07-2009, 20:32
почему нельзя ответить на вопрос? »
Потому что он не несёт логического смысла, если вам действительно нужна помощь, то я посоветовал бы всё же давать подробности когда тот кто пытается вам помочь, спрашивает о них. А вообще то ответ на вопрос предоставлен, в чём трудности, в понимании написанного?

crashtuak
27-07-2009, 21:56
Хм, когдато страдал подобной фигней. Хотел всосать ехе, не распаковать его, но запустить :). Потом понял, что надо всосать, распаковать, запустить, удалить.

Str_ani_ck
27-07-2009, 21:58
А вдруг на компьютере нет Winrar

Creat0R
27-07-2009, 23:00
А вдруг на компьютере нет Winrar »
Установить (http://rarlab.com/rar_archiver.htm) думаю будет не сложно? :)

crashtuak
28-07-2009, 01:06
Хм, проще не rar архив сделать, а sfx :).

Str_ani_ck
28-07-2009, 01:08
Спасибо на этом сайте так все просто и понятно)) Раньше пытался работать с Автоит но ничего не получалось. Спасибо

crashtuak
28-07-2009, 09:09
Спасибо на этом сайте так все просто и понятно)) Раньше пытался работать с Автоит но ничего не получалось. Спасибо »
Вашу проблему наверно так и никто не понял :). Все писали всё что знали :). Наверно sfx был решением :)?




© OSzone.net 2001-2012