Differential Analysis of Malware in Memory (DAMM) is a tool built on top of Volatility Framework. Its main objective is as a test bed for some newer techniques in memory analysis, including performance enhancements via persistent SQLite storage of plugin results (optional); comparing in-memory objects across multiple memory samples, for example processes running in an uninfected samples versus those in an infected sample; data reduction via smart filtering (e.g., on a pid across several plugins); and encoding a set of expert domain knowledge to sniff out indicators of malicious activity, like hidden processes and DLLs, or windows built-in processes running form the wrong directory.
It is meant as a proving ground for interesting new techniques to be made available to the community. These techniques are an attempt to speed up the investigation process through data reduction and codifying some expert knowledge.
Features
- ~30 Volatility plugins combined into ~20 DAMM plugins (e.g., pslist, psxview and other elements are combined into a ‘processes’ plugin)
- Can run multiple plugins in one invocation
- The option to store plugin results in SQLite databases for preservation or for “cached” analysis
- A filtering/type system that allows easily filtering on attributes like pids to see all information related to some process and exact or partial matching for strings, etc.
- The ability to show the differences between two databases of results for the same or similar machines and manipulate from the cmdline how the differencing operates
- The ability to warn on certain types of suspicious behavior
- Output for terminal, tsv or grepable
Usage
Most DAMM output looks better piped through ‘less -S’ (upper ‘S’) as in:
1 |
#python damm.py <some DAMM functionality> | less -S (for default output format) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
python damm.py -h usage: damm.py [-h] [-d DIR] [-p PLUGIN [PLUGIN ...]] [-f FILE] [-k KDBG] [--db DB] [--profile PROFILE] [--debug] [--info] [--tsv] [--grepable] [--filter FILTER] [--filtertype FILTERTYPE] [--diff BASELINE] [-u FIELD [FIELD ...]] [--warnings] [-q] DAMM v1.0 Beta optional arguments: -h, --help show this help message and exit -d DIR Path to additional plugin directory -p PLUGIN [PLUGIN ...] Plugin(s) to run. For a list of options use --info -f FILE Memory image file to run plugin on -k KDBG KDBG address for the images (in hex) --db DB SQLite db file, for efficient input/output --profile PROFILE Volatility profile for the images (e.g. WinXPSP2x86) --debug Print debugging statements --info Print available volatility profiles, plugins --tsv Print screen formatted output. --grepable Print in grepable text format --filter FILTER Filter results on name:value pair, e.g., pid:42 --filtertype FILTERTYPE Filter match type; either "exact" or "partial", defaults to partial --diff BASELINE Diff the imageFile|db with this db file as a baseline -u FIELD [FIELD ...] Use the specified fields to determine uniqueness of memobjs when diffing --warnings Look for suspicious objects. -q Query the supplied db (via --db). |
Warnings
In an attempt to make the triage process even easier, DAMM has an experimental warning system built in to sniff out signs of malicious activity including:
For certain Windows processes:
- incorrect parent/child relationships
- hidden processes
- incorrect binary path
- incorrect default priority
- incorrect session
For all processes, and loaded DLLs and modules:
- loaded/run from temp directory
For DLLs:
- bogus extensions
- hidden DLLs
Plus more!
- PE headers in injections
- SIDs giving domain access
- debug privileges …
1 |
python damm.py --db after_tdl3.db --warnings |
See the warnings.py file for much more information on what DAMM checks for.
You can download DAMM here:
Or read more here.