DeObfuscation

08/13/2011 08:06 freehuntx#1
Hallo Leute.

Beim Obfuscaten eines Scripts in autoit, werden die meisten funktionen, je nach einstellungen auf bestimmte art und weise verschlüsselt.

Dabei wird z.B. für den Befehl "Exit" der text per Execute und BinarytoString im Script Entschlüsselt.

Wenn man nun in einem Decompilierten Script, an einer bestimmten stelle platz macht, und diese verschlüsselten zeilen nach und nach einfügt, und execute mit clipput ersetzt, und dahinter ein exit setzt, wird nach ausführen des scripts die entsprechende zeile entschlüsselt, ins clipboard gesetzt, und das script beendet sich, und man kann weiter machen mit dem entschlüsseln.

Ich bin gerade dabei zu versuchen, das ganze zu automatisieren, und wollte fragen ob jemand mit genügend kenntnissen lust hätte mitzumachen.


Bevor jetzt das geflame anfängt, ich sei ein Leecher, und hätte es nötig fremde Programme zu entschlüsseln etc, solltet ihr ernsthaft über euch nachdenken.
08/13/2011 10:10 bassbanane#2
Ich habe mal ein wenig rumprobiert und wenn man "Execute(" durch "clipput(Clipget()&@CRLF&" ersetzt und das Script anschließend ausführt, hat man schonmal einen aufgeräumteren SourceCode.
Jedoch sind die Variablen ja mit keinem Execute versehen und somit noch obfuscated.
08/13/2011 10:27 freehuntx#3
Variablen, werden ja obfuscated, z.B. wir aus "_Hello()" "T_T0x34563734565".

VariablenNamen kann man sich einfach selbst aussuchen.

Man kann ja in der Funktion sehen was sie macht, und sich dann einfach eigene namen dafür aussuchen, und überall abändern.



Naja ich habe es mir so Vorgestellt.


1. Ein Entsprechendes Script wird geöffnet.
2. Es wird nach dem 2. Execute( im script, Freiraum von 5 Zeilen gesetzt.
3. In dieser Zeile wird jedes Execute Entschlüsselt, und in Clipput Gesetzt.
4. Die Entschlüsselten Strings, werden in einer TextDatei Zeile für Zeile eingefügt.
5. Beim OrginalScript, wird das erste Execute( gesucht, und aus der Textdatei der code ausgelesen, und dadurch ersetzt.

Wird sicherlich alles Kompliziert.
08/13/2011 11:18 buFFy!#4
wozu das ganze? in ida hast du doch auch nur die addresse als namen. dabei spielt der funktionsname nicht wirklich ne rolle.

oder hab ich das prinzip jetzt falsch verstanden?

btw, wenn ich ne exe die durch myauttoexe erstellt wurde dekompiliere bleibt da nix mehr verschlüsselt
08/13/2011 11:22 freehuntx#5
Nein ich wollte ihm nur seine Frage, oder was das sein wollte, beantworten.
Das Variablennamen keine Rolle Spielen weiß ich ja.

Ich hätte eine frage.

Weiß jemand ob es möglich ist, zu überprüfen ob ein bestimmter string kein Leerzeichen davor hat?

z.B. wenn eine Zeile sofort mit Execute( anfängt, damit man die Executes die ein leerzeichen davor haben, ignorieren kann.
08/13/2011 13:07 Shadow992#6
Du solltest zuerst einmal klären um welchen Obfuscator es geht, sonst wird sich wohl keiner so schnell melden. ;)

Und danach solltest du dein Anliegen etwas konkreter fassen.
Willst du einen kompletten Deobfuscator oder willst du "nur" das Execute wieder "normal" machen?
Denn ein kompletter Deobfuscator würde auch noch Variablen umbenennen und auch konstante Variablen, deren Werte meist irgendwie verschlüsselt sind deobfuscaten usw.
08/13/2011 13:34 bassbanane#7
Ich glaube, ich habe verstanden, was du genau möchtest.
Ich setze mich heute Abend mal ran.
Habe dafür schon eine Idee

Ich habe mich mal grob rangesetzt.
Von der Theorie her funktioniert es.
Der Code wird auf jeden Fall leichter lesbar, jedoch nicht ausführbar.
Ihr könnt gerne weiter daran arbeiten.
Auch finde ich die Variante mit Clipput nicht so schön, aber was solls ;)
Code:
#include <file.au3>
Global $array[1]

_FileReadToArray("obfuscated.au3", $array)


For $i = 1 To $array[0]
	If StringInStr($array[$i], "Execute") Then
		$new = StringReplace($array[$i], 'Execute(', 'Clipput(') ;Execute mit Clipput für die entsprechende Zeile ersetzen

		$var = 0
		If StringInStr($new, "=Clipput") Then ;Schauen, ob vor dem Execute eine Deklaration einer Variable ist
			$split = StringSplit($new, "=")
			$dec = $split[1]
			$var = 1

		EndIf

		Execute($new) ;Das modifizierte Execute ausführen
		Sleep(300)
		$get = ClipGet() ;Das sich nun im Zwischenspeicher befindende Codeschnipsel auslesen
	
		If $var = 1 Then
			FileWriteLine("New.txt", $dec & "=" & $get) ;Und entsprechend in eine neue Datei schreiben (Mit Deklaration)
		Else
			FileWriteLine("New.txt", $get) ;Ohne Deklaration aber mit Execute
		EndIf

	Else
		FileWriteLine("New.txt", $array[$i]) ;Zeile, die kein Execute enthielt
	EndIf
Next