CAPE-parsers 0.1.60__py3-none-any.whl → 0.1.62__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -27,5 +27,6 @@ def extract_config(data: bytes):
27
27
 
28
28
 
29
29
  if __name__ == "__main__":
30
- data = open(sys.argv[1], "rb").read()
30
+ with open(sys.argv[1], "rb") as f:
31
+ data = f.read()
31
32
  print(extract_config(data))
@@ -27,5 +27,6 @@ def extract_config(data: bytes):
27
27
 
28
28
 
29
29
  if __name__ == "__main__":
30
- data = open(sys.argv[1], "rb").read()
30
+ with open(sys.argv[1], "rb") as f:
31
+ data = f.read()
31
32
  print(extract_config(data))
@@ -151,7 +151,7 @@ def decoder(data):
151
151
  temp = unpad(temp, 8)
152
152
  if not temp.endswith(b".php"):
153
153
  continue
154
- urls.append("http://" + temp.decod())
154
+ urls.append("http://" + temp.decode())
155
155
  return urls
156
156
 
157
157
 
@@ -150,6 +150,9 @@ def extract_config(data):
150
150
  if botnet_id:
151
151
  config_dict.setdefault("botnet", botnet_id)
152
152
 
153
+ if "CNCs" not in config_dict:
154
+ return {}
155
+
153
156
  return config_dict
154
157
 
155
158
 
@@ -27,5 +27,6 @@ def extract_config(data: bytes):
27
27
 
28
28
 
29
29
  if __name__ == "__main__":
30
- data = open(sys.argv[1], "rb").read()
30
+ with open(sys.argv[1], "rb") as f:
31
+ data = f.read()
31
32
  print(extract_config(data))
@@ -27,5 +27,6 @@ def extract_config(data: bytes):
27
27
 
28
28
 
29
29
  if __name__ == "__main__":
30
- data = open(sys.argv[1], "rb").read()
30
+ with open(sys.argv[1], "rb") as f:
31
+ data = f.read()
31
32
  print(extract_config(data))
@@ -27,5 +27,6 @@ def extract_config(data: bytes):
27
27
 
28
28
 
29
29
  if __name__ == "__main__":
30
- data = open(sys.argv[1], "rb").read()
30
+ with open(sys.argv[1], "rb") as f:
31
+ data = f.read()
31
32
  print(extract_config(data))
@@ -40,14 +40,16 @@ def decrypt(data: bytes) -> Tuple[bytes, bytes, bytes]:
40
40
  def extract_config(data: bytes) -> Dict[str, Any]:
41
41
  cfg: Dict[str, Any] = {}
42
42
  plaintext = b""
43
+ data_section = None
43
44
 
44
45
  pe = pefile.PE(data=data, fast_load=True)
45
- try:
46
- data_section = [s for s in pe.sections if s.Name.find(b".data") != -1][0]
47
- except IndexError:
48
- return cfg
46
+ for s in pe.sections:
47
+ name = s.Name.decode("utf-8", errors="ignore").rstrip("\x00")
48
+ if name in ("UPX1", ".data"):
49
+ data_section = s
50
+ break
49
51
 
50
- if not data_section:
52
+ if data_section is None:
51
53
  return cfg
52
54
 
53
55
  data = data_section.get_data()
@@ -254,4 +254,5 @@ def extract_config(data):
254
254
  if __name__ == "__main__":
255
255
  import sys
256
256
 
257
- print(extract_config(open(sys.argv[1], "rb").read()))
257
+ with open(sys.argv[1], "rb") as f:
258
+ print(extract_config(f.read()))
@@ -0,0 +1,39 @@
1
+ from contextlib import suppress
2
+
3
+ try:
4
+ from cape_parsers.utils.strings import extract_strings
5
+ except ImportError as e:
6
+ print(f"Problem importing extract_strings: {e}")
7
+
8
+ import logging
9
+ log = logging.getLogger(__name__)
10
+
11
+
12
+ def extract_config(data: bytes):
13
+ config = {}
14
+
15
+ with suppress(Exception):
16
+ if data[:2] == b"MZ":
17
+ return
18
+
19
+ header_data = data[:1024]
20
+ lines = extract_strings(data=header_data, minchars=3, dedup=False)
21
+
22
+ if len(lines) < 4:
23
+ return None
24
+
25
+ if '\\' in lines[2]:
26
+ config.setdefault("raw", {})["directory"] = (lines[1].strip() + '\\' + lines[0].strip()).replace(' ', ' ')
27
+ config.setdefault("raw", {})["inject_dll"] = lines[2].strip()
28
+ if '.exe' in lines[3]:
29
+ config.setdefault("raw", {})["exe_name"] = lines[3].strip()
30
+
31
+ if config:
32
+ config.setdefault("raw", config)
33
+ return config
34
+
35
+ if __name__ == "__main__":
36
+ import sys
37
+
38
+ with open(sys.argv[1], "rb") as f:
39
+ print(extract_config(f.read()))
@@ -183,4 +183,5 @@ def extract_config(filebuf):
183
183
  if __name__ == "__main__":
184
184
  import sys
185
185
 
186
- print(extract_config(sys.argv[1]))
186
+ with open(sys.argv[1], "rb") as f:
187
+ print(extract_config(f.read()))
@@ -219,4 +219,5 @@ def extract_config(filebuf):
219
219
  if __name__ == "__main__":
220
220
  import sys
221
221
 
222
- print(extract_config(open(sys.argv[1], "rb").read()))
222
+ with open(sys.argv[1], "rb") as f:
223
+ print(extract_config(f.read()))
@@ -85,7 +85,8 @@ def decode_resource(rc_data, key_end, fname):
85
85
  enc_data = rc_data[:-RC4_KEY_LENGTH]
86
86
  rc4key = rc_data[-RC4_KEY_LENGTH:-4] + key_end
87
87
  dec_data = rc4(enc_data, rc4key)
88
- open(fname, "wb").write(dec_data)
88
+ with open(fname, "wb") as f:
89
+ f.write(dec_data.encode("utf-8") if isinstance(dec_data, str) else dec_data)
89
90
  except Exception:
90
91
  return
91
92
  return dec_data
File without changes
@@ -1,18 +1,10 @@
1
1
  # Copyright (C) 2010-2015 Cuckoo Foundation, Optiv, Inc. (brad.spengler@optiv.com)
2
2
  # This file is part of Cuckoo Sandbox - http://www.cuckoosandbox.org
3
3
  # See the file 'docs/LICENSE' for copying permission.
4
+ import yara
4
5
  import logging
5
6
  from pathlib import Path
6
7
 
7
- try:
8
- import re2 as re
9
-
10
- HAVE_RE2 = True
11
- except ImportError:
12
- import re
13
-
14
- HAVE_RE2 = False
15
-
16
8
 
17
9
  log = logging.getLogger(__name__)
18
10
 
@@ -66,41 +58,86 @@ def bytes2str(convert):
66
58
  return convert
67
59
 
68
60
 
69
- def extract_strings(filepath: str = False, data: bytes = False, on_demand: bool = False, dedup: bool = False, minchars: int = 0):
70
- """Extract strings from analyzed file.
71
- @return: list of printable strings.
72
- """
61
+ def extract_strings(filepath: str = False, data: bytes = False, dedup: bool = False, minchars: int = 5):
62
+ """Extract ASCII and UTF-16LE strings from a file or byte string using YARA.
73
63
 
74
- nulltermonly = False
64
+ Args:
65
+ filepath: Path to the file to extract strings from.
66
+ data: Byte string to extract strings from. If filepath is provided, this is ignored.
67
+ dedup: If True, duplicate strings are removed.
68
+ minchars: Minimum length of strings to extract.
69
+
70
+ Returns:
71
+ A list of extracted strings.
72
+ """
75
73
  if minchars == 0:
76
74
  minchars = 5
77
75
 
78
76
  if filepath:
79
77
  p = Path(filepath)
80
78
  if not p.exists():
81
- log.error("Sample file doesn't exist: %s", filepath)
82
- return
83
- try:
84
- data = p.read_bytes()
85
- except (IOError, OSError) as e:
86
- log.error("Error reading file: %s", e)
87
- return
79
+ return []
80
+ data = p.read_bytes()
81
+
82
+ if not data or not isinstance(data, bytes):
83
+ return []
84
+
85
+ rule_source = r"""
86
+ rule GetStrings {
87
+ strings:
88
+ $s = /[\x20-\x7e]{""" + str(int(minchars)) + r""",}/ ascii wide
89
+ condition:
90
+ $s
91
+ }
92
+ """
88
93
 
89
- if not data:
90
- return
94
+ try:
95
+ rule = yara.compile(source=rule_source)
96
+ matches = rule.match(data=data)
97
+ except yara.Error:
98
+ return []
91
99
 
92
- endlimit = b"8192" if not HAVE_RE2 else b""
93
- if nulltermonly:
94
- apat = b"([\x20-\x7e]{" + str(minchars).encode() + b"," + endlimit + b"})\x00"
95
- upat = b"((?:[\x20-\x7e][\x00]){" + str(minchars).encode() + b"," + endlimit + b"})\x00\x00"
96
- else:
97
- apat = b"[\x20-\x7e]{" + str(minchars).encode() + b"," + endlimit + b"}"
98
- upat = b"(?:[\x20-\x7e][\x00]){" + str(minchars).encode() + b"," + endlimit + b"}"
100
+ all_instances = [
101
+ {
102
+ 'offset': instance.offset,
103
+ 'data': instance.matched_data,
104
+ 'length': len(instance.matched_data),
105
+ }
106
+ for match in matches
107
+ for string_match in match.strings
108
+ for instance in string_match.instances
109
+ ]
99
110
 
100
- strings = [bytes2str(string) for string in re.findall(apat, data)]
101
- strings.extend(str(ws.decode("utf-16le")) for ws in re.findall(upat, data))
111
+ all_instances.sort(key=lambda x: x['offset'])
112
+
113
+ strings = []
114
+ last_end_offset = -1
115
+
116
+ for inst in all_instances:
117
+ current_start = inst['offset']
118
+ current_end = current_start + inst['length']
119
+
120
+ if current_start < last_end_offset:
121
+ continue
122
+
123
+ val = inst['data']
124
+ decoded = None
125
+
126
+ if b"\x00" in val:
127
+ try:
128
+ decoded = val.decode("utf-16le")
129
+ except UnicodeDecodeError:
130
+ pass
131
+
132
+ if not decoded:
133
+ decoded = val.decode("ascii", errors="ignore")
134
+
135
+ if decoded:
136
+ strings.append(decoded)
137
+ last_end_offset = current_end
102
138
 
103
139
  if dedup:
104
140
  strings = list(set(strings))
105
141
 
106
142
  return strings
143
+
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: CAPE-parsers
3
- Version: 0.1.60
3
+ Version: 0.1.62
4
4
  Summary: CAPE: Malware Configuration Extraction
5
5
  License: MIT
6
6
  License-File: LICENSE
@@ -3,15 +3,15 @@ cape_parsers/CAPE/community/AgentTesla.py,sha256=NmKIZRAea2aEJOszKyHDyiwljFAGIe4
3
3
  cape_parsers/CAPE/community/Amadey.py,sha256=7a-meFa8-yKmz3SAhU7v-ZSl3rMwS7uODTorMn5NQHk,7494
4
4
  cape_parsers/CAPE/community/Amatera.py,sha256=giu37eRWaHpVnKPyggp5S70NwT3UwYrsT9oEm6NmDpw,8738
5
5
  cape_parsers/CAPE/community/Arkei.py,sha256=k36qHxdo5yPa9V1cg7EImSWP06kMog0rBda4KXqLKCY,3783
6
- cape_parsers/CAPE/community/AsyncRAT.py,sha256=0-FRT3d2x63KQ_cs1xmKFj7x0JRf7ID6QDc_DvBa0PM,1003
6
+ cape_parsers/CAPE/community/AsyncRAT.py,sha256=Gthm-HsIVh3IlrPZ3WjsKqA5bCAg2bKKw8erDMOd1Zo,1024
7
7
  cape_parsers/CAPE/community/AuroraStealer.py,sha256=LRu2QFBYkGhRGDJBw3GlcKub4E0_TBWmjdR2PnobDZM,2643
8
8
  cape_parsers/CAPE/community/Carbanak.py,sha256=K8wPh-geoeNOT2NPQJb9fJhsuo2dCgC-2A9-fV_3Dkc,5837
9
9
  cape_parsers/CAPE/community/CobaltStrikeBeacon.py,sha256=U4Q0ObCrPRpiO5B5fBmkgr63jXdizujNth8v6kUPnEQ,19466
10
10
  cape_parsers/CAPE/community/CobaltStrikeStager.py,sha256=HLxROBjz453uHNq1bPz0VSAhtyWDfz79ZacTPdjuWmY,7535
11
- cape_parsers/CAPE/community/DCRat.py,sha256=0-FRT3d2x63KQ_cs1xmKFj7x0JRf7ID6QDc_DvBa0PM,1003
11
+ cape_parsers/CAPE/community/DCRat.py,sha256=Gthm-HsIVh3IlrPZ3WjsKqA5bCAg2bKKw8erDMOd1Zo,1024
12
12
  cape_parsers/CAPE/community/Fareit.py,sha256=8LFQSgC12onQ8Fp0VNTWPjhMD07BnGQ6zySrbDeMHQM,1877
13
13
  cape_parsers/CAPE/community/KoiLoader.py,sha256=tCl22pzNnuzC9dvlh13oa_KEBlMwchrEhy5KjipfyiM,4048
14
- cape_parsers/CAPE/community/LokiBot.py,sha256=355kqLx0LNMr8XcGfPL7cxG8QZalcmE7ttVBqoWtTWE,5754
14
+ cape_parsers/CAPE/community/LokiBot.py,sha256=-Yk_mK2IO2obPLd4Zu9fuK1rylzENZlGU4ItWxFg5eM,5755
15
15
  cape_parsers/CAPE/community/Lumma.py,sha256=Iqd9yvt3g0FeV_bYRmL1RKp4C1H92qeGg4fXivVDSxw,12206
16
16
  cape_parsers/CAPE/community/MonsterV2.py,sha256=cFxhYxo7FruTMmFY3OtBO-E0hDyxfsC3zWX3BlcB-qI,2915
17
17
  cape_parsers/CAPE/community/MyKings.py,sha256=bcypBMJf6Jeg0yrHZ-J-XjnhHvFbb-lpDF_zwW63gOk,1397
@@ -23,37 +23,38 @@ cape_parsers/CAPE/community/QuasarRAT.py,sha256=dzVInOc-BPVRdArk92oEY4PKq1AEW04N
23
23
  cape_parsers/CAPE/community/README.md,sha256=SHgVQraCdp033IQjM4Cm6t70U4kULn1MfSwTq3rsZv8,22
24
24
  cape_parsers/CAPE/community/Snake.py,sha256=_ft5VJup4x7LuNGPCo95M-cNwoyH4t0yffqHLVEmy84,6654
25
25
  cape_parsers/CAPE/community/SparkRAT.py,sha256=Ef37A3ZXxBkBYcARQ8h0BxnrEQL7EOP9cneP-u2rV5Y,2350
26
- cape_parsers/CAPE/community/Stealc.py,sha256=18EkQ-lMMAreKV5vA9xLBmOK5B4JtYcBwVqNfof4K2A,5321
27
- cape_parsers/CAPE/community/VenomRAT.py,sha256=0-FRT3d2x63KQ_cs1xmKFj7x0JRf7ID6QDc_DvBa0PM,1003
26
+ cape_parsers/CAPE/community/Stealc.py,sha256=fwVbHTSr1bIpvcYPMqD2x8YuOB7dqwk_c0kpNEJf0F4,5378
27
+ cape_parsers/CAPE/community/VenomRAT.py,sha256=Gthm-HsIVh3IlrPZ3WjsKqA5bCAg2bKKw8erDMOd1Zo,1024
28
28
  cape_parsers/CAPE/community/WinosStager.py,sha256=PVOGM1Cj-WSO3Vq-Yti9TS9XlNbrHG6ZhaE4Tm2VuOM,2554
29
- cape_parsers/CAPE/community/XWorm.py,sha256=0-FRT3d2x63KQ_cs1xmKFj7x0JRf7ID6QDc_DvBa0PM,1003
30
- cape_parsers/CAPE/community/XenoRAT.py,sha256=0-FRT3d2x63KQ_cs1xmKFj7x0JRf7ID6QDc_DvBa0PM,1003
29
+ cape_parsers/CAPE/community/XWorm.py,sha256=Gthm-HsIVh3IlrPZ3WjsKqA5bCAg2bKKw8erDMOd1Zo,1024
30
+ cape_parsers/CAPE/community/XenoRAT.py,sha256=Gthm-HsIVh3IlrPZ3WjsKqA5bCAg2bKKw8erDMOd1Zo,1024
31
31
  cape_parsers/CAPE/community/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
32
32
  cape_parsers/CAPE/core/AdaptixBeacon.py,sha256=j1PN5yYQG9smdzU8lHtIy7wXYZRYPC2doegwNuTb7E4,3462
33
- cape_parsers/CAPE/core/AuraStealer.py,sha256=RSiclflsvcrcNLHpRokc_qF2cdQKXGBKg8Ti-Q-XmaM,3021
33
+ cape_parsers/CAPE/core/AuraStealer.py,sha256=t1HBlQuoC1Lud648L12PujUE6S0th8bLVywvvfEkDNQ,3097
34
34
  cape_parsers/CAPE/core/Azorult.py,sha256=YkMIhC6zRTxEkLVMUdr2MMsbV9iAnZ8hUS8be9GZ5N4,2150
35
35
  cape_parsers/CAPE/core/BitPaymer.py,sha256=HQwoE0o7HMiXItxE08vBenf2ZWMxZp84-Hf_1eZ8QdE,3050
36
36
  cape_parsers/CAPE/core/BlackDropper.py,sha256=sCSu2T5oPvcFHlSAzSsLj_gCv2Tldl0UPguwy0MVg6A,3282
37
37
  cape_parsers/CAPE/core/Blister.py,sha256=3lZamTW4aWcpsv1AGykhdrrhiGoWOY_EhXUeB2QUbvs,18268
38
38
  cape_parsers/CAPE/core/BruteRatel.py,sha256=_hFAYLbOsHdekWPOMXRmIYNXTNeNQSs3LZqh7xAVI2U,1147
39
- cape_parsers/CAPE/core/BumbleBee.py,sha256=8a15OLAoNKs377ehdgx8R6kCAsJeG-_itt8xc_EMQes,10075
39
+ cape_parsers/CAPE/core/BumbleBee.py,sha256=iAgwL90IPpXzSUGS79ZM_-Nq2Go6uHkHr0AxlqxEOgg,10096
40
40
  cape_parsers/CAPE/core/DarkGate.py,sha256=SH_lCQBCzayUw48uuX_Pn70unW8Dt2P-LqQYOdu1Ca4,4548
41
41
  cape_parsers/CAPE/core/DoppelPaymer.py,sha256=LPAQ-7imcAWFciAd7Qb_r6js2PdIsTt9fRdYKoEkFMg,2537
42
42
  cape_parsers/CAPE/core/DridexLoader.py,sha256=8NKppvGz7tVXnNTGEgS7R3LGn5vtW4xslQYbo38wQUg,7087
43
43
  cape_parsers/CAPE/core/Formbook.py,sha256=rvf0BRuRl_v8K9SJuSSfbVVMWLSTEemIgP3NtPp2vFM,550
44
44
  cape_parsers/CAPE/core/GuLoader.py,sha256=wH6t1e7rO60Bwe0ulqFdZq12-M087zT5WQtC_Wn2biU,354
45
+ cape_parsers/CAPE/core/HijackLoader.py,sha256=unxuxlPoarWxbz-U_68D2CuIlq5QHTFi6JI2B-jyXUM,1059
45
46
  cape_parsers/CAPE/core/IcedID.py,sha256=TEsvFq8qHz_D5kIURKWSC4lbvWaQbMriDZ3jQsVu2VA,4029
46
47
  cape_parsers/CAPE/core/IcedIDLoader.py,sha256=RM7DgpAD_EzQZKn9LdmdophJpkjJHassgd9bT7NSClA,1634
47
48
  cape_parsers/CAPE/core/Latrodectus.py,sha256=5QQKB93IldxnGv78mlozBgsu9NSHypA-qmJrJ1ufD0c,7753
48
49
  cape_parsers/CAPE/core/NitroBunnyDownloader.py,sha256=A1mFjRP_yLPEKfsAttiOOmSiEBHTiSSzcmUZ6duDE3A,5285
49
50
  cape_parsers/CAPE/core/Oyster.py,sha256=7h7panvLV1Tt1pAynk32-m-AMeGiPAKqSD4FGTHOY7I,7490
50
- cape_parsers/CAPE/core/PikaBot.py,sha256=t2_TXC8fK7kVFJP6kmNFw0agRepO3R92T0e4eSxG2AU,5286
51
+ cape_parsers/CAPE/core/PikaBot.py,sha256=ipXystRHtP-43pwJlioZxhq9z5Ov89z_ZbkNPRuJuOQ,5326
51
52
  cape_parsers/CAPE/core/PlugX.py,sha256=lGwr1T3mttG6CTbZCj_Cf5HnOad60A3LP264jlCsGsc,13192
52
53
  cape_parsers/CAPE/core/QakBot.py,sha256=iIbe_aE9mlip8esp10FAEjNsiaOfTtXnygu8E3JJQKI,18392
53
54
  cape_parsers/CAPE/core/Quickbind.py,sha256=0nyUatmDf79tWhjR3IM2pDFV98cmly9SfpULHdJL6JQ,3769
54
55
  cape_parsers/CAPE/core/README.md,sha256=Zd84WEUj9NzKzGnVZV1jx6gMiEOtz01m32B7xEuS91k,17
55
56
  cape_parsers/CAPE/core/RedLine.py,sha256=bZeKLvxaS6HDpWY4RDXtSEBt93qTNzZG5iE6FNS0dOY,5734
56
- cape_parsers/CAPE/core/Remcos.py,sha256=MIpO2FwehBGIhO7hS0TT2hdDsgvxlI5ps4rAwyFwdTY,9483
57
+ cape_parsers/CAPE/core/Remcos.py,sha256=Hlp5Jv-kAc572gfmO9lDPvB8PTpdRAZPCIdQNazaH7k,9504
57
58
  cape_parsers/CAPE/core/Rhadamanthys.py,sha256=0vj3M1IC4oPISj1R7ELl9JZm1Uha9DTdbNJraJGdbh0,10725
58
59
  cape_parsers/CAPE/core/SmokeLoader.py,sha256=NHNQ4LzV27vfmddfsvIBoW2PFiyfG2bufGC9iqKzTvE,4262
59
60
  cape_parsers/CAPE/core/Socks5Systemz.py,sha256=jSt6QejL5K99dIB3qdItvUHL28w6N60xuwc8EQHM5Mk,783
@@ -90,7 +91,7 @@ cape_parsers/deprecated/RedLeaf.py,sha256=ID8R1hl4l83cZCnapkdDxCA9FVXWiSkJpYAuxU
90
91
  cape_parsers/deprecated/Retefe.py,sha256=l2PcGcBDZFUhhOy1ACPREeykabt63dNtDZOnwREnqeU,5180
91
92
  cape_parsers/deprecated/Rozena.py,sha256=z31LEQ8rwr-bkKlOrX3Hm1DmDg8HR-UwydWFDgy44G8,382
92
93
  cape_parsers/deprecated/SmallNet.py,sha256=wKwDLBp1zTLrPOJkWX07mEPTp9izFLWCyd0r1fGt0_s,3948
93
- cape_parsers/deprecated/TSCookie.py,sha256=f4b4HCnn6v3YkMrrmonR5WMdGO0vEiNe-ENhYHqfctk,5632
94
+ cape_parsers/deprecated/TSCookie.py,sha256=xY3yHqzqemnKHAswaNkaWkjQ5dyjqaZqf--_cEO7L-8,5716
94
95
  cape_parsers/deprecated/TrickBot.py,sha256=EdKOQtKlU0gLkWFiibpBmTIueRVYSqwYo0WCHmaRgGA,6967
95
96
  cape_parsers/deprecated/UrsnifV3.py,sha256=Nu4X2l_zwlVMjvEa5gQRaR9SgYKL-C-C9onSmd2DtuU,5510
96
97
  cape_parsers/deprecated/_ShadowTech.py,sha256=aMLJSVagsrg5Eb9LJyAZCUm78AtCHtRQOFAlWBQ_E10,3890
@@ -111,8 +112,8 @@ cape_parsers/utils/blzpack.py,sha256=y-myrTTkpY9qtM5WhyPxLeq-lQRaVZ5tLycwhjWWyAE
111
112
  cape_parsers/utils/blzpack_lib.so,sha256=5PJtnggw8fV5q4DlhwMJk4ZadvC3fFTsVTNZKvEYmUc,33368
112
113
  cape_parsers/utils/dotnet_utils.py,sha256=pzQGbCqccz7DRv8T_i1JURlrKDIlDT2axxViiFF9hsU,1672
113
114
  cape_parsers/utils/lznt1.py,sha256=X-BmJtP6AwYSl0ORg5dfSt-NIuXbHrtCO5kUaaJI2C8,4066
114
- cape_parsers/utils/strings.py,sha256=a-nbvP9jYST7b6t_H37Ype-fK2jEmQr-wMF5a4i04e4,3062
115
- cape_parsers-0.1.60.dist-info/METADATA,sha256=uC0gVg_hKpZuVrHSLzKie3I0QsGgFOahOkC-TOk8BMQ,1826
116
- cape_parsers-0.1.60.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
117
- cape_parsers-0.1.60.dist-info/licenses/LICENSE,sha256=88c01_HLG8WPj7R7aU_b-O-UoF38vrrifvcko4KDxcE,1069
118
- cape_parsers-0.1.60.dist-info/RECORD,,
115
+ cape_parsers/utils/strings.py,sha256=Q43_uqyv7HFSf-CD2SmsKGnlqUpyx02BzWylen7Y2u0,3794
116
+ cape_parsers-0.1.62.dist-info/METADATA,sha256=dOJRFvCHilR5YVL5x_JarEyI3jN8l3WZ4ey3Awg9noQ,1826
117
+ cape_parsers-0.1.62.dist-info/WHEEL,sha256=kJCRJT_g0adfAJzTx2GUMmS80rTJIVHRCfG0DQgLq3o,88
118
+ cape_parsers-0.1.62.dist-info/licenses/LICENSE,sha256=88c01_HLG8WPj7R7aU_b-O-UoF38vrrifvcko4KDxcE,1069
119
+ cape_parsers-0.1.62.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 2.2.1
2
+ Generator: poetry-core 2.3.1
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any