He visto código donde en vez de usar la función FileInstall guardan el archivo en el código
Intente usando FileRead() y guardar el el binario en una variable, pero autoit tiene un limite de longitud para las variables por lo que usan $variable &= , obviamente me da una pereza tener que dividirlo en 40 partes o más, abra alguna forma de automatizarlo supongo, alguien sabe?
Saludos
Solo tienes que programar una rutina que lo haga por vos.
No creo que se lleve mas de 15 lineas de código hacer lo que quieres.
Saludos
No creo que se lleve mas de 15 lineas de código hacer lo que quieres.
Saludos
Te dejo la versión reducida del script que me hice para ello.
#include <String.au3>
Local $FileDlg = FileOpenDialog("Selecciona un archivo", @ScriptDir, "EXE (*.exe)")
Local $sFileOpen = FileOpen($FileDlg)
Local $sFileRead = FileRead($sFileOpen)
FileClose($sFileOpen)
Local $bCrypt = False
Local $bCompress = False
Local $NewFile = @ScriptDir & "\File.au3"
Local $FileArray
Local $RandomKey = _Randomstring(15)
If ($bCrypt) Then
$FileArray &= 'Global $FileKey = "' & $RandomKey & '"' & @CRLF
EndIf
$FileArray &= "Global $File" & @CRLF
Local $EncryptedFile = $sFileRead
If ($bCompress) Then
$EncryptedFile = _LZNTCompress($sFileRead)
EndIf
If ($bCrypt) Then
$EncryptedFile = RC4($RandomKey, $sFileRead)
EndIf
$EncryptedFile = _StringToHex(BinaryToString($EncryptedFile))
Local $Chunks = _StringChopS($EncryptedFile, 1000)
For $i = 1 To $Chunks[0]
$FileArray &= '$File &= "' & $Chunks[$i] & '"' & @CRLF
ConsoleWrite($i & "/" & $Chunks[0])
Next
If (FileExists($NewFile)) Then FileDelete($NewFile)
FileWrite($NewFile, $FileArray)
MsgBox(0, "", "¡Hecho!")
Func RC4($key, $value)
Local $S[256], $i, $j, $c, $t, $x, $y, $output
Local $keyLength = BinaryLen($key), $valLength = BinaryLen($value)
For $i = 0 To 255
$S[$i] = $i
Next
For $i = 0 To 255
$j = Mod($j + $S[$i] + Dec(StringTrimLeft(BinaryMid($key, Mod($i, $keyLength) + 1, 1), 2)), 256)
$t = $S[$i]
$S[$i] = $S[$j]
$S[$j] = $t
Next
For $i = 1 To $valLength
$x = Mod($x + 1, 256)
$y = Mod($S[$x] + $y, 256)
$t = $S[$x]
$S[$x] = $S[$y]
$S[$y] = $t
$j = Mod($S[$x] + $S[$y], 256)
$c = BitXOR(Dec(StringTrimLeft(BinaryMid($value, $i, 1), 2)), $S[$j])
$output = Binary($output) & Binary('0x' & Hex($c, 2))
Next
Return $output
EndFunc
Func _Randomstring($length)
$chars= StringSplit("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789","")
$String = ""
$i=0
Do
If $length<=0 then ExitLoop
$String &= $chars[Random(1,$chars[0])]
$i += 1
Until $i = $length
Return $String
EndFunc
Func _StringChopS($string, $size) ;~ https://www.autoitscript.com/forum/topic/47352-stringsplit-by-length/?do=findComment&comment=354533
Local $count = Ceiling(StringLen($string)/$size)
Dim $array[$count+1], $start = 1
For $i = 1 To $count
$array[$i] = StringMid($string, $start, $size)
$start += $size
Next
$array[0] = $count
Return $array
EndFunc
Func _LZNTCompress($vInput, $iCompressionFormatAndEngine = 2)
If Not ($iCompressionFormatAndEngine = 258) Then
$iCompressionFormatAndEngine = 2
EndIf
Local $bBinary = Binary($vInput)
Local $tInput = DllStructCreate("byte[" & BinaryLen($bBinary) & "]")
DllStructSetData($tInput, 1, $bBinary)
Local $a_Call = DllCall("ntdll.dll", "int", "RtlGetCompressionWorkSpaceSize", _
"ushort", $iCompressionFormatAndEngine, _
"dword*", 0, _
"dword*", 0)
If @error Or $a_Call[0] Then
Return SetError(1, 0, "") ; error determining workspace buffer size
EndIf
Local $tWorkSpace = DllStructCreate("byte[" & $a_Call[2] & "]") ; workspace is needed for compression
Local $tBuffer = DllStructCreate("byte[" & 16 * DllStructGetSize($tInput) & "]") ; initially oversizing buffer
Local $a_Call = DllCall("ntdll.dll", "int", "RtlCompressBuffer", _
"ushort", $iCompressionFormatAndEngine, _
"ptr", DllStructGetPtr($tInput), _
"dword", DllStructGetSize($tInput), _
"ptr", DllStructGetPtr($tBuffer), _
"dword", DllStructGetSize($tBuffer), _
"dword", 4096, _
"dword*", 0, _
"ptr", DllStructGetPtr($tWorkSpace))
If @error Or $a_Call[0] Then
Return SetError(2, 0, "") ; error compressing
EndIf
Local $tOutput = DllStructCreate("byte[" & $a_Call[7] & "]", DllStructGetPtr($tBuffer))
Return SetError(0, 0, DllStructGetData($tOutput, 1))
EndFunc ;==>_LZNTCompress
Gracias Blau, funciona perfecto (y)