devirt.re
Create account
Menu

VMProtect devirtualization.

Automated VMProtect devirtualization for files you are authorized to analyze: an IDA database and readable pseudocode, with every protected function accounted for in a coverage ledger.

VMProtect · dispatch to control flowA virtual instruction streamREADADDTESTJUMPRecovered program structureIs the input in scope?Read the recordReject inputThe dispatcher is machinery.The recovered branch isthe program you investigate.Read the program, not the dispatch loop.VMProtect · dispatch to control flowA virtual instruction streamREADADDTESTJUMPRecovered program structureIs the input in scope?Read the recordReject inputRead the program, not the dispatch loop.
Protection changes the representation. The question is still what the program does.

What is VMProtect devirtualization?

VMProtect devirtualization is the recovery of readable program logic from functions that VMProtect has translated into bytecode for its own virtual machine. VMProtect runs that bytecode through an interpreter embedded in the protected file, so a disassembler shows the interpreter instead of the function. Devirt devirtualizes VMProtect 2.x and 3.x files as an automated service for authorized analysis, and reports every protected function in one of four proof states: proven, runtime-dependent, unresolved or permanently bounded.

The protection is the obstacle.
Understanding is the outcome.

What we support

  • VMProtect 2.x and 3.x intake
  • IDA database, annotated pseudocode and LLVM IR
  • Every protected function counted in the 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

Who uses VMProtect devirtualization

VMProtect devirtualization is for teams whose VMProtect reverse engineering stops at the virtual machine and who need to read VMProtect-protected code they are allowed to analyze: malware analysts and incident responders working on protected samples, security researchers auditing software within an authorized scope, software owners recovering the logic of their own protected builds, and interoperability engineers verifying compatibility.

VMProtect is a commercial protector that malware authors also use, so the same VMProtect analysis serves defenders and software owners. Every upload requires authorization to analyze the file.

How Devirt recovers VMProtect code

VMProtect protects code in three ways: virtualization turns instructions into bytecode for a virtual machine, mutation replaces instructions with equivalent but more complex sequences, and Ultra mutates code and then virtualizes it. One protected file can mix all three with ordinary native code, and it can also be packed.

Devirt identifies the protection first, then treats each layer as a separate stage: unpacking for eligible packers, deobfuscation where supported transformations apply, and devirtualization of virtualized functions. The devirtualization stage reconstructs the virtual machine and its handler semantics, then reconnects virtual operations, branches and native exits into functions you can follow. Eligible operations receive formal checks before anything is called proven.

Four steps for a VMProtect file: upload an authorized file, identify packing, mutation and virtualization, recover each layer in its own stage, then verify and deliver with the coverage ledger.
Illustration. Each protection layer gets its own stage, and every counted function stays in the ledger.

What you receive

A VMProtect devirtualization result is delivered in the formats you choose, each with the coverage ledger and a proof summary. The IDA output is checked after it is saved and reopened.

  • IDA database (.i64): proven functions, named imports, typed API calls and the coverage ledger
  • Annotated pseudocode (.c): readable C with semantic naming and function-level commentary
  • LLVM IR (.ll): the lifted intermediate representation for your own toolchain
  • API JSON: structured findings and coverage for automated workflows
  • Full RE report (.pdf): architecture, behavior and an executive summary
Five output formats for a VMProtect result: IDA database, annotated pseudocode, LLVM IR, API JSON and a full RE report, each delivered with the coverage ledger and a proof summary.
Illustration. You choose the formats; the evidence travels with each.

How the evidence is reported

Devirt counts the protected functions in scope before recovery starts and reports every one of them in one of four proof states, so a function that was not proven cannot drop out of the result. A counterexample or a timeout never counts as proof.

  • Proven: verification evidence within a declared scope
  • Runtime-dependent: a real input or environment state is needed to finish the conclusion
  • Unresolved: inspected, but the available evidence did not settle it
  • Permanently bounded: outside an explicit analysis limit
A bar of all protected functions counted before recovery, split into proven, runtime-dependent, unresolved and permanently bounded, with a definition of each state.
Illustration: segment sizes are not a result. The four states always add up to the counted total.

Unpacking vs devirtualization for VMProtect files

Unpacking a VMProtect file does not devirtualize it. VMProtect packing compresses the file and unpacks it in memory when the program starts, but virtualized functions never return to native instructions, so an unpacked file still hides its virtualized functions behind the virtual machine. Recovering those functions is the devirtualization step.

Authorization and confidentiality

Devirt accepts only files you own or are authorized to analyze, and a supported VM family does not by itself establish permission to analyze a particular binary. The acceptable use policy prohibits unlawful circumvention and redistribution without rights.

Each file is analyzed in isolation, is never shared between customers and is not used for training. Confidentiality, EU requirements and exclusivity can be agreed before transfer.

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.

Standard automated jobs have a 24-hour SLA; eligible express jobs have a one-hour SLA. Novel engagements use an accepted offer, a 72–168 hour window, and senior review before release.

Compare starting prices

VMProtect devirtualization: questions and answers

Does Devirt support VMProtect 3.x?

Yes. Automated intake covers VMProtect 2.x and 3.x. Family recognition is an intake decision, not a guarantee for every build, and custom behavior or several protection layers can require a separate assessment before any work is agreed.

Is Devirt a VMProtect devirtualizer I run myself?

No. Devirt is a service: you upload a file you are authorized to analyze, Devirt identifies the protection and agrees the scope, and you receive the outputs you chose with the coverage ledger. The methods behind this work are explained in Devirt research.

Does a VMProtect file need unpacking before devirtualization?

Unpacking alone never removes VMProtect virtualization. Devirt identifies the protection at intake, and its analysis path includes a separate unpacking stage for eligible packers before devirtualization starts.

What happens to functions that cannot be proven?

They stay in the result. Every protected function counted before recovery ends up proven, runtime-dependent, unresolved or permanently bounded, so you can see what the evidence covers and what it does not.

How long does VMProtect devirtualization take?

Standard automated jobs have a 24-hour SLA, and eligible express jobs have a one-hour SLA. Novel engagements use an accepted offer, a 72 to 168 hour window and senior review before release.

Is it legal to devirtualize VMProtect-protected software?

Devirt accepts a file only when you own it or are authorized to analyze it, for purposes such as security research, malware analysis, interoperability and compliance verification. The rules differ between jurisdictions and licenses, so confirm your own basis before uploading.

Can I see an example before uploading?

Yes. The site has a synthetic sample assessment that shows the report format: architecture signals, the proof plan, scope boundaries and the decision path. It is a public teaching sample built for the purpose, not a customer result.

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.

Create account

Find the right plan