Mads Tofte

28 papers A* 5A 2B 2C 1Journal 9Unranked 5
YearRankTypeTitle / Venue / Authors
2010 J jnl
Bull. EATCS
Gordon D. Plotkin, Colin Stirling, Mads Tofte
2009 J jnl
Scholarpedia
Mads Tofte
2004 J jnl
High. Order Symb. Comput.
Mads Tofte, Lars Birkedal, Martin Elsman, Niels Hallenberg
2002 A* conf
PLDI
Niels Hallenberg, Martin Elsman, Mads Tofte
2001 J jnl
Theor. Comput. Sci.
Lars Birkedal, Mads Tofte
2000 conf
Proof, Language, and Interaction
Gordon D. Plotkin, Colin Stirling, Mads Tofte
2000 ed.
Proof, Language, and Interaction
Gordon D. Plotkin, Colin Stirling, Mads Tofte
2000 conf
Proof, Language, and Interaction
Mads Tofte, Lars Birkedal
1999 B conf
MFCS
Mads Tofte
1999 conf
TLCA
Peter Harry Eidorff, Fritz Henglein, Christian Mossin, Henning Niss, Morten Heine Sørensen, Mads Tofte
1999 A* conf
POPL
Peter Harry Eidorff, Fritz Henglein, Christian Mossin, Henning Niss, Morten Heine Sørensen, Mads Tofte
1998 C conf
ISMM
Mads Tofte
1998 J jnl
ACM Trans. Program. Lang. Syst.
Mads Tofte, Lars Birkedal
1997 A ed.
ICFP
Simon L. Peyton Jones, Mads Tofte, A. Michael Berman
1997 J jnl
Inf. Comput.
Mads Tofte, Jean-Pierre Talpin
1996 conf
Advanced Functional Programming
Mads Tofte
1996 A* conf
POPL
Lars Birkedal, Mads Tofte, Magnus Vejlstrup
1995 B conf
SAS
Mads Tofte
1994 A conf
ESOP
David B. MacQueen, Mads Tofte
1994 A* conf
POPL
Mads Tofte, Jean-Pierre Talpin
1994 J jnl
J. Funct. Program.
Mads Tofte
1992 A* conf
POPL
Mads Tofte
1991 J jnl
Theor. Comput. Sci.
Robin Milner, Mads Tofte
1991 book
Commentary on standard ML.
Robin Milner, Mads Tofte
1990 book
Mads Tofte
1990 book
Definition of standard ML.
Robin Milner, Mads Tofte, Robert Harper
1990 J jnl
Inf. Comput.
Mads Tofte
1987 conf
TAPSOFT, Vol.2
Robert Harper, Robin Milner, Mads Tofte
redb/extractors/pe_extractor.py
← Index redb/extractors/pe_extractor.py python
import logging
from abc import ABCMeta, abstractmethod
import inspect

import magic
import pefile
from dotnetfile import DotNetPE

from redb.extractors.extractor import Extractor

logger = logging.getLogger(__name__)


@abstractmethod
class PEExtractor(Extractor, metaclass=ABCMeta):

    def __init__(
        self,
        filepath,
        log,
        exporters=None,
        index_prefix=None,
        elastic_index=None,
        known_benign=False,
        known_malicious=False,
        pe=None,
    ):
        super().__init__(
            filepath,
            log,
            exporters,
            index_prefix,
            elastic_index,
            known_benign,
            known_malicious
        )
        self.pe = pe if pe else self._generate_pefile_object()
        self.dotnet = None

    def _generate_pefile_object(self):
        pe = None
        try:
            pe = pefile.PE(self.filepath)
            if not pe:
                raise pefile.PEFormatError("Empty file?")
        except pefile.PEFormatError as e:
            self.log.error(f"Format error {self.hash.sha256} Full error : {e}")
        return pe

    def _generate_dotnetfile_object(self):
        self.log.debug(inspect.currentframe().f_code.co_name)
        dotnet = None
        error = None
        try:
            dotnet = DotNetPE(self.filepath)
            if not dotnet:
                raise Exception("Empty file?")
        except Exception as e:
            self.log.error(
                f"Format error dotnet file {self.hash.sha256} Full error : {e}"
            )
            error = e
        return dotnet, error

    def _check_dotnet(self):
        try:
            file_type = magic.from_buffer(self.binary)
            if ".Net" in file_type:
                return True
            for entry in self.pe.OPTIONAL_HEADER.DATA_DIRECTORY:
                # IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR is typically 14
                if (
                    entry.name == "IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR"
                    and entry.Size > 0
                ):
                    return True
            return False
        except AttributeError as e:
            self.log.error(
                f"AttributeError error dotnet file {self.hash.sha256} Full error : {e}"
            )
            return False

    def _is_signed(self):
        address = self.pe.OPTIONAL_HEADER.DATA_DIRECTORY[
            pefile.DIRECTORY_ENTRY["IMAGE_DIRECTORY_ENTRY_SECURITY"]
        ].VirtualAddress
        if address == 0:
            return False
        return True

    def _has_overlay(self):
        return bool(self.pe.get_overlay())