Random-Obfuscator

    • Offizieller Beitrag

    Random-Obfuscator Version 1.4

    Was macht das Programm?

    A: Man kann ein AutoIt-Script auswählen. Anschließend wird eine Kopie davon erstellt und diese Kopie vom Original-Obfuscator verschleiert. Und dann kommt mein Script an die Reihe. Alle Variablen werden durch Zufallsnamen (z.B. $Q58693486534) ersetzt. Wobei ein Wörterbuch (Scripting.Dictionary) für die Ersetzungen zum Einsatz kommt. Zusätzlich gibt es ein Hilfs-Wörterbuch für die Zufallsnamen, damit diese nicht versehentlich doppelt generiert werden. Das sollte meiner Meinung nach ausreichen, um ein Wiederherstellen unmöglich zu machen. In einer späteren Version nehme ich mir dann noch die Funktionsnamen vor.

    Die Zieldatei hat anschließend den Dateinamen: Scriptname_obfuscated.au3

    Edit:
    Das Problem mit den Zeichenketten ist jetzt gelöst. Wenn also ein Dollarzeichen innerhalb einer Zeichenkette vorkommt, wird das nicht mehr als Variable erkannt.
    Alle Variablen die mittels IsDeclared() getestet werden oder Variablen, denen mittels Assign() Werte zugewiesen werden, werden nun direkt in das Wörterbuch übernommen und somit nicht mehr verändert. Das funktioniert auch mit zusammengesetzten Variablen.

    Edit v1.4:
    - Eigenartigerweise ist bei mir manchmal ein Fehler mit der Version 1.3 aufgetreten. In seltenen Fällen (nicht reproduzierbar) wurden 23stellige Variablennamen generiert. Ich habe die Random-Routine jetzt auf 11stellige Variablennamen gekürzt (vorher 12stellig) und seitdem ist dieser Fehler nicht mehr aufgetreten. Sollte ein Script nach dem obfuscaten nicht lauffähig sein, schaut bitte mal auf die Fehlermeldung, ob der Variablenname länger als 11 Zeichen (mit Dollarzeichen 12 Zeichen) ist.
    - Die doppelte Prüfung auf den Original-Obfuscator eingebaut (Danke, Prog@ndy!)
    - ein paar kosmetische Korrekturen


    Wenn jetzt noch Fehler beim bearbeiten mit meinem Script oder später mit dem "obfuscated Code" auftreten, dann bitte melden (bitte mit dem Script, dass den Fehler verursacht hat)!


    Einbau des Random-Obfuscators in den AutoIt3-Wrapper:

    1. den Random-Obfuscator compilieren (Dateiname = Obfuscator.exe) oder die Obfuscator.exe aus dem ZIP-Archiv nehmen
    2. den Original-Obfuscator in "C:\Programme\AutoIt3\SciTE\Obfuscator\" umbenennen in: "Orig_Obfuscator.exe" <-- genau so (ohne die Anführungszeichen)!
    3. Den Random-Obfuscator in das Verzeichnis "C:\Programme\AutoIt3\SciTE\Obfuscator\" kopieren.

    Edit ( 18.09.08 :( Achtung! Mein Random-Obfuscator funktioniert nicht mit der aktuellen Version des Original-Obfuscator!

    Im ZIP-Archiv im Anhang findet ihr alle benötigten Dateien.

  • Entferne die Obusfactor-Zeile doch aus dem Skript mit folgendem Code zum Temp-File schrieben :)

    Spoiler anzeigen
    [autoit]

    $Script = FileRead($ScriptSource)
    FileDelete($Path & $Filename & '_tmp.au3')
    If Not FileWrite($Path & $Filename & '_tmp.au3',StringRegExpReplace($Script,"#Obfuscator_Parameters=.*\Z",";;; -> Deleted Obfuscator_Parameters")) Then
    MsgBox(262144+16,'Error', 'Cannot create Tempfile!')
    Exit
    EndIf

    [/autoit]

    und noch Infos zum Einbau in den AUtoIt3 Wrapper:

    • Umbenennen von Obfuscator.exe in Orig_Obfuscator.exe
    • Änderungen im Skript:

      • In Zeile 7 im Skript den Pfad auf Orig_Obfuscator.exe ändern
      • In Zeile 63 '_random.au3' in '_obfuscated.au3' ändern
    • Skript als Obfuscator.exe kompilieren
    • An die stelle der alten Obfuscator.exe kopieren

    Einmal editiert, zuletzt von progandy (14. Juni 2008 um 21:04)

  • Der Obfiscator-Einbau geht aber noch nicht ganz...
    Da muss noch ein CMDLINE rein
    und ich hab nen Skript, wo des ned funktioniert. Muss mal den Fehler suchen :(

  • Hmm, ich hab nen Bug im Obfuscator gefunden! Ein Callbacks gehen nicht.
    So, das Skript, einbaubar in AutoIt3Wrapper:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <file.au3>
    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $Progress, $aSource, $pos, $dest
    Global $Obfuscator = @ProgramFilesDir & '\AutoIt3\SciTE\Obfuscator\Orig_Obfuscator.exe' ; Pfad zum Original-Obfuscator
    If Not FileExists($Obfuscator) Then ; Testen, ob der Obfuscator vorhanden ist
    MsgBox(262144+16,'Error', 'Obfuscator not found!')
    Exit
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Global $GUI = GUICreate('Random-Obfuscator v1.0 (C) by Oscar', 640, 220)
    GUISetBKColor(0xAAAAAA)

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlCreateGroup('Source', 10, 10, 300, 110)
    GUICtrlSetFont(-1, 14, 400, 0, 'Arial')
    GUICtrlCreateLabel('Filename:', 20, 50, 70, 25)
    GUICtrlSetFont(-1, 9, 400, 0, 'Arial')
    Global $SourceFilename = GUICtrlCreateLabel('', 90, 50, 200, 25)
    GUICtrlSetFont(-1, 9, 400, 0, 'Arial')
    GUICtrlCreateLabel('Lines:', 20, 70, 70, 25)
    GUICtrlSetFont(-1, 9, 400, 0, 'Arial')
    Global $SourceLines = GUICtrlCreateLabel('0', 90, 70, 200, 25)
    GUICtrlSetFont(-1, 9, 400, 0, 'Arial')
    GUICtrlCreateLabel('Filesize:', 20, 90, 70, 25)
    GUICtrlSetFont(-1, 9, 400, 0, 'Arial')
    Global $SourceFilesize = GUICtrlCreateLabel('0', 90, 90, 200, 25)
    GUICtrlSetFont(-1, 9, 400, 0, 'Arial')
    GUICtrlCreateGroup('', -99, -99, 1, 1)

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlCreateGroup('Destination', 330, 10, 300, 110)
    GUICtrlSetFont(-1, 14, 400, 0, 'Arial')
    GUICtrlCreateLabel('Filename:', 340, 50, 70, 25)
    GUICtrlSetFont(-1, 9, 400, 0, 'Arial')
    Global $DestFilename = GUICtrlCreateLabel('', 410, 50, 200, 25)
    GUICtrlSetFont(-1, 9, 400, 0, 'Arial')
    GUICtrlCreateLabel('Lines:', 340, 70, 70, 25)
    GUICtrlSetFont(-1, 9, 400, 0, 'Arial')
    Global $DestLines = GUICtrlCreateLabel('0', 410, 70, 200, 25)
    GUICtrlSetFont(-1, 9, 400, 0, 'Arial')
    GUICtrlCreateLabel('Filesize:', 340, 90, 70, 25)
    GUICtrlSetFont(-1, 9, 400, 0, 'Arial')
    Global $DestFilesize = GUICtrlCreateLabel('0', 410, 90, 200, 25)
    GUICtrlSetFont(-1, 9, 400, 0, 'Arial')
    GUICtrlCreateGroup('', -99, -99, 1, 1)

    [/autoit] [autoit][/autoit] [autoit]

    Global $Progress = GUICtrlCreateProgress(10, 150, 620, 24)

    [/autoit] [autoit][/autoit] [autoit]

    Global $Ready = GUICtrlCreateButton('Ready', 290, 185, 60, 25)
    GUICtrlSetState(-1, $GUI_DISABLE)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState()
    ;MsgBox(0,"",$CMDLINE[1])
    If $CMDLINE[0] > 0 THen
    Global $ScriptSource = $CMDLINE[1]
    Else
    Global $ScriptSource = FileOpenDialog('Select Script', @ScriptDir & '\', 'AutoIt-Script (*.au3)', 1+2) ; AutoIt-Script auswählen
    Endif
    If @error Then Exit ; Wenn Benutzer auf 'Abbrechen' geklickt hat, dann Programm beenden
    Global $Separator = StringInStr($ScriptSource, '\', 2, -1)
    Global $Path = StringLeft($ScriptSource, $Separator) ; Pfad des AutoIt-Scripts
    Global $Filename = StringMid($ScriptSource, $Separator+1) ; Dateiname des Scripts
    GUICtrlSetData($SourceFilename, $Filename)
    Global $Dot = StringInStr($Filename, '.')
    $Filename = StringLeft($Filename, $Dot-1) ; Dateiname ohne Endung
    Global $Destination = $Filename & '_obfuscated.au3' ; Ziel-Dateiname
    GUICtrlSetData($DestFilename, $Destination)
    GUICtrlSetData($SourceFilesize, FileGetSize($ScriptSource) & ' Bytes')
    If Not FileCopy($ScriptSource, $Path & $Filename & '_tmp.au3', 1) Then ; Kopie vom Script anlegen
    MsgBox(262144+16,'Error', 'Cannot create Tempfile!')
    Exit
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    RunWait($Obfuscator & ' "' & $Path & $Filename & '_tmp.au3" /cs 1 /cn 1 /cf 1 /cv 1', @ScriptDir, @SW_HIDE) ; Kopie vom Original-Obfuscator bearbeiten lassen
    $ScriptSource = $Path & $Filename & '_tmp_obfuscated.au3' ; die vom Obfuscator bearbeitete Datei als Quelle benutzen

    [/autoit] [autoit][/autoit] [autoit]

    If Not _FileReadToArray($ScriptSource, $aSource) Then ; Script in ein Array einlesen
    MsgBox(262144+16,'Error', ' Error reading Sourcefile to Array error:' & @error)
    Exit
    EndIf
    FileDelete($ScriptSource) ; die vom Original-Obfuscator erzeugte Datei löschen
    GUICtrlSetData($SourceLines, $aSource[0]) ; Anzahl der Zeilen anzeigen

    [/autoit] [autoit][/autoit] [autoit]

    $oDictTable = ObjCreate('Scripting.Dictionary') ; Variablen-Ersetz-Wörterbuch anlegen
    If Not IsObj($oDictTable) Then
    MsgBox(262144+16,'Error', 'Cannot create Scripting.Dictionary!')
    Exit
    EndIf
    $oDictHelp = ObjCreate('Scripting.Dictionary') ; Hilfs-Wörterbuch für Zufallsvariablen anlegen
    If Not IsObj($oDictHelp) Then
    MsgBox(262144+16,'Error', 'Cannot create Scripting.Dictionary!')
    Exit
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $dest = 0
    Global $DestFileHandle = FileOpen($Path & $Destination, 2) ; Zieldatei zum speichern öffnen
    If $DestFileHandle = -1 Then
    FileDelete($Path & $Filename & '_tmp.au3') ; temporäre Kopie löschen
    FileDelete($ScriptSource) ; die vom Original-Obfuscator erzeugte Datei löschen
    MsgBox(262144+16,'Error', 'Cannot create destination file!')
    Exit
    EndIf
    For $Line = 1 To $aSource[0]
    GUICtrlSetData($Progress, Int(100/$aSource[0]*$Line))
    $i = 1
    $aSource[$Line] &= ' '
    While $i < StringLen($aSource[$Line])
    If StringMid($aSource[$Line], $i, 1) = '$' Then
    $VarStart = $i
    $x = 0
    For $j = $i+1 To StringLen($aSource[$Line])
    $x += 1
    If Not StringRegExp(StringMid($aSource[$Line], $j, 1), '\w') Then
    $VarEnd = $x
    ExitLoop
    EndIf
    Next
    $SearchVar = StringMid($aSource[$Line], $VarStart, $VarEnd)
    If Not $oDictTable.Exists($SearchVar) Then $oDictTable.Add($SearchVar, _RandomVar())
    $aSource[$Line] = StringReplace($aSource[$Line], $SearchVar, $oDictTable.Item($SearchVar), 1)
    $i += 12
    EndIf
    $i += 1
    WEnd
    $aSource[$Line] = StringStripWS($aSource[$Line], 2)
    If $aSource[$Line] <> '' Then
    FileWriteLine($DestFileHandle, $aSource[$Line])
    $dest += 1
    GUICtrlSetData($DestLines, $dest)
    EndIf
    Next
    FileClose($DestFileHandle)
    GUICtrlSetData($DestFilesize, FileGetSize($Path & $Destination) & ' Bytes')

    [/autoit] [autoit][/autoit] [autoit]

    FileDelete($Path & $Filename & '_tmp.au3') ; temporäre Kopie löschen

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlSetState($Ready, $GUI_ENABLE)
    While 1
    $msg = GUIGetMsg()
    If $msg = $Ready Or $msg = $GUI_EVENT_CLOSE Or $CMDLINE[0] > 1 Then Exit
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _RandomVar()
    Local $Var
    Do
    $Var = '$'
    $Var &= Chr(Random(65, 90, 1))
    For $count = 0 To 10
    $Var &= Chr(Random(48, 57, 1))
    Next
    Until Not $oDictHelp.Exists($Var)
    $oDictHelp.Add($Var, '')
    Return $Var
    EndFunc

    [/autoit]
    • Offizieller Beitrag

    Oh, verdammt! Ich habe ein Riesen-Bug gefunden:

    Ich teste auf das Dollarzeichen als Variablenanfang und berücksichtige dabei nicht, dass das Dollarzeichen auch innerhalb einer Zeichenkette stehen kann. :whistling:
    Außerdem gibt es noch ein Problem mit IsDeclared(). Dort werden die Variablen ja ohne Dollarzeichen eingefügt.

  • Assign auch ! (O_O da fällt mir auf, wenn man den Obfuscator verwendet sollte man keine Variablen mit Assign aus Teilen zusammensetzen !!!)

  • öhm
    kleine kurze fragen,

    1.

    Code
    C:\Dokumente und Einstellungen\Besitzer\Desktop\RandomObfuscator.au3(65,109) : ERROR: FileOpenDialog() [built-in] called with wrong number of args.
    Global $ScriptSource = FileOpenDialog('Select Script', @ScriptDir & '\', 'AutoIt-Script (*.au3)',"", 3, $GUI)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
    C:\Dokumente und Einstellungen\Besitzer\Desktop\RandomObfuscator.au3 - 1 error(s), 0 warning(s)


    2.

    Code
    Error reading Sourcefile to Array	error:1


    3.
    die übergabe des zielscripts an den original obfuscator klappt nicht so ganz, es geht gleich nachdem dein script das ziel geladen hat ein neues fileopendialoge auf o0

    edit
    ... schonwieder ne neue au3 version xD

    Einmal editiert, zuletzt von azunai (15. Juni 2008 um 16:01)

  • zu 3: Zeile 95 braucht ein paar Anführungszeichen :)

    [autoit]

    RunWait('"' & $Obfuscator & '" "' & $Path & $Filename & '_tmp.au3" /cs 1 /cn 1 /cf 1 /cv 1', @ScriptDir, @SW_HIDE) ; Kopie vom Original-Obfuscator bearbeiten lassen

    [/autoit]
  • ok hab neue version,
    copile error gibt es keine mehr,
    jedoch öffnet sich immernoch das 2te dialog fenster, egal ob ich die zeile so wie proggandy änder oder nicht...

  • Du musst auch erst kompilieren :)
    Ich lad mal die korrigierte Version hoch. Funktioniert die?

  • die Version von 10:00 Uhr läuft einwandfrei !!!

    Crazy-A

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    k3mrwmIBHejryPvylQSFieDF5f3VOnk6iLAVBGVhKQegrFuWr3iraNIblLweSW4WgqI0SrRbS7U5jI3sn50R4a15Cthu1bEr

  • Bei 1.3 muss der Obfuscator umbenannt werden !
    Oscar : Baue doch eine doppelte Abfrage ein:

    Spoiler anzeigen
    [autoit]

    Global $Obfuscator = @ProgramFilesDir & '\AutoIt3\SciTE\Obfuscator\Orig_Obfuscator.exe' ; Pfad zum Original-Obfuscator
    If Not FileExists($Obfuscator) Then ; Testen, ob der Obfuscator vorhanden ist
    Global $Obfuscator = @ProgramFilesDir & '\AutoIt3\SciTE\Obfuscator\Obfuscator.exe' ; Pfad zum Original-Obfuscator
    If Not FileExists($Obfuscator) Then
    MsgBox(262144+16,'Error', 'Obfuscator not found!')
    Exit
    EndIf
    EndIf

    [/autoit]