Skip to content
Malwagon
Sign up

OneShot run

In one sentence

OneShot Run is the Malwagon module that executes one sample on several Windows builds from a single submission: it takes one uploaded file and a list of builds, runs that file on each build inside a full virtual machine, and returns a screen recording and a launch record for every build. It runs no analysis layers of its own, so it produces no score, no indicators and no behaviour report.

Input
Exactly one uploaded file, over 0 and up to 128 MB. No source link, no hash, no supporting files, no archive password, no pre-script and no start arguments: this form carries bytes and a guest list, and nothing else.
Guests
One to six Windows builds spanning Server 2012 R2 to Server 2025, or the fixed domain-joined pair. The Linux sandbox is not offered on this module.
Window
10 to 600 seconds per image, 120 by default, capped by plan before a credit is debited. An image finishes early once the sample has drawn what it draws and the guest goes quiet.
Layers
None. No static parse, no behavioural scoring, no threat intelligence, no AI narrative. The pipeline branches here and returns before all of them, and the scan completes with an empty verdict.
Output
A screen recording per image, and a per-image record of whether that guest came up, whether the sample actually launched, and how long it took to launch.
Billing
One credit per selected image. Every other module on this rail is one credit for the whole scan, and the arithmetic is shown before you submit.

A module that executes and photographs, and runs nothing else

The other six modules on this rail all end in a verdict. OneShot never reaches one, and that is a property of the code path and not a setting you turned off: the scan branches here and returns before the static layer, before the behavioural layer, before the AI layer, and before the threat-intelligence enrichment that every other module gets whether you tick anything or not. There is no verdict at the end, no score, no tags, no IOCs, no technique mapping, no rule hits and no process tree. What comes back is the screen, per image, with a plain statement of whether the file ever started.

That narrowness buys two answers no scored report gives you cleanly. The first is build dependency. A loader can resolve an API that only a newer runtime carries and fall over on an older one; the same installer can quietly no-op on the oldest image you still have in production. The second question is blunter, and analysts ask it constantly during triage: what does this thing put on screen? A ransom note, a fake updater, an error dialog, a decoy document, or nothing at all. One submission answers both, on real hardware-virtualized guests, with the same bytes on each one.

Nothing about the sample leaves this host

The no-upload invariant holds across Malwagon, and this module has nothing to make an exception for: not even a hash is sent out, because there is no intelligence layer here to send one to. For an internal artefact that must not be seen to exist anywhere else, OneShot is the module where "nobody was told about your file" follows from the shape of the pipeline. No setting has to be remembered, because there is no setting to get wrong on a module with nothing to disclose. Detonation happens on hardware the operator runs, and the disk the sample writes to is discarded when its image finishes.

What kind of machine does the sample run on?

Each image is a full virtual machine under a hypervisor, on hardware the operator owns and administers. No container stands in for Windows and no emulator approximates it: the guest is a real Windows installation with a disk, a desktop, a signed-in profile and documents sitting on it. Its disk is a disposable layer stacked on a read-only golden image, and that layer is thrown away when the image finishes, so what one sample writes is not carried into the next image or into anybody else's run.

On the standard isolated path the guest does not boot for you. It is restored from a live memory snapshot of a desktop that had already booted, signed in and settled, so the machine the sample lands on is a used workstation with uptime behind it and its own idle background activity, and the restore takes seconds where a cold boot takes minutes. Domain runs and staged manual-execution peers are the exception: they come up cold, and the section below says what that costs you.

The recording is taken from outside that machine. Frames are read off the guest framebuffer by the host through the hypervisor, so the capture is not a process inside the session the sample is attacking. The one component that does live in the guest is asked for a single fact, the launch, and it supplies detail the outside view cannot: the report says so where that detail came from.

Where each part of a OneShot record is taken from
Part of the recordTaken fromWhat follows from that
Screen recording the guest framebuffer, read by the host through the hypervisor The guest holds no recorder process for a sample to enumerate or stop, so the frames already written stay written when the session is torn down.
Launch, and seconds to launch the component inside the guest, over the run transport A second source, added to the screen and not standing in for it. Where it goes quiet, that silence is itself an outcome in the record.
Outcome and end of run the host, from the guest's own lifecycle A guest that stopped answering is reported as a guest that stopped answering, and not as a window that simply expired.
Network attachment the host, at the moment the guest is joined to a network The plan decides which network exists for that guest. The form is the first gate; the attachment is the one that holds.

One sample, up to six Windows builds, one recording each

ONE SUBMISSION, SIX GUESTS, ONE RECORDING EACH One uploaded file up to 128 MB one credit per image Windows Server 2012 R2 Windows Server 2016 Windows 10 Windows 11 Windows Server 2022 Windows Server 2025 PER IMAGE Kept when the screen visibly changes Timed frames even when it does not Denser at the start of the run, and around what you do on console The frame it ended on Grouped per image on the report WORKGROUP IMAGES RUN IN TURN one guest at a time, each on a disposable disk that is discarded when that image finishes
A workgroup OneShot run. The same bytes reach each selected build, the builds are brought up one after another, not together, and a separate recording is kept for each. Anything that differs between two recordings is a property of the build, because nothing about the file changed.

Selecting six images is a differential experiment, not one analysis repeated six times by hand. The wall clock follows from that: it is roughly the sum of the per-image windows plus each bring-up, not the longest of them. A short window across many builds and a long window on one or two are the two shapes that work well; a long window on every image is a long run, and the submission page states a measured per-image start estimate drawn from this deployment's own recent scans, marks which images are already standing by, and moves when you toggle internet access because that selects a different guest.

The six images, what each can be, and where an office document will actually open
ImageRole in domain modeProductivity suite installedSelectable on Community
Windows Server 2012 R2workgroup onlyNoNo
Windows Server 2016domain controllerNoNo
Windows 10joined clientYesYes
Windows 11workgroup onlyYesYes
Windows Server 2022workgroup onlyNoNo
Windows Server 2025workgroup onlyNoNo

An image an operator has taken out of rotation, or whose golden is missing, is gone from the picker before you choose it, so no selection fails at run time for want of an image. If one fails during a run it fails alone, with a reason written into that image's row, and the remaining images continue. A failure at the containment boundary is the exception. That one is raised and it ends the image outright, because the only other way for it to finish is to hand you a guest whose isolation was not what the plan said.

What "behaviour that depends on the build" actually means

The phrase covers several unrelated mechanisms, and they do not read the same way on a recording. Knowing which one you are looking at is most of the work, because two of them are facts about the sample and the rest are facts about the image it landed on.

Classes of divergence between builds, and how each one shows on screen
ClassWhy the builds differHow it looks in the recording
API surface An exported function exists from a certain build onward and is absent before it. The newer images draw the sample's own window; the older one draws a system error about a missing entry point, or nothing at all after a recorded launch.
Runtime dependency A managed runtime, script host or redistributable is present on some images and not others. A prompt offering to install something, a version complaint, or an immediate exit with the desktop untouched.
Client and server branch The sample reads the product type and takes a different path on a workstation than on a server. Two clean recordings that share nothing: a full sequence on one family, an idle desktop on the other, both with a launch recorded.
Shell association Whether a handler is registered for the file type at all, which is what the office column in the matrix is about. The document opens and renders on the image that carries a suite; elsewhere the desktop stays as it was.
Shell and dialog shape The operating system draws its own dialogs differently between versions. The same decision, wearing a different window. A difference in pixels here is not a difference in behaviour, and it is the most common false read.
Time to a usable desktop An older image spends more of the window getting to a desktop, especially on a cold boot. The same sequence, further from finished when the window closes. Compare the seconds-to-launch column before concluding the sample behaved differently.

What does the guest do with the file you send?

OneShot has no file typing of its own and no unpacking stage. The extension on the name you submitted is the routing decision inside the guest, which is worth understanding before you submit, because it decides whether anything runs at all. Three treatments exist and there is no fourth.

How the submitted name is treated in the guest
TreatmentExtensionsWhat happens in the guest
Runnable, name kept .exe .bat .cmd .ps1 .com .scr .dll .msi .js .jse .vbs .vbe .wsf .hta Placed on the desktop under its own name and launched there, with a standard non-elevated user token. Fourteen extensions, and the launch is the event the run record is built around.
Document, name kept .doc .docx .docm .dot .dotm .rtf .xls .xlsx .xlsm .xlsb .xlt .xltm .ppt .pptx .pptm .pps .ppsx .pot .potm .pdf .one .pub .vsd .vsdx .xml .mht .htm .html .chm Opened through the shell association, which is the path a recipient's double click takes. Whether an association exists is read off the image and not assumed, so a maldoc opens where the office suite is installed and shows a bare desktop where it is not.
Everything else .zip .7z .rar .iso .bin, and any name with no extension Does not run Dropped with an executable extension, which the loader refuses for anything that is not a PE. The run reports that the sample never launched, and the recording is a still desktop.
The name decides whether anything executes intake
invoice_2287.docm    name kept      opened through the shell association
updater.exe          name kept      launched on the desktop, standard token
helper.dll           name kept      launched on the desktop, standard token
stage2.bin           renamed        loader refuses a non-PE: nothing executes
delivery.zip         renamed        nothing is unpacked, nothing runs
Unpack an archive and submit the payload itself, or send the container to file analysis, which does have a carving and unpacking stage. The stored sample is content-addressed and deduplicated by SHA-256, so submitting the same bytes twice under two names costs storage once and keeps both names on their own scans.

A domain controller and a joined client, up at the same time

THE DOMAIN PAIR, BOOTED AND RUNNING TOGETHER DEDICATED ISOLATED SEGMENT both machines start together, and each start time is written into the record DOMAIN CONTROLLER JOINED CLIENT Windows Server 2016 Windows 10 Live domain peer the sample is staged on its desktop and left for you to launch by hand Runs the sample auto-launched on its desktop with a standard, non-elevated user token BOTH SCREENS, LIVE, IN ONE CONSOLE a recording is kept for each machine, and ending the run closes both, not only the one that reads the signal first
Domain mode is a fixed pair on a segment of its own. The roles shown here are one of the two choices: nominate the controller instead and the arrangement inverts, with the client left up as the staged peer. Either way both machines are genuinely running, and the console shows both screens side by side.

A large class of samples is uninteresting on a lone workgroup box and behaves normally the moment a domain exists around it. What such a sample looks for first is whether it landed on a joined machine, and on a standalone guest the answer sends it down the path it takes when it has arrived somewhere it did not want to be. The recording you get is a program declining to do anything. That is not a milder version of the test you wanted; it is a different test with a different answer, and the pair is what makes the first one available at all.

Membership is not one flag that a guest could be told to report. A joined machine has a computer object in the directory and a machine account behind it, an interactive session backed by a domain account, policy that arrived when it booted, and name resolution that answers for the domain. Those are separate facts, held in separate places by different parts of the operating system, and a sample that cares about the answer usually reads more than one of them before it commits. On the pair every one of them is true at the same time, because the controller is a Windows Server genuinely holding the domain and the client is genuinely joined to it. Nothing is standing in for the directory, so nothing has to hold up under a second question.

What the second machine changes, for the sample and for you
What the sample doesOn a single workgroup guestOn the domain pair
Reads its own domain membership The machine reports itself standalone, and a loader written for a joined host stops there. The machine is genuinely joined, so the check passes on its own merits and the next stage is the one you wanted to watch.
Enumerates the directory The query has nothing to answer it and returns empty. A running controller answers with a populated directory, and the sample's own reaction to that content is on the recording.
Reaches for credentials or a ticket There is no authentication peer, so the attempt fails before it is interesting. Authentication happens against a live controller on the segment, and both screens are recorded while it does.
Looks for a second host There is no second host to find. There is one, it is up, and anything that appears on its screen is captured in its own recording.
Reads the signed-in identity The account is local to that machine, so an identity or group lookup describes the guest and stops there. The session belongs to a domain account, so the same lookup returns a domain user, a domain, and group membership that a controller actually issued.
Looks for a managed endpoint No policy was ever applied, and a sample keying on a managed machine sees an unmanaged one and treats it as somebody's home computer. The client applied policy from the controller when it booted, so it presents as a managed endpoint because it is one.
Resolves a name on the network There is no server to answer for the domain, and the lookup fails before anything it was setting up can happen. The controller answers, the lookup succeeds, and whatever the sample was going to do with the address is on the recording.
Waits to be started by a person One desktop, and the sample has already been launched on it. Two desktops. One ran the sample; on the other the file is staged and waiting for you to start it.

Choosing domain mode replaces the image selection with the fixed pair. That pair is checked against your plan while you are still on the form, so a refusal reaches you before you have uploaded anything and before a credit is debited. Both machines boot on a dedicated isolated segment and run concurrently, and each machine's start time is written into the stored record, so "they ran at the same time" is a fact you can audit later, off timestamps in your own scan.

Which machine you nominate is the one real decision this mode asks of you, and both answers are defensible. Nominate the client for anything that arrives the way a delivered file arrives: on a user's desktop, under a user's token, with a user's view of the domain, which is the situation most samples were written for. Nominate the controller when the question is what the sample does with a directory and elevated surroundings in the same place, and leave the client up as the domain peer it will look for. Either way the second machine is live for the whole window, so the choice moves where the sample starts and changes nothing about what exists around it.

The machine you do not nominate

The second machine is the more useful half of the design. The sample is placed on its desktop under its own name and deliberately not started, so you can execute it there by hand over the live console, at a moment you choose, from a machine and a session with a different relationship to the domain than the target has. A payload that does something meaningful only when it is launched on a controller gets exactly that opportunity while the domain around it is up. So does one that behaves differently under a human hand than under an automated launcher.

The peer earns its place even if you never touch it. It is a real member of the domain for the whole window, which is what makes the target's checks answer truthfully, and its screen is recorded throughout, so a message box, an installer or a logon prompt that appears there is evidence about lateral behaviour that a single-guest run cannot produce. Two recordings come back from a domain run whether you interacted with one, both or neither.

Both recordings carry capture offsets from the same run, which is what makes a two-machine test readable a month later. Launch the file on the peer partway through the window and that moment is locatable on the peer's own recording; go to the same offset on the target's recording and you can see whether anything arrived there, and how long after. A single guest cannot pose that question at all, because the question is about what one machine did to another while both were up.

What the pair writes down

The record for a domain run carries what a single-image run does, per machine, and two facts that only exist because there are two machines: which of them was the target and which was the live peer, and the start time of each. The console labels the roles while the run is live and the finished report repeats them, so a reader who opens the scan a month later does not have to work out which screen was which. Ending the run closes both machines, and neither is left running because the other stopped first.

Domain mode is the slowest configuration, by construction

The fast restore paths that make a workgroup guest available in seconds are disabled for both machines of a domain pair and for a staged manual-execution peer, so those guests come up from a cold boot. It is the price of a directory that is genuinely running, and it is why the pair is fixed at two images and cannot be combined with the other four. Community plans cannot select it at all, and the form says so on the page, before you have uploaded anything.

Recorded from outside the guest, and reported as two separate claims

The screen half of the output does not depend on anything the sample can reach. No recorder, driver or capture agent sits inside the machine, so a payload that ends every process in its session or takes the whole guest down does not remove the frames already written: the thing making them was never in the session it attacked. What such a payload leaves behind is a recording of it happening, up to the moment the screen stopped changing. The in-guest component reports one fact, the launch, and the recording does not rely on it.

Whole-frame comparison alone is not enough to build a recording on, and the capture here is designed around that limitation. A second dialog that replaces a first one in the same position scores below any threshold that also has to ignore a blinking cursor and a clock digit, so change alone would drop the screen you most wanted. Frames are therefore kept on a timer as well as on change, and the timer tightens at the start of the run and around your own actions on the console. The frame showing what was on screen when the run ended is kept past the storage bound, and past a comparison that would have discarded it. A byte-identical screen is not stored twice. It is recorded as a repeat annotated onto the frame it duplicates, so the timeline keeps the instant without keeping the picture again.

The second half of the output is the run record, and its central design decision is that "the VM came up" and "the sample ran" are answered separately. A guest that boots and is never handed its work produces a perfectly clean recording of an idle desktop, and reporting that as a success is how a broken run gets read as a harmless file. It is reported as a failure with a reason.

What is written down per image, and what each statement means
RecordedReading it
AvailabilityTrue only when the guest came up and the sample genuinely launched. It is not a liveness flag, and a run where only the first half is true is a failure.
LaunchedThe guest reported the sample starting. Where this is false the failure reason reads "the sample never launched in this guest", which on an unrecognised extension is the expected outcome and not a fault.
Seconds to launchFrom the start of that image's detonation to the sample starting. It is the number that separates a slow bring-up from a sample that stalled before doing anything.
Outcomefinished ran and settled, stopped ended from the console, timeout the window expired, agent_lost the guest went silent after launch. The last one is its own outcome, not a silence wearing a timeout's label.
Ran the sampleOn a domain run, which of the two machines was the target and which was the staged live peer. It appears in the live view and on the finished report.
Skipped, with a reasonAn image the run never reached because you ended the run early is written in as skipped with that reason, so an ended run does not read as a set of guests that silently broke.
Frame metadataPer frame: its ordinal, its image label, its capture offset in seconds from the start of that image's recording, a content signature, and the offsets at which the identical screen was seen again.

While the run is still going

The console is interactive, not a progress bar. Input is proxied into the running guest through an authenticated, permission-checked path with a staging gate that withholds keyboard and mouse until the sample is actually in the machine, so nobody clicks on a desktop that does not have the file on it yet. Three controls sit beside it.

Next image
Ends the current guest and starts the next one in the queue. The recording made so far is kept and the image is reported with the outcome it reached.
Extend
Adds a fixed step to the guest currently running, up to a hard total cap, for when a sample is mid-installer as the window runs out.
End run
Closes every machine, including both halves of a concurrent domain pair, and writes the images it never reached into the report as skipped.

How do you read two recordings of the same sample?

The report gives you one player per image, labelled with that image, carrying its frame count and the window it covered, and it says so on the card when the run was ended early. Playback follows the real capture offsets, so a quiet stretch plays as a quiet stretch and a burst plays as a burst; any frame can be opened full size to read dialog text off it. On a domain run the two players are labelled with their roles, and the one where the sample ran is marked.

Start with the launch record, not the pictures. Two images that both launched and then drew different screens is a finding about the sample. An image that never launched is not a difference in behaviour at all, it is a difference in whether the test ran, and reading it as evasion is the most expensive mistake available on this module. Once the launch column is clean, the differences between recordings are worth something.

Differences between two recordings of the same bytes, and what each one points at
What you seeWhat it points atWhere to take it
A window on the newer builds, a bare desktop on the oldest, launch recorded on both The code started everywhere and stopped early on the older runtime. File analysis on the oldest image, where the API-level trace says what it failed to resolve.
A system error dialog naming a component A dependency the image does not carry. Read the component name off the frame. It usually identifies the runtime the sample was built against.
Identical screens on every image Nothing about the build changes what the sample draws. Build dependency is answered and closed. The remaining question is what it did, which is file analysis.
Nothing drawn anywhere, launch recorded everywhere The sample works without a user interface. This module has given you its answer. Everything left is only visible in an instrumented run.
A document opens on one image and the desktop stays untouched on another The shell association, not the sample. Check the office column in the matrix above before reading it as anti-analysis behaviour.
A window appears, then the desktop returns The process exited, or removed its own interface. The end-of-run frame and the outcome column separate a sample that finished from a guest that was cut off.
Launched false on one image only That guest was not handed its work. A failed run for that image, and not evidence about the sample. Resubmit that image on its own.

The discipline that makes this work is that the input is fixed. The same bytes reach every guest under the same name, with the same privilege, on the same disposable disk arrangement, so a difference between two recordings has nowhere to come from except the build. That is the whole reason the module has no tuning controls: a knob you could set per image would put a second variable into an experiment with one.

What this module does not do

It shows what was drawn, not what was done
A sample that runs silently and works over the network produces a recording of a desktop that never changed, and that recording is not evidence of a benign file. Injection, persistence, C2, dropped payloads and the API-level picture live in file analysis, which instruments the guest and scores what it sees.
Privilege is fixed and not selectable
OneShot launches the sample with a standard, non-elevated user token, and no control on this form changes that. A sample that needs elevation to show its behaviour will show you a failed elevation instead.
There is no detonation tuning
The controls file analysis carries are not on this form at all: start arguments, type and export overrides, pre-scripts, work paths, environment shaping, and the memory, process and injected-image dumps. The one thing you can vary during a OneShot run is yourself: the live console passes real keyboard and mouse into the guest.
Archives are not unpacked
Neither is anything else with an unrecognised extension. It is renamed on the way in, so the loader refuses it and nothing executes. The report says exactly that, so a still desktop always arrives with its explanation attached.
Workgroup images run in turn, not together
Only the domain pair is concurrent. The live console is explicitly a queue with a control to move to the next image, and the wall clock is the sum of the windows plus the bring-ups.
Timed coverage has a gap you can reason about
Not every grab is stored, so a state that appears and vanishes between two stored frames can be missed. A raw frame stream would close that gap and would carry no bound that keeps it inside a report; the recording is the deliberate trade, and it is why the timer runs alongside change detection at all.
The recording starts once there is a desktop to photograph
A grace period covers the boot screen. On the fast restore path the guest already has a desktop and this costs you very little; on a domain pair, which cold-boots, it covers part of the way there.
The recording is bounded per image
The budget is a storage bound, not a judgement about the sample. Reaching it ends that image's recording for the remainder of its run, the report says that it was reached, and the end-of-run frame is still taken.
Documents need an image with an office suite
On a server image there is no association to open one with, so the recording shows a desktop and nothing else. That is a correct observation about the image, and it is why the matrix above names which images carry one.
Exports flatten the grouping
The PDF and DOCX reports embed a leading set of screenshots labelled by number, up to a bound. Per-image players, real-time offsets and repeat annotations exist on the web report only.
Console only
OneShot is not on the agent-facing MCP surface, which accepts no bytes for it, and not on the anonymous landing lane, which refuses it outright. It is a signed-in module.
What each plan can select on this module, enforced before a credit is debited. The window is per image.
PlanImagesWindowInternet guestDomain pairIn flight
CommunityWindows 10 and 11120 sNoNo1
Proall six300 sYesYes3
Businessall six600 sYesYes5
Team / Enterpriseall six600 sYesYes10

Monthly credits run 20, 100, 500 and 5,000 across those four rows, and the one-credit-per-image rule is what makes a six-image OneShot the most expensive single submission on the platform. Egress is the one setting the form does not decide at all: the network a guest is attached to is chosen at the moment of attachment, from the set of plans that may have it, so a hand-crafted request asking for internet on a plan without it gets an isolated segment and no error worth exploiting. Community and anonymous traffic are structurally isolated, not isolated by a default that a request could argue with.

Where this module hands off

Choosing between OneShot and the analysis modules

Reach for OneShot when the question is about the build or about the screen: whether a sample behaves differently on an older runtime, and whether it draws anything at all. The same is true of the question a live domain answers. Reach for file analysis when the question is what it did, because that is where the instrumented run, the score, the indicators and the technique mapping are. A weaponised document additionally goes through the document module, and a PE that reads as a kernel driver through the kernel driver module. The two are not alternatives in practice: a OneShot run that shows a payload drawing its window only on one of six builds tells you exactly which image to select for the full analysis.

Visibility works the same here as elsewhere. Public by default, private on the plans that carry it, and Ultra Privacy destroys the recordings, the frame artifacts and the stored sample when the run finishes, leaving nothing to re-open or re-export. What never applied here in the first place is the outbound side of it: no hash, no indicator and no derived data leaves the host on this module, because no layer that would send one runs. The wider invariant is on the security page, and retention and deletion on the privacy page.

Sign in

Sign in

The analyst console and your scan history. Private scans and the API come with a paid plan.

or
Continue with Google

New team? Create a free account

Sign up

Create your account

Free tier: 20 scans a month, three sandbox images, reports public. No card required.

12 characters minimum

or
Continue with Google

By creating an account you accept the terms and privacy policy.

Already provisioned? Sign in