Anyone can run the First Look cases free, no account and no watermark. Open a First Look case →First Look cases · free, no account. Open one →

Getting started with memory forensics in Volatility 3

A memory image shows you things a disk never will: running processes, network connections, command lines, and injected code, all frozen at the moment of capture. Volatility 3 is the standard free tool for reading one, and unlike version 2 it works out the symbols on its own.

Get Volatility 3

Volatility 3 is free, open source, and written in Python. Install it with pip install volatility3, or clone it from the project repo. The main change from version 2 is that you no longer pass --profile; version 3 figures out the symbols itself. On the first run against a Windows image it downloads the matching kernel symbols from Microsoft's symbol server, so it needs internet once; after that it works offline.

Start with the processes

A memory case usually starts with what was running:

Our memory cases ship a real image you can run these against.

$ vol -f memory.dmp windows.pslist
Volatility 3 Framework 2.28.2

PID   PPID  ImageFileName  Offset(V)       Threads  Handles  SessionId  Wow64  CreateTime                      ExitTime  File output

116   4     Registry       0xcf5d1d454060  4        -        N/A        False  2025-02-25 16:57:56.000000 UTC  N/A       Disabled
4     0     System         0xcf5d1d455060  150      -        N/A        False  2025-02-25 16:57:58.000000 UTC  N/A       Disabled
384   4     smss.exe       0xcf5d1d456060  2        -        N/A        False  2025-02-25 16:57:59.000000 UTC  N/A       Disabled
492   400   csrss.exe      0xcf5d1d457060  12       -        0          False  2025-02-25 16:58:02.000000 UTC  N/A       Disabled
588   400   wininit.exe    0xcf5d1d458060  1        -        0          False  2025-02-25 16:58:03.000000 UTC  N/A       Disabled
708   404   csrss.exe      0xcf5d1d459060  14       -        1          False  2025-02-25 16:58:03.000000 UTC  N/A       Disabled
844   404   winlogon.exe   0xcf5d1d45a060  3        -        1          False  2025-02-25 16:58:03.000000 UTC  N/A       Disabled
916   588   services.exe   0xcf5d1d45c060  7        -        0          False  2025-02-25 16:58:04.000000 UTC  N/A       Disabled
1024  588   lsass.exe      0xcf5d1d45d060  10       -        0          False  2025-02-25 16:58:04.000000 UTC  N/A       Disabled
...
windows.pslist on the First Look: What's in Memory image, first rows only. PPID is the parent's PID, SessionId 0 is services and 1 is the logged-on user, and CreateTime is UTC.
$ vol -f memory.dmp windows.pstree
Volatility 3 Framework 2.28.2

PID      PPID  ImageFileName   Offset(V)       Threads  Handles  SessionId  Wow64  CreateTime                      ExitTime  Audit                                                  Cmd                                                                             Path

4        0     System          0xcf5d1d455060  150      -        N/A        False  2025-02-25 16:57:58.000000 UTC  N/A       -                                                      -                                                                               -
* 384    4     smss.exe        0xcf5d1d456060  2        -        N/A        False  2025-02-25 16:57:59.000000 UTC  N/A       \Device\HarddiskVolume3\Windows\System32\smss.exe      \SystemRoot\System32\smss.exe                                                   C:\Windows\System32\smss.exe
* 1220   4     MemCompression  0xcf5d1d46b060  32       -        N/A        False  2025-02-25 16:58:13.000000 UTC  N/A       -                                                      -                                                                               -
* 116    4     Registry        0xcf5d1d454060  4        -        N/A        False  2025-02-25 16:57:56.000000 UTC  N/A       -                                                      -                                                                               -
...
588      400   wininit.exe     0xcf5d1d458060  1        -        0          False  2025-02-25 16:58:03.000000 UTC  N/A       \Device\HarddiskVolume3\Windows\System32\wininit.exe   wininit.exe                                                                     C:\Windows\System32\wininit.exe
* 1024   588   lsass.exe       0xcf5d1d45d060  10       -        0          False  2025-02-25 16:58:04.000000 UTC  N/A       \Device\HarddiskVolume3\Windows\System32\lsass.exe     C:\Windows\system32\lsass.exe                                                   C:\Windows\System32\lsass.exe
* 916    588   services.exe    0xcf5d1d45c060  7        -        0          False  2025-02-25 16:58:04.000000 UTC  N/A       \Device\HarddiskVolume3\Windows\System32\services.exe  C:\Windows\system32\services.exe                                                C:\Windows\System32\services.exe
** 2404  916   svchost.exe     0xcf5d1d470060  9        -        0          False  2025-02-25 16:58:18.000000 UTC  N/A       \Device\HarddiskVolume3\Windows\system32\svchost.exe   C:\Windows\system32\svchost.exe -k netsvcs -p -s LanmanServer                   C:\Windows\system32\svchost.exe
** 1620  916   svchost.exe     0xcf5d1d466060  10       -        0          False  2025-02-25 16:58:08.000000 UTC  N/A       \Device\HarddiskVolume3\Windows\system32\svchost.exe   C:\Windows\system32\svchost.exe -k LocalServiceNetworkRestricted -p -s lmhosts  C:\Windows\system32\svchost.exe
...
windows.pstree on the same image, trimmed. Each * is one level down: services.exe under wininit.exe, svchost.exe under services.exe. Cmd and Path show how and from where each process started. Look for an image path outside Windows and Program Files, or a parent that doesn't fit the child.

Follow a process to the network and its command line

$ vol -f memory.dmp windows.netscan
Volatility 3 Framework 2.28.2

Offset          Proto  LocalAddr    LocalPort  ForeignAddr     ForeignPort  State        PID   Owner        Created

0xcf5d1dd70de0  TCPv4  0.0.0.0      135        0.0.0.0         0            LISTENING    1488  svchost.exe  2025-02-25 16:58:07.000000 UTC
0xcf5d1dd70eb0  TCPv4  0.0.0.0      445        0.0.0.0         0            LISTENING    4     System       2025-02-25 16:58:21.000000 UTC
0xcf5d1dd70f50  TCPv4  0.0.0.0      135        0.0.0.0         0            LISTENING    1488  svchost.exe  2025-02-25 16:58:07.000000 UTC
...
0xcf5d1dd740e0  TCPv4  10.186.8.53  139        0.0.0.0         0            LISTENING    4     System       2025-02-25 16:58:42.000000 UTC
0xcf5d1dd741f0  TCPv4  0.0.0.0      49664      0.0.0.0         0            LISTENING    1024  lsass.exe    2025-02-25 16:58:23.000000 UTC
...
0xcf5d1dd74df0  UDPv4  0.0.0.0      123        *               0                         2540  svchost.exe  2025-02-25 16:58:35.000000 UTC
0xcf5d1dd75010  TCPv4  10.186.8.53  53992      193.47.46.125   443          ESTABLISHED  3972  chrome.exe   2025-02-26 19:25:45.000000 UTC
0xcf5d1dd75380  TCPv4  10.186.8.53  57197      192.162.108.90  443          ESTABLISHED  2744  MsMpEng.exe  2025-02-26 19:41:37.000000 UTC
0xcf5d1dd756f0  TCPv4  10.186.8.53  64611      72.4.184.211    443          ESTABLISHED  2744  MsMpEng.exe  2025-02-26 20:09:27.000000 UTC
...
windows.netscan on the same image, trimmed. LISTENING rows are the host's own services: RPC on 135, SMB on 445, NetBIOS on 139. For each ESTABLISHED row, ask whether the Owner has a reason to talk to that ForeignAddr and port. chrome.exe and MsMpEng.exe (Defender) on 443 do. Take the PID of any row that doesn't to windows.cmdline and windows.dlllist.

Look for injected code

windows.malware.malfind (windows.malfind in older releases) finds memory regions that are both executable and private, which usually means injected or unpacked code. That's often where the payload is.

One common snag

A lot of tutorials online are written for Volatility 2, where commands look like --profile=Win10x64 pslist. Those won't run in version 3. Use the windows.<plugin> form instead.

How it fits a Red Herrings case

Our Windows memory cases ship a crash dump (memory/HOST.dmp) that stock Volatility 3 opens, so these plugins return real answers from a different image for every student. The Linux ones ship a LiME image with its symbol table beside it, so they work offline: vol -s memory/symbols -f memory/HOST.lime linux.pslist. First Look: What's in Memory and First Look: Linux Memory on the pathways page are good starts.

Want to practice on real evidence?

Run the free First Look cases or download the sample lab, or start the 30-day trial with sample cases to try, and generate a per-student case.