Skip to content
Malwagon
Sign up

File analysis

What this module is

Malwagon file analysis takes one submitted file, detonates it in a sandbox that is a full virtual machine under a hypervisor on hardware the platform operates, and returns a report of what the file is, what it did on that machine, and which indicators it produced. The guest is a Windows or Linux install restored from a live memory snapshot onto a disposable disk, and the packet capture, the screen capture and the memory image are taken from outside it.

Sample
Any content type, 1 byte to 128 MB. Upload it, or hand over a http/https link and the analysis host fetches it for you.
Supporting files
Up to 10 more files, 32 MB each and 64 MB together, written into the same directory as the sample before the guest boots.
Protected containers
A password opens zip (ZipCrypto and AES), 7z, rar, cab, arj and lzh. The payload inside is what detonates, not the wrapper.
Detonation images
Seven, all live: six Windows client and server builds and a Linux desktop, plus a two machine Windows domain pair.
Run duration
10 s to 600 s, 120 s by default, extendable by two minutes from the live view while the run is still going.
Report
18 sections in five groups, with ATT&CK Navigator layer, STIX 2.1, a sharing event bundle, defanged IOC text, PDF and DOCX exports.

What the module takes in

The submitted name decides nothing. Typing is done on the bytes, and the content is what routes the sample: an upload called invoice.pdf that opens as a PE is analysed as a PE, and a file with no extension at all is identified the same way as one whose extension matches its bytes.

The static chain genuinely parses PE32 and PE32+ in every guise the format takes (EXE, DLL, SYS, SCR, OCX, CPL, COM, MSI), managed .NET assemblies, ELF for 32 and 64 bit in both endiannesses across x86-64, x86, aarch64, arm, mips and ppc64, Go-compiled binaries, Windows shortcut files, compiled script executables, Python source and Python packaging artifacts, and text and script payloads. Where the bytes open as a document, whether PDF, RTF, OLE, OOXML, OneNote, CHM, HTML or MHT, the document engine runs in addition to the general chain, and a PE whose imports and subsystem read as a kernel driver additionally gets the BYOVD analyzer. Neither of those re-routings changes the image you picked. The guest you chose is the guest that runs the sample.

Intake bounds, and what happens when a submission reaches one
InputBoundAt the edge
Uploaded sample 1 byte to 128 MB The ceiling is enforced by the streaming request guard before the body is buffered, so an oversized upload is refused before it is accepted and discarded. An empty file is refused too.
Source URL fetch 128 MB, 60 s, 5 hops 10 s to connect and 20 s to read, five redirects with every hop re-validated. Exactly one of upload or URL per submission; sending both is a validation error.
Supporting files 10 files, 32 MB, 64 MB total Placed beside the sample in the guest. They are the sample's environment, not separate submissions, and are not analysed as samples in their own right.
Protected archive a declared-size budget Read from the container listing first. An archive that declares more than the budget is refused from its own listing, before extraction writes anything, which is the case a zip bomb is built for.
Container extraction a shared budget Nesting depth, entry count and total bytes are bounded together, with a per-entry share inside that budget. Whatever the budget excluded is counted and named in the report, so nothing drops out of a scan quietly.
Run duration 10 s to 600 s Capped by plan: 120 s on the free tier, 300 s and 600 s above it. The live extension adds two minutes to a run already under way.
Anonymous scan 100 MB Fixed options, not defaults you can override: Windows 10, 120 s, isolated network, public report. The live extension is refused for these runs by design.

Fetched by the host, not by the guest

Give a link instead of a file and the analysis host performs the download; the guest does no fetching of its own, so the sample wakes up next to a file that was simply there. The fetcher carries no cookies, no proxy, no netrc and no Authorization header, refuses credentials embedded in the URL, and requires every resolved address to be publicly routable. Loopback, RFC1918, link-local, unique-local, CGNAT, multicast and reserved space are refused for IPv4 and IPv6 alike, including the v4-mapped, 6to4, Teredo and NAT64 spellings of a private address. Each redirect is re-validated as its own destination, and the socket is pinned to the address that passed validation, so the address that was checked is the address that is connected to.

What happens if the sample fights the sandbox instrumentation?

It keeps recording, because most of the recording is not inside the guest for the sample to reach. A run starts by restoring a golden image from a live memory snapshot of a settled desktop onto a copy-on-write overlay created for that run alone. That sandbox is a full virtual machine under a hypervisor on hardware this platform operates: a Windows or Linux install with its own kernel, brought back from a snapshot of a desktop that had already been up for a while, so the sample arrives on a machine with uptime, running services and a user profile that has been used. The sample, its supporting files and the launch task are written into that overlay offline, before the machine is powered on, so there is no staging step inside the guest for a sample to watch and no download for it to fingerprint. When the run ends the overlay is deleted, and the golden image underneath it is opened read-only, so state does not carry from one run into the next.

Four of the seven recording layers are agentless: they sit on the analysis host and observe the guest from outside it. The packet capture is taken at the hypervisor link, the screen is read from the framebuffer the guest paints into, the memory image is a copy of guest RAM taken host-side, and the dropped files are carved out of the run's own disk overlay once the machine is gone. None of the four is a process in the guest's operating system, so a process list does not show them and unhooking inside the guest does not reach them. Terminating something in the guest stops nothing on the host side of the boundary.

The in-guest component is a second source and not the only one. It supplies the API-level arguments the outside layers have no way to reconstruct, and a run in which the sample refuses, unhooks or removes it still has its network, its screen, its memory image and its dropped files. That is what the placement buys: detail from inside and durability from outside, with the report naming which of the two produced a given row.

ANALYSIS HOST Packet capture at the hypervisor link Framebuffer capture screen as the guest paints it Guest RAM image agentless kernel forensics Disk overlay read after the guest is gone GUEST VIRTUAL MACHINE restored from a live memory snapshot, disposable overlay, destroyed at the end GUEST KERNEL Kernel event trace Security audit log SAMPLE PROCESS In-process API monitor the one layer the sample can reach Outside the guest. Not a process in the guest's operating system. In the guest kernel, below the user-mode hooks a sample can restore. In the sample's own address space. A second source of detail, not the only source.
Sensor placement for one file run. The four on the host are not in the guest's operating system to be found; a sample that reaches the innermost layer leaves the six outside it recording.
The seven recording layers: where each one runs, what it records, and what bounds it
Layer Runs Records Bounded by
Packet capture Outside Traffic on the guest's link is captured at the hypervisor and parsed for DNS, HTTP request and response metadata, protocol classification, TLS client fingerprints (JA3 and JA4) and SNI hosts. It records the frames. Plaintext from inside TLS depends on the session key log described below.
Framebuffer capture Outside The screen as the guest paints it, on change detection and on timed keyframes, so a dialog that appears and disappears between frames is still caught. A record of what the guest painted, which is a different record from what it executed.
Guest RAM image Outside Agentless kernel forensics over the captured image: processes, threads, image loads, injected regions, drivers, kernel callbacks, the syscall table, handles, services, mutexes, network objects and tokens. Opt-in, and the longest post-run step. A run without it carries no memory layer, and the report states that.
Disk overlay read Outside Dropped payloads carved out of the guest's own disk overlay host-side, after the guest no longer exists, deduplicated by content and re-run through the identification chain. Read once the guest is gone, and read alongside the file layer's record of what was written while it was alive.
Kernel event trace Guest kernel Process and image events, registry writes, file create, delete and rename, and network activity, attributed to the sample's own process tree. It records that an operation happened and not the arguments behind most of them, which is what the in-process layer supplies. The operation classes it stands behind are published with the run.
Security audit log Guest kernel The command line of a process that started and exited between two polls, which is the one record that carries it reliably. Scoped to process creation.
In-process API monitor In process The arguments nothing else has: which key a registry value was written into, resolved from the handle at the moment of the call, WMI method arguments captured in the caller, remote-thread and cross-process write targets, RWX allocations, file creates, deletes and renames, module loads. It runs in the sample's own address space, which is the reason the other six are placed where they are.

Three sensors of different privilege therefore watch the same run, and where they disagree the disagreement is the finding. A thread whose start address lies outside every loaded module, present in the memory image and absent from the API stream, says more than either source would say on its own. So does a process the in-process monitor never announced turning up in a pool scan that the kernel's own object list does not mention. The monitor's own activity is identified and excluded, so instrumentation work is not charged to the sample.

TLS without a proxy and without a certificate

Plaintext from inside TLS is recovered from a session key log the guest exports, then applied to the capture afterwards. No traffic is terminated and re-originated, and no certificate is added to the guest's trust store, so there is no interception certificate for a sample to pin against. The limit is stated in the report: the cross-platform TLS stacks that honour the key-log convention are covered, the Windows system TLS provider does not export keys, and for those flows the SNI host and the client fingerprint are what remain.

What was refused is also evidence

Egress policy drop counters are bracketed around each run and the delta is reported. Several hundred refused connections on the mail ports is a mass-mailer identifying itself, and the platform records that identification without carrying out the abuse in order to observe it. The same accounting covers UDP amplification ports, attempts into private address space, link-local and CGNAT ranges, and the per-source connection rate.

Attribution, and the machine's own noise

A Windows desktop is busy whether or not you detonate anything on it, so every file, registry and network row carries an in-scope flag and the basis for it, derived from the sample's process tree and the pid it was actually launched as. Machine-wide activity is kept and labelled, neither deleted nor promoted, rows that name no actor are counted as their own class, and the summary counts are recomputed after demotion, so a chip on the page reports the same number of operations the table underneath it holds.

Behaviour panel of a file scan: one process, two registry operations, the process tree showing the sample with its pid and full path, and an attributed activity section scoped to that process.
The behaviour panel of a real PE run. One process, two registry operations, and an attributed-activity section pinned to that pid: the counts at the top are what survived scoping, not everything the sensors saw.

What is read off the bytes

Static analysis does not wait for the machine. It runs on the host while the guest is restoring, arming and detonating, under a hard budget, so it costs the analyst no wall-clock time at all. If it does outrun that budget the scan still completes and the static row is recorded as failed with its reason, which is a different report from one that quietly omits a layer.

sample launched run duration ends GUEST HOST, IN PARALLEL OUTSIDE THE GUEST AFTER THE GUEST restore arm sample runs shutdown static chain, in a namespace jail on the host packet capture and framebuffer capture memory, overlay, dumps The static layer is off the critical path: the analyst waits for the detonation, not for the parsers.
How one file scan is laid out in time. Only the opt-in memory work extends the finishing window, which is why the memory dump, process dump and injected-region carving are opt-in choices and not defaults.

Nothing you submit is executed on the analysis host. Parsers run inside a namespace jail with no network, a read-only view of the host filesystem, a private tmpfs, dropped capabilities and an unprivileged uid. The line is drawn by what a tool does with the bytes, not by how well it is confined: reading a structure is host work, and anything that would interpret, emulate or install goes to a guest.

The static document carries one key per layer and every key is present on every file scan, whether that layer had something to say or not, so an absent layer and an empty one are not the same thing to anything reading the JSON. The layers cover content typing and MIME identification, hashing, whole-file and per-section entropy, PE structure, Rich header decoding, exploit mitigation posture, .NET metadata and decompilation, ELF structure, Go build metadata, packer and protector detection, compiler and linker signature identification, code signing, entry-point disassembly, the anti-analysis instruction scan, strings, capability categorisation, secret detection, configuration extraction, compiled-script recovery, shortcut analysis, YARA, antivirus signatures, container extraction, and IOC derivation.

Structure, and what it is worth

PE parsing produces the header and optional header, then the section table with its characteristics and the section the entry point lands in. Next comes the import table, where every function is annotated against a 56-entry suspicious-API-to-ATT&CK map, and the export table is read out with it. The resource tree follows, each resource carrying a digest with its entropy and a detected content signature, and the application icon is rebuilt from it as a renderable icon file. Version info and the embedded manifest come next, as do the debug directory and TLS callback presence. The Rich header is decoded into its per-tool records, which is a fingerprint of the machine the binary was built on and it survives a forged compile timestamp; the linker build recorded there is compared against the optional header's own linker version as a tamper check. Nine exploit mitigations are graded strong, partial or weak for the binary under analysis, with the reason for each grade stated. Managed samples additionally give up their unmanaged import table, which the native import directory cannot show at all, and are decompiled to C# with the sample's own types separated from the bundled library and compiler-emitted types so the review is over code somebody wrote.

Section table of a PE sample showing three sections with virtual address, raw and virtual size, access rights as coloured chips, and a per-section entropy bar.
Per-section entropy, access rights and the section that holds the entry point, read straight from the section table. Entropy is shown per section, because a whole-file figure hides a small packed code section inside a large resource-heavy binary.
The nine fingerprint families computed on every sample and persisted on the sample record, where they drive search and clustering across every later scan and not only the one they were computed for
FingerprintComputed overWhat it survives
MD5, SHA-1, SHA-256The whole fileNothing. One flipped bit and they all change, which is exactly why the rest of this table exists.
Import hashThe ordered import tableRecompilation that keeps the same imports. Destroyed by packing, which is itself a signal.
Export hashThe exported symbol listClusters DLL families that share an interface but not a build.
Rich header hashThe cleared build-tool recordsA forged compile timestamp. It fingerprints the build box, not the file date.
Per-section digestsEach section's bytes, MD5 and SHA-256Finds one shared code section across two otherwise unrelated files.
Authenticode content hashThe image with checksum, security directory and certificate table excludedRe-signing and data appended after the signature. Two files that share it are the same code wearing different certificates.
Fuzzy hashThe whole file, context-triggered piecewiseSmall edits, and yields a 0 to 100 similarity score, so a near miss is visible as one.
Locality-sensitive hashThe whole fileYields a distance, so neighbours sort by how far apart they are. Very small inputs do not produce one, and those files do not cluster.
ELF symbol hashThe dynamic symbol listStripping of names that are not exported, and it is what makes Linux and IoT samples cluster at all.

Is high entropy the same as packing?

No, and this module does not treat it as such. A compressed container reads as high entropy, and so does a media file. A resource-heavy installer reads the same way, which is why the number on its own decides nothing here. A packing verdict is fused from signals that have to agree: section-name signatures for around 24 packer and protector families, entropy of executable sections specifically, sections that are both writable and executable, virtual against raw size anomalies, code sections with zero raw size, import sparsity together with the fingerprint of dynamic API resolution, an entry point that sits outside every section or in the last one or in a writable one, overlay presence and overlay entropy, embedded PE images or high-entropy blobs in the resource tree, literal packer markers, and TLS callbacks. Signals fuse per family. What comes out is a packed flag with a confidence beside it, a named family where one is identifiable, and a routing recommendation into detonation. Where the bytes are a container or a document or a media file, the entropy signals are left out of the fusion, because high entropy is what those formats produce by design.

Four installer builders and seven .NET obfuscators and protectors are recognised separately from packers. An installer is a distribution choice and an obfuscator a source-level one; neither is the same claim as compression at the section level.

Why does a signed file come back unverifiable?

Because the chain usually cannot be completed from inside an isolated environment, and the report publishes that fact under its own name. Chain building needs a network for revocation and a platform trust store to anchor against, and an isolated analysis environment has neither. Collapsing that into a red cross would be a claim about the file that the run did not support, so verification is published as three separate fields. The digest check against the file's own bytes is real and local, the chain evaluation is offline and says so, and the two are kept apart, each published under its own name.

The nine trust outcomes a signed file can land on
OutcomeWhat it means about the file
ValidThe digest matches the bytes and the chain evaluated cleanly with what is available offline.
TamperedThe digest does not match the bytes. The signature belongs to a file that is no longer this one.
Appended dataContent was added after the signed region. The signature is still valid over the part it covers, and something else is riding along outside it.
Self-signedThe signer vouched for itself. It proves the file has not changed since signing and nothing about who signed it.
Untrusted rootThe chain terminates somewhere that is not a recognised anchor.
ExpiredOutside the certificate's validity window. Common and often innocent for old software, and worth reading next to the compile timestamp.
RevokedThe certificate was withdrawn by its issuer.
Weak algorithmThe digest or signature algorithm is MD5 or SHA-1.
UnverifiableSigned, digest intact, chain not completable from inside an isolated environment. Most legitimately signed software lands here, and it is published under its own name, never folded into a failure it did not earn.

A heuristic and a cryptographic check are never collapsed into a single verdict. Each is published under its own name, in the section that owns it, so a guess is never printed with the weight of a verification.

Strings, capabilities, secrets and configuration

Strings are extracted as ASCII and UTF-16LE and then filtered against runs of opcode bytes that happen to print, which is what separates a real string from disassembly noise; emulation recovers stack strings, tight strings and strings the sample decodes with its own routine. API use is categorised into 20 behaviour categories: process injection, code execution, anti-debug, anti-VM, stalling, persistence, discovery, credential access, defense evasion, network and C2, cryptography, ransomware, keylogging, screen capture, privilege escalation, service manipulation, registry, dynamic API resolution, shutdown and hooking, all from a 147-entry Windows and 29-entry ELF map, each carrying ATT&CK ids and a severity tempered by context. Names resolved dynamically are recovered out of the extracted strings and folded in, as are managed P/Invoke names, so a sample that resolves everything at runtime does not present as importless. Capability detection runs a 1,045-rule corpus mapped to ATT&CK and a behaviour catalogue, cached per byte identity so re-scanning the same file returns instantly.

Secret detection uses 238 anchored detectors. They cover private keys, cloud provider credentials, source-control and CI tokens, package-registry tokens, chat and webhook URLs, mail and SMS providers, payment processors, model provider keys, database connection strings, observability and identity providers, social platforms and wallet material. Every match is redacted at the head and tail. Beside it runs a categorised corpus of 121 malicious-string markers in seven categories. Configuration extraction pairs a self-contained beacon configuration decoder with dispatch to 74 named-family parsers. The decoder reads transport, port, sleep and jitter, the C2 list, the user agent, the POST URI, the kill date, the watermark, the DNS idle value and the host header. Decoded C2 becomes a high-confidence indicator and not another string.

The anti-analysis instruction scan reads the executable sections for the primitives a sample uses to work out where it is: RDTSC and RDTSCP timing, the CPUID hypervisor probe, the SIDT, SGDT, SLDT and SMSW descriptor-table red pills, IN port I/O, INT 3 concentration, INT 2D and ICEBP. Each is reported with its concentration and its ATT&CK id, under a severity tempered by context: one RDTSC reads a timer, and a tight loop of them is a stalling check.

The sandbox you configure

The image you pick is the image that runs the sample; there is no silent re-routing to something the platform would rather run. Community accounts reach three of the seven images and paid plans reach all of them.

Seven golden images, all built, cloaked and live
ImageProductivity suiteDomain roleWhy you would pick it
Windows 10 22H2YesJoined clientThe default for verification runs and the only client half of a domain pair.
Windows 11 25H2YesNoneCurrent client behaviour, current mitigations, current shell.
Windows Server 2012 R2NoNoneOlder API surface and an older script host, for a sample that targets what is still in production.
Windows Server 2016NoDomain controllerBoots alongside the client for a domain run, with both screens streamed side by side.
Windows Server 2022NoNoneServer-side behaviour without the desktop assumptions a client image carries.
Windows Server 2025NoNoneNewest server build in the fleet.
Linux desktop, current LTSNoNoneELF payloads, shell droppers and the headless browser work.

Around that choice sits a detonation surface an analyst shapes per run. Part of it answers a check the sample makes before it will run at all; the rest gives a loader the conditions it was written for, or buys back time the run would otherwise spend waiting.

What can be set per run, and what each setting changes
SettingValuesEffect on the run
Execution modeAutomatic or manualManual stages the sample and hands you the machine over VNC, so you launch it yourself and drive the run.
Run as12 mappingsHow the guest starts the sample: as an executable, as a DLL by export name or ordinal through either standard host binary, as an installer package, as a screensaver, as JScript, VBScript, script host, HTA, PowerShell or batch, as a document by shell association, or auto-detected from content.
Work path7 choicesWhere the sample is written before launch: Desktop, Downloads, Temp, AppData, ProgramData, System32 or a path you give. Loaders that check where they were dropped behave differently in each.
Start argumentsFree textThe argv the sample is launched with, for a stage that expects a key or a mode flag from its parent.
Pre-scriptPowerShellRuns in the guest before the sample, for setting up the state the sample expects to find.
PrivilegeStandard or elevatedWhich token the sample starts with. A dropper that fails silently as a standard user is a result worth having on record.
Guest identity11 timezones, 14 localesDefeats the locale and region checks a sample makes before deciding whether to run at all.
Clock offsetForward or backMoves the guest's system clock, for kill dates and time-triggered payloads.
Minimum uptime0 to 600 sHow long the machine has genuinely been up before the sample starts, against a sample that treats a fresh boot as a sandbox tell.
Hardware2 or 4 vCPUs, 4 or 8 GB RAMAgainst the core-count and memory-size checks, and for a payload that needs the headroom.
NetworkIsolated or internetIsolated has no route off its own segment. Internet is a paid capability and is refused structurally for free and anonymous runs at the point the guest network is chosen.
DomainWorkgroup or Windows domainA real domain with a live controller booted beside the client, for anything that enumerates a directory or looks for a domain-joined machine. Valid on the two images above; asking for it elsewhere fails validation, and the platform never quietly downgrades the run you configured.
Trace depthLight, normal or deepHow much the in-guest layers record, against how much the parse of that trace costs.
Sleep bypassOpt-inFor a stager that waits out the observation window before doing anything.
Mouse simulation, fake user artifactsOpt-inAgainst checks for an idle pointer and an unused profile.
Memory dump, process dump, injected-region carvingOpt-inPost-run work the analyst waits through, which is why none of it is on by default. The memory pair dominates the finishing window.
Automatic unpackOpt-inStatic unpacking where the packer is one the chain can undo.
Custom memory YARA ruleYour ruleYour own rule text, scanned against the captured process memory dump for that run.
Archive passwordTextOpens a protected container so the payload inside is what detonates.

When the sample needs the rest of its kit

A first stage is often not a program that does anything by itself. It reads a configuration file that sat beside it in the archive, or a DLL expects its data file in the same directory, or a script decrypts a blob it looks for by name. Detonate that stage alone and it exits at its first read; the report is then a truthful account of a program that did nothing, which is a fact about the harness, and it tells you nothing about the sample.

Up to ten supporting files, 32 MB each and 64 MB together, are written into the same directory as the sample in the offline injection step, before the guest is powered on. The first stage finds the layout it was built for, and it finds the files already present, with nothing arriving mid-run for it to notice. Those files are the environment, not submissions: they are not typed, scored or reported as samples of their own. Where the kit arrived as one protected container, the password opens it host-side and the payload within is what is detonated, with the wrapper recorded but not run.

Manual runs and the input gate

In manual mode the guest is prepared and left to you over VNC. The input gate stays closed until the sample is actually on the machine, and it does not open on a timer for anyone; the panel names the stage the run is in, so a closed gate is not read as a dead console. The same live view carries the two minute extension while a run is still going.

What a finding rests on

A rule name printed in red is not evidence, it is a citation with the source removed. Every YARA match in a report shows which of the rule's declared strings actually matched and out of how many, how many instances there were, a short escaped window of the matched bytes, the corpus the rule came from and that corpus's tier, the exact number of points the match contributed, and a sentence saying why. That sentence includes the case where the answer is zero.

One row from the rules section report / rules
rule             fam_loader_generic_b
corpus           curated family set, benign-tested, may name a family
strings matched  3 of 7 declared, 6 instances
preview          $s2  "Global\\%s-%04x"
                 $s5  "%s\\%s.tmp"
contribution     the points this match added to the score, with a
                 sentence saying why it was worth that much
Illustrative shape, not a captured report. Every element shown here is present in the real row, including the sentence beside the contribution, which runs even when the match added nothing.

The corpus is over fourteen thousand rules across roughly fifteen hundred files, and it is scanned with real external variables supplied, being filename, extension, file type and digest, so filename-aware rules both fire and hold fire the way their author intended. The file's storage path and its owner are deliberately supplied empty, which keeps a rule's matching surface on the sample itself and off where this platform put the file or whose account submitted it.

Provenance decides what a rule is allowed to assert
TierSizeMay assertFamily vote
Built-ina small in-house setGeneral malicious-code patterns written and maintained here, published with the same evidence as every other match.None
Curated family set2,122 rulesMay name a malware family. Licence-gated and regression-tested against benign software before it ships.Counts
Curated aggregate~4,500 rulesMay confirm a family that something else already named. It never names one on its own.Confirmation only
Community feed and bulk~7,600 rulesShown with its evidence as context.None

A vote is a distinct rule identity from a distinct upstream repository, so a rule that two projects both redistribute counts once and not twice. Before the report calls anything a family it wants corroboration from independent sources, and an uncorroborated candidate is printed as named but not established, which is a different sentence from an attribution and is written as one. Candidates are listed with the repositories that contributed them and the standing each one was published with.

The family set is curated by hand, and the build records what it refused: 942 rules with no string literals, 355 that name no family, three whose name is a predicate or a technique and no family at all, two that rest on a single string, two quarantined and one whose strongest string was four bytes long. The set that survives is scanned against 1,200 benign files and ships only at zero hits. Rules that merely describe a file, saying it is 64-bit, that it has an overlay, that it is a DLL, are classified as structural and shown among the file properties, so an ordinary signed binary does not collect red rows for being what it is.

Rules section of a scan report: a Sigma detections panel reporting zero matches out of the whole corpus with a sentence naming what was evaluated, above an auto-generated Sigma rule in YAML.
A zero stated as a measurement. The panel names what was evaluated against the behaviour document before reporting nothing matched, and the number beside it is the Sigma corpus size at the time of that run. Underneath, the run's own auto-generated rule: YARA, Sigma and Suricata are produced per sample from its distinctive strings, its observed command lines and registry writes, and its observed C2, and are attached as advisory starting points, not as shipped detections.

The report grades its own evidence

Coverage is published as requested-against-actual pairs, so the difference between what you asked for and what the run delivered is printed, and never left to be inferred. A confidence grade with a stated meaning sits on top of it, and a decision word carries a qualifier sentence written to stay inside what was actually observed.

Coverage and confidence block report / overview
image        requested  windows10        actual  windows10
duration     requested  300 s            actual  300 s
network      requested  isolated         actual  isolated
sources      kernel trace, api monitor, packet capture, audit log
executed     yes, the launch root pid was observed
confidence   Observed
decision     suspicious
qualifier    behaviour was recorded and attributed to this sample;
             no family reached independent corroboration
The four confidence states are Confirmed, Observed, Structure only and Not tested. A run where the guest never reached the sample is graded Not tested and says in plain words that the file was never exercised, so nothing about it has been cleared; a packed sample that was analysed statically only is graded Structure only and says that nothing matching the verdict was seen running.

Behaviour is matched against a Sigma corpus of over two thousand feed rules, with an engine that skips rules using aggregations, correlations or temporal proximity, because half-evaluating one and publishing the half would be a result the data does not support. Persistence is answered from a real before-and-after diff of the machine's autostart surfaces, matched against a catalogue of 90 named methods in eight families with their ATT&CK ids, where a Run key and a RunOnce key are two distinct methods and an image-file-execution debugger and a silent-process-exit monitor are two more; a runtime finding is strong evidence, and a bare static string reference is carried as a hint and kept out of the method list, so a mention in the bytes is never printed as an observed persistence method. Timestamp manipulation is raised from the writes the sensors recorded. Living-off-the-land abuse is matched over observed command lines across 31 binaries and 36 patterns, each requiring a distinctive abuse argument and not the binary's mere presence, and loaded or dropped kernel drivers are cross-referenced against a corpus of over two thousand driver identities for the BYOVD case.

Memory findings are subtracted against a per-image, per-dumped-process benign baseline that is captured deliberately and is not learned from live scans, so a decoded payload still scores while the managed runtime that every dump on that image contains does not. Across sources, certainty comes from independent layers agreeing with each other, and repetition inside any one layer does not stand in for that agreement. Similarity search runs over six independent fingerprints and reports, for each neighbour, the band it fell in and which fingerprint spoke.

What this module does not do

No file submission over the API or MCP
Both surfaces accept only text-named modules: hash, URL, command and package. File analysis is console work, and that constraint is written into the code and is not an oversight to route around.
Host-side emulation is switched off on purpose
The shellcode and dropper emulator reports itself unavailable with its reason stated. Emulation buys triage speed, and buying it would mean running submitted code on the analysis host, which this platform does not do.
The static machine-learning score is not a model here
The layer returns a small structural heuristic, labelled as one on the page, and it reaches the AI layer under that same name, so it is not quoted downstream as a model verdict.
The in-guest record is scoped, and the report says to what
Each guest-side layer publishes the operation classes it can stand behind, and the behaviour document is written against that published scope, so a class the sensors do not claim is stated as unclaimed and never inferred from a silence. Part of the scoping is deliberate: activity that every clean machine performs constantly is left out by design, which is what keeps an ordinary system library load off the dropped-payload list.
Static unpacking covers one packer family
Everything else is detected, named, and routed to detonation with the report saying so explicitly, so an unattempted unpack never reads as an empty result.
A chain cannot be completed offline
Most legitimately signed software therefore lands on unverifiable, published under its own name. That is a limit of an isolated environment, not a finding about the file.
The layer selection is not what it looks like
Static and dynamic analysis default on; the AI layer is a checkbox that defaults off; the intelligence layer is not selectable at all and runs whenever the sample has a hash, unless Ultra Privacy is set.
Ultra Privacy destroys what it covers
Sample bytes, artifacts and analysis records are purged when the run finishes and every export route returns 404 afterwards, so there is nothing left to re-analyse, to build a rule from, or to match in a retro hunt.
Corpora come from third parties on a refresh schedule
Family attribution, configuration extraction and web-shell scoring depend on them, so the report names the corpus, its tier and the date it was retrieved, and claims no proprietary intelligence source of its own.
Retro hunt and similarity are bounded
Similarity compares against a window of recent visible samples and returns a ranked shortlist; retro hunt works to a scan budget. Each of them reports the bound it reached, so a short answer is not read as an exhaustive one.
Every layer works to a budget, and a budget reached degrades that one layer while the scan finishes
LayerBounded byWhat the report says when the bound is reached
String emulationinput size, PE and ELF onlyExtracted strings stand alone; the decoded, stack and tight string sets are absent and named as absent.
Secondary binary parserinput sizeThe Authenticode content hash and part of the signing detail are not computed.
Signature identificationinput sizeThe headline compiler and packer line is left empty, never guessed at.
Signature parsinginput sizeFalls back to a reduced parse of the structure.
Carved childrencarving depthCapability detection, decompilation and emulation are skipped on children and antivirus is batched; children still get typing, hashing, PE structure, YARA, strings and secrets.
Embedded PE carvinga payload budgetBounded by the structural parses as well, and each carving is validated as a PE before anything parses it.
YARAa match and preview budgetThe evidence preview holds a bounded window of each matched string, and the report states when the budget was reached.
Stringsa found and stored budgetThe noise filter that removes printable opcode runs can also drop a genuinely short or unusual string.
Dropped payloadsa file count and byte budgetDeduplicated by content, and whatever the budget excluded is counted and reported.
Static layer as a wholea time budgetThe scan completes and the static row is recorded as failed with its reason, not as a partial report presented as a complete one.
Kernel memory forensicsa technique-set budgetTechniques that miss the window are reported as skipped, which is not the same statement as having found nothing.

Memory forensics covers 19 techniques across 12 behaviour categories, and the report names which of them ran on a given scan. A technique that fires as readily on a clean machine as on a sample is not shipped, so the count on this page is what the layer can stand behind, not the length of a feature list.

Where this module hands off

Neighbouring modules

The rail lists seven modules, and each one takes something different in. This one takes a file. URL analysis opens a link in a real browser inside the guest; command analysis treats a script or a command line as the sample; document analysis hands a weaponised office or PDF file to the application it targets; the kernel driver and BYOVD module reads a Windows driver's IOCTL surface and the primitives it exposes; package analysis installs a named package from Python packaging and watches the install itself; and a OneShot run puts one sample on several images at once.

File analysis is the general chain, and it re-routes into two of those by content without changing the guest you picked: a document additionally goes through the document layer, and a PE whose imports read as a kernel driver additionally gets the BYOVD analyzer. Where behaviour depends on the Windows build and not on the file, OneShot puts the same sample on several images in one pass and gives the screen back from each.

The invariant underneath all of them does not move: Malwagon keeps the raw sample on this host. What leaves for a third party is limited to hashes and derived indicators, and the AI layer is fed through an explicit copy-allowlist with a final forbidden-key scrub, so a field nobody deliberately copied is not passed to a model. Read it in full on the security page, and the retention and deletion side of it 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