JavaScript deobfuscator online: van geobfusceerde code naar leesbare code
Een JS deobfuscator draait de trucs terug die code moeilijk leesbaar maken. Deze pakt eenvoudige stringarrays uit, rekent constante expressies uit, decodeert hex- en Unicode-escapes en hernoemt namen in _0x-stijl. Daarna toont hij het resultaat met een inspringing van 2 spaties. Dat gebeurt door de code te lezen, niet door hem uit te voeren: je JavaScript wordt nooit uitgevoerd en nooit geüpload, en een deel van de obfuscatie, hieronder opgesomd, blijft zoals het is.
Zo gebruik je de JS deobfuscator online
- Plak de code in Geobfusceerde JavaScript. Tot die tijd staat in het veld "Plak hier geobfusceerde JavaScript…". De limiet is 5.000.000 tekens.
- Kies Deobfuscatie-opties om vier selectievakjes te openen, alle standaard aan: Stringarrays uitpakken, Constanten berekenen, Hex- en Unicode-escapes decoderen en Hex-variabelen hernoemen. Haal het vinkje weg bij elke stap die je niet wilt.
- Druk op Deobfusceren. Het scherm Gedeobfusceerde code toont het resultaat als gemarkeerde code die je alleen kunt lezen.
- Lees de labels boven de code. Ze vertellen wat er is veranderd, bijvoorbeeld "3 arrayverwijzingen vervangen", "5 expressies vereenvoudigd", "2 literals gedecodeerd" of "4 variabelen hernoemd". Is er niets toegepast, dan staat er "Er hoefde niets uitgepakt of vereenvoudigd te worden, dus de code is alleen opnieuw opgemaakt."
- Druk op Kopiëren (wordt Gekopieerd) of .js downloaden om de code als gedeobfusceerd.js op te slaan.
- Kies Code bewerken om terug te gaan naar je invoer en het opnieuw te proberen met andere opties.
Is de tekst geen geldige JavaScript, dan zie je "Dit is geen geldige JavaScript: syntaxfout op regel N, kolom M." met de echte regel en kolom, en er wordt niets veranderd.
Wat elke optie doet
- Stringarrays uitpakken:
var a = ['x', 'y']; log(a[1]);(of'x|y'.split('|')) wordtlog("y");. De array wordt verwijderd zodra niets hem meer leest. - Constanten berekenen:
1 + 2 * 3,'a' + 'b',!![],!0enobj['key']worden7,"ab",true,trueenobj.key. - Hex- en Unicode-escapes decoderen:
'\x68\u0069'en0x1fworden"hi"en31. - Hex-variabelen hernoemen:
_0x1a2ben_0x3c4dwordenvar1,func1ofarg1, afhankelijk van hoe de naam is gedeclareerd.
De stappen draaien in die volgorde, dus een arrayverwijzing kan eerst worden uitgepakt en daarna door het berekenen van constanten met zijn buren worden samengevoegd. Eigenschapsnamen, labels en import- en exportnamen worden nooit hernoemd, en een shebang-regel bovenaan een script blijft behouden.
Een uitgewerkt voorbeeld
Deze invoer bevat een stringarray, een naam in hex-stijl, een eigenschap tussen aanhalingstekens en een som:
var _0x1a2b = ['hello', 'world', '\x68\x69']; function _0x3c(_0x4d) { console['log'](_0x1a2b[0] + ' ' + _0x1a2b[1], _0x4d, _0x1a2b[2]); } _0x3c(1 + 2 * 3);
En dit is het resultaat:
function func1(arg1) { console.log("hello world", arg1, "hi"); } func1(7);
De labels zijn "3 arrayverwijzingen vervangen", "5 expressies vereenvoudigd", "1 literal gedecodeerd" en "2 variabelen hernoemd". De echte uitvoer staat over meerdere regels met een inspringing van 2 spaties.
Wat hij wel en niet kan terugdraaien
De tool voert je code nooit uit, dus hij kan alleen terugdraaien wat in de tekst zichtbaar is. Alles wat eerst uitvoering van het programma vraagt, blijft staan in plaats van te worden gegokt.
- Wordt verwerkt: eenvoudige stringarrays (
var a = ['x', 'y']en'x|y'.split('|')) die alleen via een constante index worden gelezen. - Blijft staan: een array die bij het opstarten wordt geroteerd, de
push(shift())-truc van obfuscator.io. - Wordt verwerkt: constante berekeningen, samengevoegde strings,
!![]en!0, hex- en Unicode-escapes, hexgetallen en namen in _0x-stijl, zoals in de uitvoer van obfuscator.io. - Blijft staan: strings die via een opzoekfunctie worden gedecodeerd,
eval- ofFunction-strings die de echte code verbergen, control-flow flattening en obfuscatie op basis van een virtuele machine. - Opmaak: de code wordt opnieuw afgedrukt met een inspringing van 2 spaties. Opmerkingen worden verwijderd en de oorspronkelijke variabelenamen staan niet in het bestand.
Dit is een leeshulp, geen beveiligingsscanner. Hij controleert niet of code schadelijk is en kan onbekende code niet veilig maken. Komt een script van een bron die je niet vertrouwt, voer het dan niet uit alleen omdat de uitvoer er netjes uitziet.
Waarom een geroteerde stringarray blijft staan
Veel obfuscators schuiven de items van een stringarray met een korte lus heen en weer voordat hij voor het eerst wordt gelezen, dus list[0] is niet het eerste item dat je in de bron ziet. De zichtbare items invullen zou de verkeerde tekst in je code zetten.
De tool pakt een array daarom alleen uit als elk gebruik list[3] is met een getal binnen het bereik, of list.length. Wordt de array aan een functie doorgegeven, uitgebreid met push, opnieuw toegewezen of gelezen met een index die de tool niet kan uitrekenen, dan blijft die array precies zoals hij is geschreven.
JavaScript unminify online en grote bestanden
Geminificeerde code die niet is geobfusceerd komt opnieuw opgemaakt terug met een inspringing van 2 spaties, en het label zegt dat alleen de opmaak is veranderd. Zo werkt JavaScript unminify hier: korte namen als a en b worden niet hernoemd, omdat ze niet in hex-stijl zijn en de oorspronkelijke namen verdwenen zijn. Wil je code opmaken die al leesbaar is, of ook JSON, HTML en CSS verfraaien, gebruik dan Code Formatter. Om stylesheets weer te verkleinen is er CSS-minifier, en om een Base64-tekst te decoderen die je in een script hebt gevonden, Base64-converter.
Alles draait in een Web Worker, dus de pagina blijft ook bij grote bestanden vlot. Zeer lange of diep geneste expressies kunnen te veel zijn voor de pagina, en dan meldt hij dat de code te groot of te diep genest is om hier te verwerken.
Veelgestelde vragen
Hoe werkt de JS deobfuscator?
Plak de code in "Geobfusceerde JavaScript" en druk op "Deobfusceren". De code wordt omgezet in een syntaxisboom, stringarrays worden uitgepakt, constanten uitgerekend, escapes gedecodeerd en _0x-namen hernoemd, waarna de boom weer als ingesprongen code wordt afgedrukt. Kopieer hem of druk op ".js downloaden" om gedeobfusceerd.js op te slaan.
Is er een JavaScript deobfuscator die online werkt?
Ja, deze pagina is er een. Hij draait in je browsertabblad: de code wordt in een Web Worker geanalyseerd en nooit geüpload of uitgevoerd. Hij verwerkt eenvoudige stringarrays, constante expressies, hex- en Unicode-escapes en namen in _0x-stijl. Hij draait niet elke soort obfuscatie terug, en de lijst van wat blijft staan vind je op deze pagina.
Werkt hij als obfuscator.io deobfuscator?
Alleen voor de delen waarvoor geen code hoeft te draaien. Hex- en Unicode-escapes worden gedecodeerd, constanten uitgerekend en _0x-namen hernoemd naar var1, func1 en arg1. De stringarray die obfuscator.io bij het opstarten roteert met push(shift()), en strings die via een decoderfunctie worden opgehaald, blijven staan, omdat terugdraaien betekent dat je de code moet uitvoeren.
Hoe decodeer ik hexstrings in geobfusceerde JavaScript?
Laat "Hex- en Unicode-escapes decoderen" aangevinkt onder "Deobfuscatie-opties". Een string als \x68\u0069 wordt hi, en een hexgetal als 0x1f wordt 31. Alleen escapes in de code zelf worden gedecodeerd; een hexstring die het programma tijdens het draaien opbouwt niet.
Werkt hij ook als JavaScript unminify online?
Ja, de uitvoer wordt altijd opnieuw afgedrukt met een inspringing van 2 spaties, dus geminificeerde code wordt leesbaar ook als er niets uit te pakken viel. Het resultaat toont dan "Er hoefde niets uitgepakt of vereenvoudigd te worden, dus de code is alleen opnieuw opgemaakt." Opmerkingen in de invoer worden verwijderd. Geminificeerde variabelenamen als a en b zijn niet terug te halen.
Voert de tool mijn JavaScript uit?
Nee. De code wordt alleen gelezen en als tekst herschreven. Er is geen eval, geen Function-aanroep en geen uitvoering in de pagina of de Web Worker, en daarom blijven geroteerde arrays en decoderfuncties staan. Het is ook geen veiligheidscontrole: de uitvoer leest makkelijker, maar een scanner of een oordeel over malware is een ander karwei.
Waarom bleef een stringarray in de uitvoer staan?
Een array wordt alleen uitgepakt als elk gebruik een constante index is zoals list[3] of list.length. Roteert de code hem ook, geeft ze hem door aan een functie, voegt ze er items aan toe of leest ze hem met een berekende index, dan blijft de array helemaal ongemoeid, omdat het vervangen van de leesacties daar de verkeerde string kan opleveren.
Wat doet "Hex-variabelen hernoemen"?
Het geeft namen als _0x1a2b een leesbare naam: var1 voor variabelen, func1 voor functies en arg1 voor parameters. Elk gebruik wordt tegelijk hernoemd, een naam die al in het programma staat wordt niet hergebruikt, en eigenschapsnamen en labels blijven onaangeroerd. De oorspronkelijke namen kan het niet terughalen, omdat ze niet in het bestand staan.
Hoe groot mag de code zijn, en wat als er een fout in zit?
Tot 5.000.000 tekens. Is de code geen geldige JavaScript, dan zie je "Dit is geen geldige JavaScript: syntaxfout op regel N, kolom M." met de echte cijfers, en er wordt niets veranderd; je tekst blijft in het veld staan zodat je de plek kunt herstellen.
Wordt mijn code ergens geüpload?
Nee. Parsen, herschrijven en afdrukken gebeuren allemaal in je browser, in een Web Worker, en er wordt niets naar een server gestuurd. De code wordt ook nooit uitgevoerd.
Aanbevolen
-
CloudValley Webcam Cover Slide (2 stuks)Schuif hem dicht terwijl je een script leest dat je niet vertrouwt, dan blijft de camera privé.
-
YubiKey 5C NFC beveiligingssleutelEen hardwaresleutel voor de accounts die je beschermt terwijl je in andermans code duikt.
-
Kingston IronKey Vault Privacy 50 versleutelde USB-stickBewaar verdachte samples die je opslaat op een versleutelde stick met pincode.
Help de tools gratis te houden. ✨
Afbeeldingen dienen ter illustratie. Als Amazon-Partner verdien ik aan in aanmerking komende aankopen.