Página 1 de 1

Guardar archivo en codigo(string) ????

Publicado: 24 Jul 2016, 05:29
por Usuario borrado 84624
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

Re: Guardar archivo en codigo(string) ????

Publicado: 25 Jul 2016, 01:14
por Pink
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

Re: Guardar archivo en codigo(string) ????

Publicado: 25 Jul 2016, 10:35
por Blau
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

Re: Guardar archivo en codigo(string) ????

Publicado: 01 Ago 2016, 02:44
por Usuario borrado 84624
Gracias Blau, funciona perfecto (y)