CAPE-parsers 0.1.59__tar.gz → 0.1.60__tar.gz

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.
Files changed (118) hide show
  1. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/PKG-INFO +1 -1
  2. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/community/Amadey.py +98 -16
  3. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/pyproject.toml +1 -1
  4. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/LICENSE +0 -0
  5. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/README.md +0 -0
  6. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/__init__.py +0 -0
  7. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/community/AgentTesla.py +0 -0
  8. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/community/Amatera.py +0 -0
  9. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/community/Arkei.py +0 -0
  10. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/community/AsyncRAT.py +0 -0
  11. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/community/AuroraStealer.py +0 -0
  12. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/community/Carbanak.py +0 -0
  13. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/community/CobaltStrikeBeacon.py +0 -0
  14. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/community/CobaltStrikeStager.py +0 -0
  15. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/community/DCRat.py +0 -0
  16. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/community/Fareit.py +0 -0
  17. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/community/KoiLoader.py +0 -0
  18. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/community/LokiBot.py +0 -0
  19. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/community/Lumma.py +0 -0
  20. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/community/MonsterV2.py +0 -0
  21. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/community/MyKings.py +0 -0
  22. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/community/NanoCore.py +0 -0
  23. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/community/Nighthawk.py +0 -0
  24. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/community/Njrat.py +0 -0
  25. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/community/PhemedroneStealer.py +0 -0
  26. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/community/QuasarRAT.py +0 -0
  27. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/community/README.md +0 -0
  28. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/community/Snake.py +0 -0
  29. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/community/SparkRAT.py +0 -0
  30. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/community/Stealc.py +0 -0
  31. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/community/VenomRAT.py +0 -0
  32. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/community/WinosStager.py +0 -0
  33. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/community/XWorm.py +0 -0
  34. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/community/XenoRAT.py +0 -0
  35. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/community/__init__.py +0 -0
  36. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/core/AdaptixBeacon.py +0 -0
  37. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/core/AuraStealer.py +0 -0
  38. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/core/Azorult.py +0 -0
  39. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/core/BitPaymer.py +0 -0
  40. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/core/BlackDropper.py +0 -0
  41. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/core/Blister.py +0 -0
  42. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/core/BruteRatel.py +0 -0
  43. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/core/BumbleBee.py +0 -0
  44. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/core/DarkGate.py +0 -0
  45. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/core/DoppelPaymer.py +0 -0
  46. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/core/DridexLoader.py +0 -0
  47. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/core/Formbook.py +0 -0
  48. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/core/GuLoader.py +0 -0
  49. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/core/IcedID.py +0 -0
  50. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/core/IcedIDLoader.py +0 -0
  51. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/core/Latrodectus.py +0 -0
  52. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/core/NitroBunnyDownloader.py +0 -0
  53. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/core/Oyster.py +0 -0
  54. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/core/PikaBot.py +0 -0
  55. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/core/PlugX.py +0 -0
  56. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/core/QakBot.py +0 -0
  57. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/core/Quickbind.py +0 -0
  58. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/core/README.md +0 -0
  59. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/core/RedLine.py +0 -0
  60. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/core/Remcos.py +0 -0
  61. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/core/Rhadamanthys.py +0 -0
  62. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/core/SmokeLoader.py +0 -0
  63. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/core/Socks5Systemz.py +0 -0
  64. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/core/SquirrelWaffle.py +0 -0
  65. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/core/Strrat.py +0 -0
  66. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/core/WarzoneRAT.py +0 -0
  67. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/core/Zloader.py +0 -0
  68. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/core/__init__.py +0 -0
  69. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/CAPE/core/test_cape.py +0 -0
  70. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/RATDecoders/README.md +0 -0
  71. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/RATDecoders/__init__.py +0 -0
  72. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/RATDecoders/test_rats.py +0 -0
  73. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/__init__.py +0 -0
  74. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/deprecated/BackOffLoader.py +0 -0
  75. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/deprecated/BackOffPOS.py +0 -0
  76. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/deprecated/BlackNix.py +0 -0
  77. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/deprecated/BuerLoader.py +0 -0
  78. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/deprecated/ChChes.py +0 -0
  79. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/deprecated/Emotet.py +0 -0
  80. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/deprecated/Enfal.py +0 -0
  81. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/deprecated/EvilGrab.py +0 -0
  82. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/deprecated/Greame.py +0 -0
  83. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/deprecated/Hancitor.py +0 -0
  84. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/deprecated/HttpBrowser.py +0 -0
  85. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/deprecated/JavaDropper.py +0 -0
  86. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/deprecated/Nymaim.py +0 -0
  87. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/deprecated/Pandora.py +0 -0
  88. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/deprecated/PoisonIvy.py +0 -0
  89. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/deprecated/PredatorPain.py +0 -0
  90. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/deprecated/Punisher.py +0 -0
  91. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/deprecated/RCSession.py +0 -0
  92. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/deprecated/REvil.py +0 -0
  93. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/deprecated/RedLeaf.py +0 -0
  94. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/deprecated/Retefe.py +0 -0
  95. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/deprecated/Rozena.py +0 -0
  96. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/deprecated/SmallNet.py +0 -0
  97. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/deprecated/TSCookie.py +0 -0
  98. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/deprecated/TrickBot.py +0 -0
  99. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/deprecated/UrsnifV3.py +0 -0
  100. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/deprecated/_ShadowTech.py +0 -0
  101. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/deprecated/_VirusRat.py +0 -0
  102. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/deprecated/_jRat.py +0 -0
  103. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/deprecated/unrecom.py +0 -0
  104. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/deprecated/xRAT.py +0 -0
  105. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/malduck/LICENSE +0 -0
  106. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/malduck/README.md +0 -0
  107. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/malduck/__init__.py +0 -0
  108. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/malduck/test_malduck.py +0 -0
  109. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/mwcp/README.md +0 -0
  110. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/mwcp/__init__.py +0 -0
  111. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/mwcp/test_mwcp.py +0 -0
  112. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/utils/__init__.py +0 -0
  113. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/utils/aplib.py +0 -0
  114. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/utils/blzpack.py +0 -0
  115. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/utils/blzpack_lib.so +0 -0
  116. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/utils/dotnet_utils.py +0 -0
  117. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/utils/lznt1.py +0 -0
  118. {cape_parsers-0.1.59 → cape_parsers-0.1.60}/cape_parsers/utils/strings.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: CAPE-parsers
3
- Version: 0.1.59
3
+ Version: 0.1.60
4
4
  Summary: CAPE: Malware Configuration Extraction
5
5
  License: MIT
6
6
  License-File: LICENSE
@@ -28,6 +28,34 @@ rule Amadey_Key_String
28
28
  }
29
29
  """
30
30
 
31
+ RULE_SOURCE_KEY_X64 = """
32
+ rule Amadey_Key_String_X64
33
+ {
34
+ meta:
35
+ author = "Matthieu Gras"
36
+ description = "Find decryption key in Amadey (64bit)."
37
+ strings:
38
+ $opcodes = {
39
+ /* sub rsp, imm8 */
40
+ 48 83 EC ??
41
+
42
+ /* mov r8d, imm32 */
43
+ 41 B8 ?? ?? ?? ??
44
+
45
+ /* lea rdx, [rip+disp32] */
46
+ 48 8D 15 ?? ?? ?? ??
47
+
48
+ /* lea rcx, [rip+disp32] */
49
+ 48 8D 0D ?? ?? ?? ??
50
+
51
+ /* call rel32 */
52
+ E8 ?? ?? ?? ??
53
+ }
54
+ condition:
55
+ $opcodes
56
+ }
57
+ """
58
+
31
59
  RULE_SOURCE_ENCODED_STRINGS = """
32
60
  rule Amadey_Encoded_Strings
33
61
  {
@@ -50,6 +78,43 @@ rule Amadey_Encoded_Strings
50
78
  }
51
79
  """
52
80
 
81
+ RULE_SOURCE_ENCODED_STRINGS_X64 = """
82
+ rule Amadey_Encoded_Strings_X64
83
+ {
84
+ meta:
85
+ author = "Matthieu Gras"
86
+ description = "Find encoded strings in Amadey (64bit)."
87
+ strings:
88
+ $opcodes = {
89
+ /* sub rsp, imm8 */
90
+ 48 83 EC ??
91
+
92
+ /* mov r8d, imm32 */
93
+ 41 B8 ?? ?? ?? ??
94
+
95
+ /* lea rdx, [rip+disp32] */
96
+ 48 8D 15 ?? ?? ?? ??
97
+
98
+ /* lea rcx, [rip+disp32] */
99
+ 48 8D 0D ?? ?? ?? ??
100
+
101
+ /* call rel32 */
102
+ E8 ?? ?? ?? ??
103
+
104
+ /* lea rcx, [rip+disp32] */
105
+ 48 8D 0D ?? ?? ?? ??
106
+
107
+ /* add rsp, imm8 */
108
+ 48 83 C4 ??
109
+
110
+ /* jmp rel32 */
111
+ E9 ?? ?? ?? ??
112
+ }
113
+ condition:
114
+ $opcodes
115
+ }
116
+ """
117
+
53
118
 
54
119
  def contains_non_printable(byte_array):
55
120
  for byte in byte_array:
@@ -68,14 +133,14 @@ def yara_scan_generator(raw_data, rule_source):
68
133
  yield instance.offset, block.identifier
69
134
 
70
135
 
71
- def get_keys(pe, data):
72
- image_base = pe.OPTIONAL_HEADER.ImageBase
136
+ def get_keys(pe, data, is_64bit=False):
73
137
  keys = []
74
- for offset, _ in yara_scan_generator(data, RULE_SOURCE_KEY):
138
+ rule_source = RULE_SOURCE_KEY_X64 if is_64bit else RULE_SOURCE_KEY
139
+
140
+ for offset, _ in yara_scan_generator(data, rule_source):
75
141
  try:
76
- key_string_rva = struct.unpack('i', data[offset + 3 : offset + 7])[0]
77
- key_string_dword_offset = pe.get_offset_from_rva(key_string_rva - image_base)
78
- key_string = pe.get_string_from_data(key_string_dword_offset, data)
142
+ key_string_offset = get_rip_relative_address(pe, data, offset, is_64bit)
143
+ key_string = pe.get_string_from_data(key_string_offset, data)
79
144
 
80
145
  if b"=" not in key_string:
81
146
  keys.append(key_string.decode())
@@ -88,19 +153,34 @@ def get_keys(pe, data):
88
153
 
89
154
  return []
90
155
 
156
+ def get_rip_relative_address(pe, data, offset, is_64bit):
157
+ if is_64bit:
158
+ offset += 10
159
+ disp = struct.unpack('<i', data[offset + 3 : offset + 7])[0]
160
+ rip_rva = pe.get_rva_from_offset(offset + 7)
161
+ target_rva = rip_rva + disp
162
+ target_offset = pe.get_offset_from_rva(target_rva)
163
+ else:
164
+ rva = struct.unpack('i', data[offset + 3 : offset + 7])[0]
165
+ target_offset = pe.get_offset_from_rva(rva - pe.OPTIONAL_HEADER.ImageBase)
91
166
 
92
- def get_encoded_strings(pe, data):
167
+ return target_offset
168
+
169
+ def get_encoded_strings(pe, data, is_64bit=False):
93
170
  encoded_strings = []
94
- image_base = pe.OPTIONAL_HEADER.ImageBase
95
- for offset, _ in yara_scan_generator(data, RULE_SOURCE_ENCODED_STRINGS):
171
+ rule_source = RULE_SOURCE_ENCODED_STRINGS_X64 if is_64bit else RULE_SOURCE_ENCODED_STRINGS
172
+
173
+ for offset, _ in yara_scan_generator(data, rule_source):
96
174
 
97
175
  try:
98
- encoded_string_size = data[offset + 1]
99
- encoded_string_rva = struct.unpack('i', data[offset + 3 : offset + 7])[0]
100
- encoded_string_dword_offset = pe.get_offset_from_rva(encoded_string_rva - image_base)
101
- encoded_string = pe.get_string_from_data(encoded_string_dword_offset, data)
176
+ if is_64bit:
177
+ encoded_string_size = struct.unpack('<I', data[offset + 6 : offset + 10])[0]
178
+ else:
179
+ encoded_string_size = data[offset + 1]
180
+
181
+ encoded_string_offset = get_rip_relative_address(pe, data, offset, is_64bit)
182
+ encoded_string = pe.get_string_from_data(encoded_string_offset, data)
102
183
 
103
- # Make sure the string matches length from operand
104
184
  if encoded_string_size != len(encoded_string):
105
185
  continue
106
186
 
@@ -147,13 +227,15 @@ def extract_config(data):
147
227
  pe = pefile.PE(data=data, fast_load=True)
148
228
  # image_base = pe.OPTIONAL_HEADER.ImageBase
149
229
 
150
- keys = get_keys(pe, data)
230
+ is_64bit = pe.OPTIONAL_HEADER.Magic == pefile.OPTIONAL_HEADER_MAGIC_PE_PLUS
231
+
232
+ keys = get_keys(pe, data, is_64bit)
151
233
  if not keys:
152
234
  return {}
153
235
 
154
236
  decode_key = keys[0]
155
237
  rc4_key = keys[1]
156
- encoded_strings = get_encoded_strings(pe, data)
238
+ encoded_strings = get_encoded_strings(pe, data, is_64bit)
157
239
 
158
240
  decoded_strings = []
159
241
  for encoded_string in encoded_strings:
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "CAPE-parsers"
3
- version = "0.1.59"
3
+ version = "0.1.60"
4
4
  description = "CAPE: Malware Configuration Extraction"
5
5
  authors = ["Kevin O'Reilly <kev@capesandbox.com>", "doomedraven <doomedraven@capesandbox.com>"]
6
6
  license = "MIT"
File without changes
File without changes