devirt.re
Create account
Menu

JavaScript VM deobfuscation.

Recover readable logic from virtualized JavaScript you own or are authorized to assess, for malicious-script analysis, front-end security reviews and research.

JavaScript · script to meaningauthorized-script.jsconst result = run(bytecode, input);Virtual instructions hide the useful logic.Recovered function and inputsBrowser / environment boundary{ inspect(record) }Readable behavior, with runtime assumptions.Understand logic and its browser dependencies.JavaScript · script to meaningauthorized-script.jsconst result = run(bytecode, input);Virtual instructions hide the useful logic.Recovered function and inputs{ inspect(record) }Readable behavior, with runtime assumptions.Understand logic and its browser dependencies.
Protection changes the representation. The question is still what the program does.

What is JavaScript VM deobfuscation?

JavaScript VM deobfuscation is the recovery of readable logic from JavaScript that an obfuscator has compiled into custom bytecode for a small interpreter shipped inside the script. Devirt analyzes virtualized JavaScript that you own or are authorized to assess, and it reports what it recovered with a coverage ledger that separates proven logic from everything that is not proven.

The protection is the obstacle.
Understanding is the outcome.

What we support

  • Virtualized and obfuscated JavaScript you are authorized to analyze
  • Malicious scripts, front-end security reviews and research
  • Readable logic, a behavior report and a coverage ledger

Family recognition is an intake decision, not a guarantee for every build. Custom behavior and multiple protection layers can require a separate assessment.

What changes in your workflow

Virtualization replaces ordinary instructions with a custom interpreter. Devirt recovers meaningful operations and program structure so you can investigate behavior in your own tools.

The delivery pairs readable output with a full ledger for the agreed scope. Proven, runtime-dependent, unresolved, and permanently bounded units remain distinguishable, including units that were never virtualized.

See how the checks work

Why ordinary JavaScript deobfuscators stop short

Common JavaScript deobfuscators work on the text of the code: they decode strings, rename variables and simplify expressions until the script reads normally again. That is enough for string encoding and name mangling.

Virtualized JavaScript is different. The protected functions no longer exist as JavaScript at all. What remains is a dispatcher that reads opcodes from a data blob and runs small handler functions, so the logic lives in the bytecode rather than in the code a deobfuscator rewrites. Obfuscators can also regenerate the interpreter for every build, so an instruction set worked out for one script does not carry over to the next.

Diagram: a readable JavaScript function is replaced by bytecode and an interpreter that runs small handlers, and analysis of the interpreter maps the opcodes back to readable logic with a coverage ledger.
Virtualized JavaScript keeps its logic in bytecode run by an interpreter shipped inside the script, so deobfuscators that rewrite the text of a script do not reach it.

Who uses JavaScript VM deobfuscation

JavaScript VM deobfuscation serves people who need to know what a virtualized script does and who are authorized to find out.

  • Security teams and malware analysts investigating malicious scripts, such as skimmers or droppers, found on their own or a client's systems
  • Front-end security reviews of your own code or a client's code, including third-party scripts you are authorized to assess
  • Researchers studying virtualization obfuscation within an authorized scope

What Devirt does not do

Devirt does not help bypass bot protection, anti-fraud systems or access controls, scrape websites or evade detection. JavaScript analysis is for code you own or are authorized to assess, and Devirt can decline a job and ask for the scope or the authorization to be clarified.

Two lists: in scope with authorization are malicious scripts, security reviews of your own or a client's front end, and research, leading to a free assessment; refused are bypassing bot protection, anti-fraud or access controls, scraping websites and evading detection.
JavaScript analysis is for code you own or are authorized to assess. Work that bypasses protections, scrapes websites or evades detection is refused.

What you receive from a JavaScript VM analysis

A JavaScript result explains what the virtualized code does, which interfaces it uses and which runtime conditions it depends on. Exact build and output eligibility are checked at intake, and every delivery includes the coverage ledger for the agreed scope.

  • Readable recovered logic
  • A full report on behavior, interfaces and runtime dependencies
  • API JSON with structured findings and coverage for automated workflows
Three deliverables (readable logic, a behavior report and API JSON) above the coverage ledger's four states: proven, runtime-dependent, unresolved and permanently bounded.
Every delivery includes the coverage ledger, and its four states always add up to the total. Segment sizes are not a result.

How the evidence in a JavaScript result is reported

A JavaScript result counts every unit in scope and places it in one of four states: proven, runtime-dependent, unresolved or permanently bounded. The four states add up to the declared total, so code that was not proven stays visible instead of dropping out of the count.

Virtualized JavaScript often depends on the page, the browser or data fetched at run time. Behavior that depends on those conditions is reported as runtime-dependent rather than presented as proven.

How to start: the free assessment

Every JavaScript VM job starts with a free assessment. Devirt reviews the script, states the scope, the estimated coverage and the timeline in a written offer, and nothing is charged unless you accept it.

Limits, and what happens when recovery stops short

Recognizing a JavaScript virtual machine at intake is an eligibility decision, not a guarantee for every build. Custom interpreters or several layers of obfuscation are reviewed in the assessment before any work is priced.

When part of a script cannot be proven, the result says so. It stays in the ledger as runtime-dependent, unresolved or permanently bounded, so you can decide whether the evidence answers your question.

See what lands on your desk.

One recovered program. Different ways to work with it. Inspect a teaching example, switch formats, and follow the link back to its evidence.

Example deliverableSynthetic data · not a customer file
Same logic. A different view.
VirtualizedInstructions through a VM
Protected logicTeaching VM / instruction listing
; Authored teaching VM, not vendor bytecode
00  LOAD32  r0, input.size
01  PUSH    r0
02  PUSH    0x10
03  UGE
04  STORE   p0
05  LOAD32  r1, input.magic
06  PUSH    r1
07  PUSH    0x44565254
08  EQ
09  LOAD    p0
10  AND
11  RET
DevirtualizedThe deliverable you can inspect
validate_recordC / sample function
#include <stdbool.h>
#include <stdint.h>
 
bool validate_record(uint32_t size, uint32_t magic) {
  const uint32_t header_size = 16u;
  const uint32_t expected_magic = 0x44565254u;
 
  if (size < header_size) {
    return false;
  }
 
  return magic == expected_magic;
}

Drag the divider to reveal the difference. Or choose a view above. Keyboard: arrow keys, Home and End.

In ordinary language

Check the declared size. Check the type marker. Accept only when both checks pass.

The evidence travels with the file.

Readable code explains the behavior. The ledger explains how far you can rely on it.

Download teaching source

Original teaching material, not customer output. The IDA view illustrates a database's contents; it is not a downloadable .i64. No measured proof or service benchmark is claimed by these examples.

Your build determines
the final scope.

Every JavaScript VM job starts with the free assessment: Devirt reviews the script, estimates coverage and sends a written offer, and nothing is charged unless you accept it.

Start a free assessment

JavaScript VM deobfuscation: questions and answers

How is this different from an online JavaScript deobfuscator?

An online deobfuscator rewrites the text of a script, which is often enough for encoded strings and renamed variables. Virtualized JavaScript keeps its logic in bytecode run by an embedded interpreter, so recovering it takes analysis of the interpreter and its instruction set. Devirt handles that case and reports its evidence.

Is JavaScript deobfuscation legal?

Devirt analyzes only code you own or are authorized to assess, for purposes such as security research, malware analysis and interoperability. Unauthorized intrusion, evading security controls in an unauthorized environment, unlawful circumvention and redistribution without rights are prohibited under the acceptable use policy.

Can Devirt help bypass bot protection or scrape a website?

No. Devirt does not help bypass bot protection, anti-fraud systems or access controls, scrape websites or evade detection, and it declines jobs with that purpose.

Which JavaScript obfuscators does Devirt support?

Intake checks each build, and the free assessment states whether a script is in scope before any work is priced. Custom interpreters are assessed individually.

What happens to the script I upload?

Your file is analyzed in an isolated environment and used only for the work you requested. Nothing is shared between customers and nothing is used for training. Input is deleted after completion and delivery, and released output stays available for 72 hours by default or 30 days on Team.

What if part of the script cannot be recovered?

It stays in the coverage ledger as runtime-dependent, unresolved or permanently bounded instead of disappearing from the result. You see exactly what was proven and what was not.

Your binary stays your business.

Isolated analysis. No sharing between customers. No training on your upload. Your file is used only for the work you requested.

Read the data-handling policy
Input

Your uploaded file

Isolated processing

In scope
Output

Your result files

Not yet released

In scope
Audit

Processing record

Recording the work

In scope
Different data. Different clocks.

Input deletion follows delivery. This timeline shows the default 72-hour output window. Team outputs are kept for 30 days. Audit records have a separate 90-day window.

Policy illustration, not a live deletion certificate. Deletion is confirmed from provider receipts. Assessment inputs, unpaid jobs, and account/billing records have their own rules in the policy.

What do you need to understand?

Start in your account. If your upload needs manual work, we review it and email you a written scope and quote before paid work begins.

Create your workspace

Create an account, verify your email and upload your file. We review custom work and email your scope and quote.

Start a free assessment

Find the right plan