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