Skip to content

Analyse a sample end to end

This walkthrough follows one unknown Linux program through Antinomie. Adjust the steps to your sample. Read Safety first.

  1. Pick a base: BusyBox for small command-line programs, Debian 13 for programs that need a desktop or many libraries.
  2. Create a VM. Set Network deliberately:
    • Disconnected if you only need system calls. Network capture is not possible.
    • Isolated to see what the program tries to reach, with no way out.
    • Routed to choose, for each run, where the traffic goes: nowhere, fake services, the Internet, Tor, a VPN or a SOCKS5 proxy. See Network routes.
    • NAT only when you need the sample to reach real servers.
  3. Start the VM. Optionally take a Snapshot, so you can return to this clean state, or plan to use Reset disk to base….

2. Put the sample in the library New in 0.8.0

Section titled “2. Put the sample in the library ”

Add the file to Library › Samples before it goes near a VM. Add file… reads and hashes it without running or unpacking it, says whether the same bytes are already in the library, and keeps it in an encrypted archive (password infected). Give it a name, a description and tags. Tick Delete the original after it is archived to remove the loose copy from your disk once the archive has been read back and matched.

The Add file dialog: File path and Choose file…, Size 33 bytes, the SHA-256, Type elf · x86-64, In Samples No, Name update-helper, Description, Tags…, Delete the original after it is archived, and Add and Cancel.
Antinomie 0.8.0, synthetic data.

From now on every step is recorded in the sample’s custody log: added, sent into a VM, seen in a run, run started and ended, what you did to the running guest, and what you typed (by size only).

Open the sample and press Run in VM…. Antinomie reads the archive back, checks its SHA-256, sends it into the running VM and opens Run program with it filled in. See Run in VM.

You can also use Upload file (Ctrl+U), which sends a host file to a guest path. Tick Executable if it must run. Dropping a file onto the window, or using Explorer in the sidebar, opens the same dialog. Uploading never runs the file. In 0.8.0 every upload up to 256 MiB is archived in the library first.

The Upload file dialog with Choose file…, Host file, Guest path /tmp/program, the Executable and Overwrite existing file options ticked, and Upload, Upload and Run and Cancel.
Antinomie 0.6.2, a recorded run.

Run program can upload too: under Source, Upload sends a Host file to a Guest path and sets it as the program to run.

The Run program window with the Upload source: Host file /home/analyst/samples/dropper.elf, Guest path /tmp/dropper.elf, Overwrite an existing file, arguments, working directory, environment and user, the Analysis tree at the right, and an Upload button.
Antinomie 0.8.0, synthetic data.

In Run program, under Source, choose Guest path and type the Executable, or Upload. Then fill in the Arguments (one per line), Working directory, Environment and User. A Normal user run shows what the program does without privileges; run it again as Root to see more.

The Run program window with Source Guest path, Executable /usr/bin/sample, arguments, working directory /tmp, environment and Normal user UID 1000; at the right the Analysis tree with Static Analysis, its Triage and Deep analysis categories, Memory Dump on Exit and Core Dump on Exit, and Capture network from start until tree exits with the route; and Cancel, Analyze Only and Run.
Antinomie 0.8.0, synthetic data.

Pick what you want kept:

  • Static Analysis: analyse the file before it runs, from triage categories such as strings and regex matches to disassembly and decompilation. Its strings and regex matches also feed the sample window.
  • Capture network from start until tree exits: needs a VM with a network.
  • Memory Dump on Exit and Core Dump on Exit: see Memory and core dumps.

For a program that spawns services or injects into others, also press Capture all before you run. See What gets traced.

Press Run. Interact with the terminal if the program expects input. Use Stop or Kill when you have seen enough; closing the terminal does not stop the program.

Double-click the run in Run History. Triage → Summary shows counts for syscalls, tasks, suspicious observations, files and network, the detection cards and the MITRE ATT&CK techniques the matched rules cite.

Triage › Detection, YARA tab: Rule sets 0 enabled, Scanned inputs, Scan, 1 matched rule Complete, and the match Shell execution observed, informational, tagged T1059.004, with a rules table below.
Antinomie 0.8.0, synthetic data.
  • Process → Suspicious activity for behaviors worth a look. In Process tree, a process with suspicious observations has a chip with their count.
  • Files: start with Changed files and its Lifecycle column, then Created files, Executed files and Deleted files. Rows in hidden, persistence or credentials locations are marked. See Triage files.
  • Network: Endpoints, Domains, URLs and TLS; Open Packets shows the run’s capture. IOC matches the indicators against the abuse.ch datasets.
  • Detection: Scan with your rules. See Detection engines.
  • Properties: hashes of the sample.

Opening the run in Triage also stores the run’s digest, which the sample window adds up in step 8.

Double-click any Triage row to open the exact syscall or packet. In Syscall Trace filter for what matters, for example syscall.group == "Network" or args.path contains "/etc/", and read decoded arguments and captured bytes in Details. Check each field’s capture status.

Syscall Trace of a recorded run: 232 saved calls with category chips and rows, the write call selected, and in Details its decoded fd, buf and count with the 29 captured bytes shown as text and hex.
Antinomie 0.8.0, a recorded run.

For a file the sample wrote, open Files → Per-file history to see its calls and the bytes they changed. New in 0.8.0 Reconstruct contents… replays the calls over what the file held before the run and shows what each byte is, with a hash check against the guest. See File Reconstruction.

Triage › Files › Per-file history for /tmp/analysis-note.txt: Written content 2 bytes kept, the graph open → read ×2 → write, the calls with offsets, Content changes 65 6c → 58 59, and Reconstruct contents…
Antinomie 0.8.0, synthetic data.
  • Memory and Core dumps for in-memory unpacked code, with Disassembly, Decompile with Ghidra and the core’s Strings.
  • Static Analysis tabs for strings, capabilities and symbols.
  • Network for the packets as TShark parses them, and Open in Wireshark.
  • Disks, with the VM stopped, for the files the run left on the guest disk; Compare with… diffs it against the base image or a checkpoint. Save a disk dump if you want to promote a dropped file to the library with Add to Samples…. See Disks.
  • Run → Attach debugger… to stop and inspect a running program. See Debugger.

8. Look across runs New in 0.8.0

Section titled “8. Look across runs ”

Run the sample again under other conditions: as root, with another route, after a clock change, on a VM with another stealth profile. Then open it in Library › Samples. The sample window adds up what Triage found over all its runs: the highest suspicion and in how many runs, the rules matched, the ATT&CK techniques, the evasion attempts and the indicators. Its lineage graph shows what the sample dropped, downloaded and executed, and Runs lists every run on every VM with the environment it started in. See also Compare runs.

The sample window of install.sh: Verdict malicious, Highest suspicion High in 1 of 2 runs, Family Unknown; Rules matched cron_dropper in 1 of 2 runs; ATT&CK technique T1053.003; Evasion attempts with one Virtual machine check; and the runs with their suspicion.
Antinomie 0.8.0, synthetic data.

Before you trust an absence, look at TRL, UIL and STL and whether the run says Saving stopped. See Recording health.

  1. Right-click the run and Rename… it and Edit tags….
  2. Set your verdict on the sample with Edit tags… in its window: the verdict, the malware category, the ATT&CK techniques (Triage’s are offered under From Triage) and your own tags. New in 0.8.0
  3. Triage → Export report… writes the run as HTML or PDF for people, and JSON, MISP or STIX 2.1 for tools. Tick Evidence bundle to add the packet captures, the dropped files (in an AES zip, password infected), the custody record and a SHA-256 manifest. See Report export and evidence bundle. New in 0.8.0
  4. In the sample’s Custody log tab, press Verify, then copy the head hash into your notes. Export custody record… writes the log as JSON with a verifier, or HTML, optionally signed with your own minisign or SSH key. See Custody log. New in 0.8.0
The Export report dialog with its section checkboxes, the formats HTML, PDF, JSON, MISP and STIX 2.1, Evidence bundle and Defang options, and the report folder <recording>/report.
Antinomie 0.8.0, synthetic data.
The sample's Custody log tab: Log verified. 4 entries, every link matches, head bb0695d9 with a copy button and Verify, and the entries Added, Edited and two Seen in a run, each checked.
Keep the head hash outside Antinomie: the log is tamper-evident, not tamper-proof. Antinomie 0.8.0, synthetic data.

Copy any other values you need (export). Then stop the VM and return to a clean state with Reset disk to base… or by restoring the snapshot.