Python取证技术(4): Windows 注册表分析

注册表介绍

如下图,打开注册表编辑器,注册表有5个根键,

一个键和它的子键以及值统称为Hive

注册表的键有两种类型:volatile和 nonvolatile。后者在将数据保存在本地硬盘;前者则在本地硬盘没有相关的文件,系统在内存中内存中创建和管理,是临时性的,系统每次启时都会创建volatile hives;

HKEY_LOCAL_MACHINE\HARDWARE : Volatile hive
HKEY_LOCAL_MACHINE\SYSTEM\Clone : Volatile hive

只有两个根键被保存在系统硬盘中且是nonvolatile类型的,数据在主内存中处理:HKEY_LOCAL_MACHINE和HKEY_USERS,其他的根键要么是这两个根键子建,要么就是volatile hive类型。

不同Windows版本的注册表文件

versionFilescontents
3.1xreg.datcomplete windows 3.?? registry
95system.datsystem-values (hkey_local_machine)
user.datuser-values (hkey_users)
NT
system32\config\sam用户及密码的数据库
system32\config\software安装的软件信息(hkey_local_machine\software)
system32\config\system存储计算机硬件和系统的信息(hkey_local_machine\system)
profiles\%username%\ntuser.dat存储用户参数选择的信息(此文件放置于用户个人目录,和其他注册表文件是分开的)(hkey_current_user{s-1-xxx…})
profiles\%username%\ntuser.manlike ntuser.dat but a mandatory-profile

数据类型

注册表的数据类型主要有以下五种:

显示类型(在编辑器中) 数据类型 说明
REG_SZ 字符串 文本字符串
REG_BINARY 二进制数 不定长度的二进制值,以十六进制显示
REG_DWORD 双字 一个 32 位的二进制值,显示为 8 位的十六进制值
REG_MULTI_SZ 多字符串 含有多个文本值的字符串,此名来源于字符串间用 nul 分隔、结尾两个 nul
REG_EXPAND_SZ 可扩充字符串 含有环境变量的字符串

解析注册表

要解析windows注册表,我们需要安装一个python模块。Github项目:python_registry

pip install python_registry

遍历所有的注册表项和键

import sys
from Registry import *

#递归函数
def rec(key, depth=0):
    print("\t" * depth + key.path())
    for subkey in key.subkeys():
        rec(subkey, depth + 1)

reg = Registry.Registry('F:\SYSTEM')  #参照上表中的SYSTEM
rec(reg.root())

不断递归按层次关系打印出所有的注册表项和键,注意一般情况下,是没有权限对注册表文件进行操作的,我是用火绒剑提取出来的。为了方便使用,你可以改写成带接收注册表文件路径的命令行参数的python脚本 输出结果如下(限于篇幅,只贴部分):

ROOT
    ROOT\ActivationBroker
        ROOT\ActivationBroker\Plugins
            ROOT\ActivationBroker\Plugins\{14F3C12D-7712-42CC-B7CC-64D2BB560C43}
            ROOT\ActivationBroker\Plugins\{17B21A1B-6C59-48E0-A448-6BC9AD2C5BFE}
            ROOT\ActivationBroker\Plugins\{5672BB8A-BBF5-482E-B7B9-742C70C604D8}
            ROOT\ActivationBroker\Plugins\{8ED392B6-23C2-4C3C-9126-D12D6BE621FD}
            ROOT\ActivationBroker\Plugins\{9CC1CC97-48C6-43DB-8265-4BD9C8E192DD}
            ROOT\ActivationBroker\Plugins\{AA67AF38-4AE0-4B49-BA56-ADF78DBED45A}
            ROOT\ActivationBroker\Plugins\{AC59432D-8659-48C4-A584-AFEBC920256F}
            ROOT\ActivationBroker\Plugins\{C2745EC3-CF23-4601-92EF-D189B711F933}
            ROOT\ActivationBroker\Plugins\{D6AC71F0-D4A7-41DD-88C4-B9985855D546}
            ROOT\ActivationBroker\Plugins\{F00006F2-44BC-44EF-808B-B26002A183C2}
            ROOT\ActivationBroker\Plugins\{F48B770A-CBE5-44C2-8D4F-931DE9CEE6FA}
    ROOT\ControlSet001
        ROOT\ControlSet001\Control
            ROOT\ControlSet001\Control\ACPI
            ROOT\ControlSet001\Control\AGP
            ROOT\ControlSet001\Control\AppID

遍历USB连接历史

import sys
from Registry import *
sys_reg = 'F:\\SYSTEM'  #SYSTEM为HKEY_LOCAL_MACHINE\SYSTEM

def GetControlSet(sys_reg):
    registry = Registry.Registry(sys_reg)
    key = registry.open('Select')
    for v in key.values():
        if v.name() == 'Current':
            return v.value()

def GetUSBConnectHistory(sys_reg):
    set = GetControlSet(sys_reg)
    registry = Registry.Registry(sys_reg)
    key = registry.open('ControlSet00%s\Enum\USBSTOR'%set)
    for v in key.subkeys():
        print v.name()

def main():
    GetUSBConnectHistory(sys_reg)

if __name__ == '__main__':
    main()

输出结果如下:

CdRom&Ven_HTC&Prod_Android_Phone&Rev_0000
Disk&Ven_HTC&Prod_Android_Phone&Rev_0000
Disk&Ven_WD&Prod_Elements_107C&Rev_1065

显示我这台电脑曾经连接三个USB设备。

遍历所有服务

import sys
from Registry import *
sys_reg = 'F:\\SYSTEM'

def GetControlSet(sys_reg):
    registry = Registry.Registry(sys_reg)
    key = registry.open('Select')
    for v in key.values():
        if v.name() == 'Current':
            return v.value()

def GetServices(sys_reg):
    set = GetControlSet(sys_reg)
    registry = Registry.Registry(sys_reg)
    services = registry.open('ControlSet00%s\Services'%set)

    for service in services.subkeys():
        try:
            display_name = service.value("DisplayName").value() #没有这个值则打???
        except:
            display_name = "???"

        try:
            description = service.value("Description").value()
        except:
            description = "???"

        try:
            image_path = service.value("ImagePath").value()
        except:
            image_path = "???"

        try:
            dll = service.subkey("Parameters").value("ServiceDll").value()
        except:
            dll = "???"
        print('%s, %s, "%s", "%s", "%s"' % (service.name(), display_name, image_path, dll, description))

def main():
    GetServices(sys_reg)

if __name__ == '__main__':
    main()

部分输出结果如下

acpipagr, @acpipagr.inf,%SvcDesc%;ACPI Processor Aggregator Driver, "\SystemRoot\System32\drivers\acpipagr.sys", "???", "???"
AcpiPmi, @acpipmi.inf,%AcpiPmi.SvcDesc%;ACPI Power Meter Driver, "\SystemRoot\System32\drivers\acpipmi.sys", "???", "???"
acpitime, @acpitime.inf,%AcpiTime.SvcDesc%;ACPI Wake Alarm Driver, "\SystemRoot\System32\drivers\acpitime.sys", "???", "???"

用户的历史纪录

历史纪录有很多种,文件打开历史纪录、网页浏览记录等等。

历史纪录 在注册表中位置
IE浏览器输入的网址 HKEY_USERS\S-1-5-21-[User Identifier] \Software\ Microsoft\Internet Explorer\TypedURLs
最近Office文件打开记录 HKEY_USERS\S-1-5-21-[User Identifier]\Software\Microsoft\Office\12.0\Office_App_Name\File MRU
最近映射的网络驱动器 HKEY_USERS\S-1-5-21-[User Identifier] \Software \Microsoft\Windows\CurrentVersion\Explorer\Map Network
最近在run对话框输入的命令 HKEY_USERS\S-1-5-21-[UserIdentifier]\Software\Microsoft\Windows\CurrentVersion\Explorer\RunMRU
最近的文件夹 HKEY_USERS\S-1-5-21-[User Identifier] \Software\Microsoft\Windows\CurrentVersion\Explorer\RecentDocs\Folder

User Identifier值存放在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList中。

当然还有很多,这个就靠自己去收集了。

×

纯属好玩

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. 注册表介绍
  2. 2. 不同Windows版本的注册表文件
  3. 3. 数据类型
  4. 4. 解析注册表
    1. 4.1. 遍历所有的注册表项和键
    2. 4.2. 遍历USB连接历史
    3. 4.3. 遍历所有服务
    4. 4.4. 用户的历史纪录
,