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
Imagen
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
Responder

Volver a “Autoit”