Mads Haahr

70 papers A* 2B 1C 19Misc 1Journal 10Unranked 34
YearRankTypeTitle / Venue / Authors
2025 J jnl
Entertain. Comput.
Mads Haahr, Svetlana Rudenko, Kelly Jakubowski
2025 conf
ICIDS (2)
Breanne Pitt, Wendy Youngblood, Mads Haahr
2025 conf
ICIDS (1)
Svetlana Rudenko, Karun Manoharan, Joris Vreeke, Charlene Putney, Mads Haahr
2025 conf
ICIDS (1)
Jonathan Barbara, Hartmut Koenitz, Mads Haahr
2025 conf
JCSG
Svetlana Rudenko, Kelly Jakubowski, Xiangpeng Fu, Mads Haahr
2025 C conf
FDG
Mads Haahr, Valentina Nisi, Joris Vreeke, Charlie Hargood
2024 conf
ICIDS (2)
Svetlana Rudenko, Xiangpeng Fu, Sam Davern, Mads Haahr
2024 conf
GEM
Alberto Rojas-Salazar, Mads Haahr
2024 conf
ICIDS (1)
Svetlana Rudenko, Mads Haahr
2023 conf
ICIDS (2)
Svetlana Rudenko, Xiangpeng Fu, Mads Haahr
2023 conf
JCSG
Alberto Rojas-Salazar, Mads Haahr
2023 conf
JCSG
Alberto Rojas-Salazar, Joel Rojas-Salazar, Mads Haahr
2023 conf
ICIDS (1)
Mads Haahr
2023 conf
ICIDS (1)
Sam Davern, Mads Haahr
2023 ed.
JCSG
Mads Haahr, Alberto Rojas-Salazar, Stefan Göbel
2023 conf
JCSG
Svetlana Rudenko, Mads Haahr
2023 conf
JCSG
Eva Veldhuizen-Ochodnicanová, Roisin Cotton, Charlene Putney, Maggie Brennan, Mads Haahr
2023 conf
ICIDS (2)
Sam Davern, Mads Haahr
2023 conf
ICIDS (2)
Jonathan Barbara, Mads Haahr
2022 conf
JCSG
Mads Haahr, Pernille Henriette Wiil
2022 J jnl
Entertain. Comput.
Anna Marie Rezk, Mads Haahr
2022 C conf
ICIDS
Svetlana Rudenko, Maura McDonnell, Timothy Layden, Mads Haahr
2022 C conf
ICIDS
Jonathan Barbara, Mads Haahr
2021 C conf
ICIDS
Jonathan Barbara, Mads Haahr
2020 C conf
ICIDS
Lilian Morgan, Mads Haahr
2020 conf
ICPEC
Alberto Rojas-Salazar, Paula Ramírez-Alfaro, Mads Haahr
2020 C conf
FDG
Alberto Rojas-Salazar, Mads Haahr
2020 J jnl
IEEE Trans. Games
Barbara De Kegel, Mads Haahr
2020 C conf
ICIDS
Anna Marie Rezk, Mads Haahr
2020 conf
JCSG
Alberto Rojas-Salazar, Mads Haahr
2019 C conf
ICIDS
Barbara De Kegel, Mads Haahr
2018 C conf
ICIDS
Hartmut Koenitz, Teun Dubbelman, Noam Knoller, Christian Roth, Mads Haahr, Digdem Sezen, Tonguc Ibrahim Sezen
2018 C ed.
ICIDS
Rebecca Rouse, Hartmut Koenitz, Mads Haahr
2018 C conf
ICIDS
Mads Haahr
2017 conf
JCSG
Mads Haahr
2017 conf
VSMM
Mads Haahr
2015 conf
DiGRA Conference
Bertrand Lucat, Mads Haahr
2015 conf
JCSG
Mads Haahr
2015 C conf
ICIDS
Bertrand Lucat, Mads Haahr
2013 J jnl
Trans. Edutainment
Hartmut Koenitz, Mads Haahr, Gabriele Ferri, Tonguc Ibrahim Sezen
2013 C ed.
ICIDS
Hartmut Koenitz, Tonguc Ibrahim Sezen, Gabriele Ferri, Mads Haahr, Digdem Sezen, Güven Catak
2013 C conf
ICIDS
Hartmut Koenitz, Mads Haahr, Gabriele Ferri, Tonguc Ibrahim Sezen, Digdem Sezen
2013 J jnl
Int. J. Arts Technol.
Natasa Paterson, Gavin Kearney, Katsiaryna Naliuka, Tara Carrigy, Mads Haahr, Fionnuala Conway
2012 J jnl
Ad Hoc Networks
Mads Haahr, Jon Crowcroft
2012 C conf
ICIDS
Hartmut Koenitz, Mads Haahr, Gabriele Ferri, Tonguc Ibrahim Sezen, Digdem Sezen
2011 C conf
ICIDS
Hartmut Koenitz, Mads Haahr, Gabriele Ferri, Tonguc Ibrahim Sezen
2010 conf
ICWL Workshops
Katsiaryna Naliuka, Tara Carrigy, Natasa Paterson, Mads Haahr
2010 J jnl
Peer-to-Peer Netw. Appl.
Jan Sacha, Bartosz Biskupski, Dominik Dahlem, Raymond Cunningham, René Meier, Jim Dowling, Mads Haahr
2010 Misc conf
NordiCHI
Tara Carrigy, Katsiaryna Naliuka, Natasa Paterson, Mads Haahr
2010 conf
Fun and Games
Natasa Paterson, Katsiaryna Naliuka, Søren Kristian Jensen, Tara Carrigy, Mads Haahr, Fionnuala Conway
2010 conf
Advances in Computer Entertainment Technology
Katsiaryna Naliuka, Tara Carrigy, Natasa Paterson, Roisin Cotton, Søren Kristian Jensen, Mads Haahr
2010 J jnl
Ad Hoc Networks
Elizabeth M. Daly, Mads Haahr
2010 C conf
ICIDS
Hartmut Koenitz, Mads Haahr, Gabriele Ferri, Tonguc Ibrahim Sezen
2009 C conf
ICIDS
Hartmut Koenitz, Mads Haahr, Gabriele Ferri, Tonguc Ibrahim Sezen
2009 conf
PerCom Workshops
Sean Reilly, Mads Haahr
2009 A* conf
ACM Multimedia
Tim Redfern, Mads Haahr
2009 J jnl
IEEE Trans. Mob. Comput.
Elizabeth M. Daly, Mads Haahr
2007 conf
ICC
Atul Singh, Mads Haahr
2007 B conf
MobiHoc
Elizabeth M. Daly, Mads Haahr
2006 conf
COMSWARE
Atul Singh, Mads Haahr
2006 J jnl
Commun. ACM
Atul Singh, Mads Haahr
2006 ch.
The Handbook of Mobile Middleware
John Keeney, Vinny Cahill, Mads Haahr
2005 C conf
WOWMOM
Elizabeth M. Daly, Alan Gray, Mads Haahr
2004 conf
CEAS
Alan Gray, Mads Haahr
2003
Mads Haahr
2002 conf
OTM
Gregory Biegel, Vinny Cahill, Mads Haahr
2000 conf
PDSE
Mads Haahr, René Meier, Paddy Nixon, Vinny Cahill, Eric Jul
1999 conf
ECOOP Workshops
Mads Haahr, Vinny Cahill, Eric Jul
1999 conf
ECOOP Workshops
Ivan Tomek, Alicia Díaz, Ronald Melster, António Rito Silva, Miguel Antunes, Vinny Cahill, Zièd Choukair, Alejandro Fernández, Mads Haahr, Eric Jul, Atsushi Ohnishi, Luís E. T. Rodrigues, Erich R. Schmidt, Cristian Tapus, Waldemar Wieczerzycki, Daniel M. Zimmerman
1999 A* conf
MobiCom
Mads Haahr, Raymond Cunningham, Vinny Cahill
redb/extractors/pe_extractors/pe_signature_old.py
← Index redb/extractors/pe_extractors/pe_signature_old.py python
import inspect
import pefile

from hashlib import md5, sha1, sha256

from asn1crypto import cms, pem, x509, core

from redb.extractors.enum import Tag
from redb.extractors.pe_extractor import PEExtractor
from redb.models.dataclasses import PECertificate, PESigner


class PESignatureExtractor(PEExtractor):
    """
    RFC 3161 - Internet X.509 Public Key Infrastructure Time-Stamp Protocol (TSP)
    Section 2.4.2 defines the TSTInfo structure.
    https://tools.ietf.org/html/rfc3161#section-2.4.2

    Microsoft Authenticode Time Stamping Specification
    https://download.microsoft.com/download/9/c/5/9c5b2167-8017-4bae-9fde-d599bac8184a/Authenticode_PE.docx
    """

    def __init__(
        self,
        filepath,
        log,
        index_prefix=None,
        elastic_index=None,
        known_benign=False,
        known_malicious=False,
        pe=None,
    ):
        super().__init__(
            filepath,
            log,
            index_prefix,
            elastic_index,
            known_benign,
            known_malicious,
            pe,
        )
        self.elastic_index = self.index_prefix + "-pe_signature"
        self.log.debug(inspect.currentframe().f_code.co_name)

    def tag(self):
        return Tag.PE_SIGNATURE.value

    @staticmethod
    def _extract_certificate_info(cert_data):
        # self.log.debug(inspect.currentframe().f_code.co_name)

        certificate = x509.Certificate.load(cert_data)
        certificate_serial_number = format(certificate.serial_number, "x").upper()
        grouped_serial_number = ":".join(
            [
                certificate_serial_number[i : i + 2]
                for i in range(0, len(certificate_serial_number), 2)
            ]
        )
        return PECertificate(
            _id=format(certificate.serial_number, "x").upper(),
            certificate_serial_number=grouped_serial_number,
            certificate_issuer=certificate.issuer.human_friendly,
            certificate_subject=certificate.subject.human_friendly,
            certificate_valid_from=certificate["tbs_certificate"]["validity"][
                "not_before"
            ].native.strftime("%Y-%m-%d %H:%M:%S"),
            certificate_valid_to=certificate["tbs_certificate"]["validity"][
                "not_after"
            ].native.strftime("%Y-%m-%d %H:%M:%S"),
            certificate_thumbprint=sha1(cert_data).hexdigest().upper(),
            certificate_md5=md5(cert_data).hexdigest().upper(),
            certificate_sha256=sha256(cert_data).hexdigest().upper(),
        )

    @staticmethod
    def _parse_microsoft_time_stamp(ts_token):
        class TSTInfo(core.Sequence):
            _fields = [
                ("version", core.Integer),
                ("policy_id", core.ObjectIdentifier),
                ("message_imprint", core.Sequence),
                ("serial_number", core.Integer),
                ("gen_time", core.GeneralizedTime),
                ("accuracy", core.Sequence, {"optional": True}),
                ("ordering", core.Boolean, {"optional": True}),
                ("nonce", core.Integer, {"optional": True}),
                ("tsa", core.Sequence, {"optional": True}),
                ("extensions", core.Sequence, {"optional": True}),
            ]

        # The content should be SignedData
        signed_data = ts_token["content"]

        # The actual timestamp should be in the encapContentInfo
        encap_content_info = signed_data["encap_content_info"]
        tst_info = TSTInfo.load(encap_content_info["content"])

        # Extract the genTime field from TSTInfo, type(genTime): <class 'datetime.datetime'>
        gen_time = tst_info["gen_time"].native

        return gen_time

    def _extract_signer_info(self, signer):
        self.log.debug(inspect.currentframe().f_code.co_name)
        signing_time = None

        for attr_set in [signer["signed_attrs"], signer["unsigned_attrs"]]:
            if attr_set:
                for attribute in attr_set:
                    attr_type = attribute["type"].dotted
                    if attr_type == "1.2.840.113549.1.9.5":  # signingTime
                        signing_time = attribute["values"][0].native
                        break
                    elif (
                        attr_type == "1.3.6.1.4.1.311.3.2.1"
                        or attr_type == "1.3.6.1.4.1.311.3.3.1"
                    ):  # microsoft_time_stamp_token
                        try:
                            ts_token = attribute["values"][0].native
                            signing_time = self._parse_microsoft_time_stamp(ts_token)
                            self.log.debug(
                                f"Signing Time from Microsoft Time Stamp Token: {signing_time}"
                            )
                        except Exception as e:
                            self.log.error(
                                f"Error parsing Microsoft Time Stamp Token: {e}"
                            )
                            self.log.error("Token structure:", attribute["values"][0])
                    elif attr_type == "1.2.840.113549.1.9.6":  # counterSignature
                        counter_sig_values = attribute["values"]
                        for counter_sig_value in counter_sig_values:
                            try:
                                counter_sig_info = cms.SignerInfo.load(
                                    counter_sig_value.native
                                )
                                cs_signed_attrs = counter_sig_info["signed_attrs"]
                                for cs_attr in cs_signed_attrs:
                                    cs_attr_type = cs_attr["type"].dotted
                                    if (
                                        cs_attr_type == "1.2.840.113549.1.9.5"
                                    ):  # signingTime
                                        signing_time = cs_attr["values"][0].native
                                        self.log.debug(
                                            "Signing Time (from countersignature):",
                                            signing_time,
                                        )
                                        break
                                if signing_time:
                                    break
                            except Exception as e:
                                self.log.error(
                                    f"Error processing countersignature: {e}"
                                )
                    if signing_time:
                        break
            if signing_time:
                break
        signer_serial_number = format(
            signer["sid"].native["serial_number"], "x"
        ).upper()
        grouped_serial_number = " ".join(
            [
                signer_serial_number[i : i + 2]
                for i in range(0, len(signer_serial_number), 2)
            ]
        )
        return PESigner(
            # this is to avoid duplicate _id with the Signer certificate used to sign as they are in the same ES index
            _id=format(signer["sid"].native["serial_number"], "x").upper()
            + signer["digest_algorithm"]["algorithm"].native,
            signer_serial_number=grouped_serial_number,
            signer_digest_algorithm=signer["digest_algorithm"]["algorithm"].native,
            signer_signature_algorithm=signer["signature_algorithm"][
                "algorithm"
            ].native,
            signing_time=(
                signing_time.strftime("%Y-%m-%d %H:%M:%S") if signing_time else None
            ),
            # "countersigners": extract_countersigners(signer), # TODO: Implement this
        )

    def _extract_signature_info(self):
        self.log.debug(inspect.currentframe().f_code.co_name)
        address = self.pe.OPTIONAL_HEADER.DATA_DIRECTORY[
            pefile.DIRECTORY_ENTRY["IMAGE_DIRECTORY_ENTRY_SECURITY"]
        ].VirtualAddress
        size = self.pe.OPTIONAL_HEADER.DATA_DIRECTORY[
            pefile.DIRECTORY_ENTRY["IMAGE_DIRECTORY_ENTRY_SECURITY"]
        ].Size

        addr_8 = address + 8
        signature_data = bytes(
            self.pe.write()[addr_8 : addr_8 + size]  # noqa E203
        )  # Ensure this is a bytes object
        if pem.detect(signature_data):
            signature_data = pem.unarmor(signature_data)

        content_info = cms.ContentInfo.load(signature_data)
        signed_data = content_info["content"]

        certificates = signed_data["certificates"]
        signers = signed_data["signer_infos"]

        certificates_list = []
        for cert in certificates:
            cert_info = self._extract_certificate_info(cert.chosen.dump())
            certificates_list.append(cert_info)

        signer_info_list = []
        for signer in signers:
            signer_info = self._extract_signer_info(signer)
            signer_info_list.append(signer_info)

        return certificates_list, signer_info_list

    def extract(self):
        try:
            self.log.debug(inspect.currentframe().f_code.co_name)
            if self._is_signed():
                certificates_list, signers_list = self._extract_signature_info()
                # self.export_to_elastic([PECodeSigning(certificates_list, signers_list)])
                self.export_to_elastic(certificates_list, Tag.PE_CERTIFICATE.value)
                self.export_to_elastic(signers_list, Tag.PE_SIGNER.value)
            return True
        except Exception as e:
            self.log.error(f"Error extracting PE Signature: {e}")
            return None