mirror of
https://github.com/volatilityfoundation/volatility
synced 2026-06-08 18:04:46 +00:00
74 lines
3.2 KiB
Python
74 lines
3.2 KiB
Python
# Volatility
|
|
# Copyright (C) 2007,2008 Volatile Systems
|
|
# Copyright (C) 2010,2011,2012 Michael Hale Ligh <michael.ligh@mnin.org>
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; either version 2 of the License, or (at
|
|
# your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful, but
|
|
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
# General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software
|
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
#
|
|
|
|
import volatility.plugins.gui.windowstations as windowstations
|
|
|
|
class DeskScan(windowstations.WndScan):
|
|
"""Poolscaner for tagDESKTOP (desktops)"""
|
|
|
|
def render_text(self, outfd, data):
|
|
|
|
seen = []
|
|
|
|
for window_station in data:
|
|
for desktop in window_station.desktops():
|
|
|
|
offset = desktop.PhysicalAddress
|
|
if offset in seen:
|
|
continue
|
|
seen.append(offset)
|
|
|
|
outfd.write("*" * 50 + "\n")
|
|
outfd.write("Desktop: {0:#x}, Name: {1}\\{2}, Next: {3:#x}\n".format(
|
|
offset,
|
|
desktop.WindowStation.Name,
|
|
desktop.Name,
|
|
desktop.rpdeskNext.v(),
|
|
))
|
|
outfd.write("SessionId: {0}, DesktopInfo: {1:#x}, fsHooks: {2}\n".format(
|
|
desktop.dwSessionId,
|
|
desktop.pDeskInfo.v(),
|
|
desktop.DeskInfo.fsHooks,
|
|
))
|
|
outfd.write("spwnd: {0:#x}, Windows: {1}\n".format(
|
|
desktop.DeskInfo.spwnd,
|
|
len(list(desktop.windows(desktop.DeskInfo.spwnd)))
|
|
))
|
|
outfd.write("Heap: {0:#x}, Size: {1:#x}, Base: {2:#x}, Limit: {3:#x}\n".format(
|
|
desktop.pheapDesktop.v(),
|
|
desktop.DeskInfo.pvDesktopLimit - desktop.DeskInfo.pvDesktopBase,
|
|
desktop.DeskInfo.pvDesktopBase,
|
|
desktop.DeskInfo.pvDesktopLimit,
|
|
))
|
|
## This is disabled until we bring in the heaps plugin
|
|
#if self._config.VERBOSE:
|
|
# granularity = desktop.obj_vm.profile.get_obj_size("_HEAP_ENTRY")
|
|
# for entry in desktop.heaps():
|
|
# outfd.write(" Alloc: {0:#x}, Size: {1:#x} Previous: {2:#x}\n".format(
|
|
# entry.obj_offset + granularity,
|
|
# entry.Size, entry.PreviousSize,
|
|
# ))
|
|
for thrd in desktop.threads():
|
|
outfd.write(" {0} ({1} {2} parent {3})\n".format(
|
|
thrd.pEThread.Cid.UniqueThread,
|
|
thrd.ppi.Process.ImageFileName,
|
|
thrd.ppi.Process.UniqueProcessId,
|
|
thrd.ppi.Process.InheritedFromUniqueProcessId,
|
|
))
|