Skip to content

Commit fe9c5be

Browse files
authored
Merge pull request #36 from skelsec/main
Main
2 parents 0694225 + eda57d3 commit fe9c5be

File tree

4 files changed

+61
-4
lines changed

4 files changed

+61
-4
lines changed

minidump/_version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11

2-
__version__ = "0.0.21"
2+
__version__ = "0.0.22"
33
__banner__ = \
44
"""
55
# minidump %s

minidump/common_structs.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,15 +83,21 @@ def get_from_rva(rva, buff):
8383
buff.seek(rva, 0)
8484
ms = MINIDUMP_STRING.parse(buff)
8585
buff.seek(pos, 0)
86-
return ms.Buffer.decode('utf-16-le')
86+
try:
87+
return ms.Buffer.decode('utf-16-le')
88+
except:
89+
return '<STRING_DECODE_FAILED>'
8790

8891
@staticmethod
8992
async def aget_from_rva(rva, buff):
9093
pos = buff.tell()
9194
await buff.seek(rva, 0)
9295
ms = await MINIDUMP_STRING.aparse(buff)
9396
await buff.seek(pos, 0)
94-
return ms.Buffer.decode('utf-16-le')
97+
try:
98+
return ms.Buffer.decode('utf-16-le')
99+
except:
100+
return '<STRING_DECODE_FAILED>'
95101

96102
class MinidumpMemorySegment:
97103
def __init__(self):

minidump/streams/Memory64ListStream.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,17 @@ def to_bytes(self):
2626
@staticmethod
2727
def parse(buff):
2828
mml = MINIDUMP_MEMORY64_LIST()
29+
buffsize = len(buff.read())
30+
buff.seek(-buffsize, io.SEEK_CUR)
2931
mml.NumberOfMemoryRanges = int.from_bytes(buff.read(8), byteorder = 'little', signed = False)
3032
mml.BaseRva = int.from_bytes(buff.read(8), byteorder = 'little', signed = False)
3133
for _ in range(mml.NumberOfMemoryRanges):
3234
mml.MemoryRanges.append(MINIDUMP_MEMORY_DESCRIPTOR64.parse(buff))
35+
36+
#sometimes buggy minidumps have a wrong number of memory ranges, so we need to check if we reached the end of the buffer
37+
curpos = buff.tell()
38+
if curpos == buffsize:
39+
break
3340

3441
return mml
3542

minidump/streams/SystemInfoStream.py

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,48 @@
99
import logging
1010
from minidump.common_structs import *
1111

12+
MINIDUMP_WIN_BUILDNO_TO_VERSION = {
13+
103: 'Windows 3.1',
14+
102: 'Windows 3.1 - Sparta',
15+
528: 'Windiws NT 3.1',
16+
300: 'Windows NT 3.11 - Snowball',
17+
153: 'Windows 3.2',
18+
807: 'Windows NT 3.5',
19+
1057: 'Windows NT 3.51',
20+
1381: 'Windows NT 4.0',
21+
950: 'Windows 95',
22+
1998 : 'Windows 98',
23+
2222: 'Windows 98 SE',
24+
2195: 'Windows 2000',
25+
3000: 'Windows ME',
26+
2600: 'Windows XP',
27+
2700: 'Windows XP - Media Center Edition 2005',
28+
2710: 'Windows XP - Media Center Edition 2005 Update Rollup 2',
29+
3790: 'Windows XP x64 / Server 2003 / Server 2003 R2',
30+
6002: 'Windows Vista / Server 2008',
31+
7601: 'Windows 7 / Server 2008 R2',
32+
9200: 'Windows 8 / Server 2012',
33+
9600: 'Windows 8.1 / Server 2012 R2',
34+
10240: 'Windows 10 - 1507',
35+
10586: 'Windows 10 - 1511',
36+
14393: 'Windows 10 - 1607 / Server 2016',
37+
15063: 'Windows 10 - 1703',
38+
16299: 'Windows 10 - 1709 / Server 2016',
39+
17134: 'Windows 10 - 1803 / Server 2016',
40+
17763: 'Windows 10 - 1809 / Server 2019',
41+
18362: 'Windows 10 - 1903 / Server 2019',
42+
18363: 'Windows 10 - 1909 / Server 2019',
43+
19041: 'Windows 10 - 2004 / Server 2019',
44+
19042: 'Windows 10 - 20H2 / Server 2019',
45+
19043: 'Windows 10 - 21H1',
46+
19044: 'Windows 10 - 21H2',
47+
19045: 'Windows 10 - 22H2',
48+
22000: 'Windows 11 - 21H2',
49+
20348: 'Windows Server 2022',
50+
22621: 'Windows 11 - 22H2',
51+
}
52+
53+
1254
# https://msdn.microsoft.com/en-us/library/windows/desktop/ms680396(v=vs.85).aspx
1355
class PROCESSOR_ARCHITECTURE(enum.Enum):
1456
AMD64 = 9 #x64 (AMD or Intel)
@@ -191,7 +233,9 @@ def __init__(self):
191233
self.OperatingSystem = None
192234

193235
def guess_os(self):
194-
if self.MajorVersion == 10 and self.MinorVersion == 0 and self.ProductType == PRODUCT_TYPE.VER_NT_WORKSTATION:
236+
if self.BuildNumber in MINIDUMP_WIN_BUILDNO_TO_VERSION:
237+
self.OperatingSystem = MINIDUMP_WIN_BUILDNO_TO_VERSION[self.BuildNumber]
238+
elif self.MajorVersion == 10 and self.MinorVersion == 0 and self.ProductType == PRODUCT_TYPE.VER_NT_WORKSTATION:
195239
self.OperatingSystem = "Windows 10"
196240
elif self.MajorVersion == 10 and self.MinorVersion == 0 and self.ProductType != self.ProductType.VER_NT_WORKSTATION:
197241
self.OperatingSystem = "Windows Server 2016 Technical Preview"

0 commit comments

Comments
 (0)