nightMARE/src/nightmare/malware/icedid/configuration.py (35 lines of code) (raw):
# coding: utf-8
URI_LENGTH = 64
class GzipVariantConfiguration(object):
"""
ICEDID's Gzip-variant configuration parser
"""
def __init__(self, data: bytes) -> None:
"""
:param data: Configuration data to parse
"""
self.botnet_id = int.from_bytes(data[0:4], "little")
self.auth_var = int.from_bytes(data[4:8], "little")
self.uri = str(data[8 : 8 + URI_LENGTH], "utf-8").strip("\x00")
self.domains = self.__parse_domains(data[8 + URI_LENGTH :])
def __parse_domains(self, data: bytes) -> list[str]:
domains = list()
offset = 0
while True:
size = data[offset]
if not size:
break
offset += 1
size -= 1
domains.append(str(data[offset : offset + size], "utf-8").strip("\x00"))
offset += size
return domains
def __repr__(self) -> str:
output = "campaign_id: {}\n".format(self.botnet_id)
output += "auth_var: {}\n".format(self.auth_var)
output += "uri: {}\n".format(self.uri)
output += "domains:\n"
for domain in self.domains:
output += "\t{}\n".format(domain)
return output
class ForkedVariantLoaderConfiguration(object):
"""
ICEDID's configuration parser for the loader
"""
def __init__(self, data: bytes) -> None:
"""
:param data: Configuration data to parse
"""
self.campaign_id = int.from_bytes(data[0:4], "little")
self.domain = str(data[4:].strip(b"\x00"), "utf-8")
def __repr__(self) -> str:
output = "campaign_id: {}\n".format(self.campaign_id)
output += "domain: {}".format(self.domain)
return output