Autopsy 4.22.1
Graphical digital forensics platform for The Sleuth Kit and other tools.
WindowsRegistryViewer.java
Go to the documentation of this file.
1/*
2 * Autopsy
3 *
4 * Copyright 2019 Basis Technology Corp.
5 * Contact: carrier <at> sleuthkit <dot> org
6 *
7 * Copyright 2013-2018 Willi Ballenthin
8 * Contact: willi.ballenthin <at> gmail <dot> com
9 *
10 * Licensed under the Apache License, Version 2.0 (the "License");
11 * you may not use this file except in compliance with the License.
12 * You may obtain a copy of the License at
13 *
14 * http://www.apache.org/licenses/LICENSE-2.0
15 *
16 * Unless required by applicable law or agreed to in writing, software
17 * distributed under the License is distributed on an "AS IS" BASIS,
18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19 * See the License for the specific language governing permissions and
20 * limitations under the License.
21 */
22package org.sleuthkit.autopsy.contentviewers;
23
24import com.williballenthin.rejistry.RegistryHive;
25import com.williballenthin.rejistry.RegistryHiveBuffer;
26import com.williballenthin.rejistry.RegistryParseException;
27import java.awt.BorderLayout;
28import java.awt.Component;
29import java.awt.Cursor;
30import java.nio.ByteBuffer;
31import java.util.Arrays;
32import java.util.List;
33import java.util.logging.Level;
34import javax.swing.JPanel;
35import org.sleuthkit.autopsy.rejview.RejView;
36import org.sleuthkit.autopsy.coreutils.Logger;
37import org.sleuthkit.datamodel.AbstractFile;
38import org.sleuthkit.datamodel.Content;
39import org.sleuthkit.datamodel.TskCoreException;
40
44class WindowsRegistryViewer extends JPanel implements FileTypeViewer {
45
46 private static final long serialVersionUID = 1L;
47 private static final Logger logger = Logger.getLogger(WindowsRegistryViewer.class.getName());
48 private static final String[] SUPPORTED_MIMETYPES = new String[]{"application/x.windows-registry"};
49 //Registry log files which should be ignored share the same signature as Registry files but appear to have a size of 1024
50 private static final String LOG_FILE_EXTENSION = "log"; //base extension for log files
51 private RejView regview;
52 private AbstractFile lastFile;
53
54 WindowsRegistryViewer() {
55 super(new BorderLayout());
56 }
57
58 private void setDataView(Content content) {
59 if (content == null) {
60 this.resetComponent();
61 return;
62 }
63
64 this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
65
66 if (content.getSize() == 0) {
67 return;
68 }
69
70 byte[] data = new byte[(int) content.getSize()];
71
72 try {
73 content.read(data, 0x0, content.getSize());
74 } catch (TskCoreException ex) {
75 logger.log(Level.WARNING, "Failed to read file content.", ex);
76 return;
77 }
78 ByteBuffer buf = ByteBuffer.wrap(data);
79
80 RegistryHive h = new RegistryHiveBuffer(buf);
81 this.regview = new RejView(h);
82 this.add(this.regview, BorderLayout.CENTER);
83
84 this.setCursor(null);
85 }
86
87 @Override
88 public Component getComponent() {
89 return this;
90 }
91
92 @Override
93 public void resetComponent() {
94 // cleanup anything
95 if (this.regview != null) {
96 this.remove(this.regview);
97 this.regview = null;
98 }
99 lastFile = null;
100 }
101
102 @Override
103 public boolean isSupported(AbstractFile file) {
104 if (file == null) {
105 return false;
106 }
107 if (file.getSize() == 0) {
108 return false;
109 }
110
111 if (file.getNameExtension().toLowerCase().startsWith(LOG_FILE_EXTENSION)) {
112 return false;
113 }
114 byte[] header = new byte[0x4000];
115
116 try {
117 file.read(header, 0x0, Math.min(0x4000, file.getSize()));
118 } catch (TskCoreException ex) {
119 logger.log(Level.WARNING, "Failed to read file content", ex);
120 return false;
121 }
122 ByteBuffer buf = ByteBuffer.wrap(header);
123
124 RegistryHive hive = new RegistryHiveBuffer(buf);
125 try {
126 hive.getHeader();
127 return true;
128 } catch (RegistryParseException ex) {
129 logger.log(Level.WARNING, "Failed to get hive header", ex);
130 return false;
131 }
132 }
133
134 @Override
135 public List<String> getSupportedMIMETypes() {
136 return Arrays.asList(SUPPORTED_MIMETYPES);
137 }
138
139 @Override
140 public void setFile(AbstractFile file) {
141 if (file == null) {
143 return;
144 }
145 if (file.equals(lastFile)) {
146 return; //prevent from loading twice if setNode() called mult. times
147 }
148 lastFile = file;
149 this.setDataView(file);
150 }
151}

Copyright © 2012-2024 Sleuth Kit Labs. Generated on:
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.