Rainer Laur

38 papers A 4B 6C 10Misc 2Journal 7Unranked 8
YearRankTypeTitle / Venue / Authors
2014 J jnl
IEEE Trans. Comput. Aided Des. Integr. Circuits Syst.
Hans Georg Brachtendorf, Robert C. Melville, Peter Feldmann, Siegmar Lampe, Rainer Laur
2014 conf
NEMS
Christoph Glacer, Alfons Dehe, David Tumpold, Rainer Laur
2012 A conf
DATE
Hans Georg Brachtendorf, Kai Bittner, Rainer Laur
2011 conf
NTMS
Jochen Rust, Xinwei Wang, Rainer Laur, Steffen Paul
2011 C conf
FUSION
Xinwei Wang, Ole Bischoff, Rainer Laur, Steffen Paul
2010 C conf
FUSION
Xinwei Wang, Amir Jabbari, Reiner Jedermann, Rainer Laur, Walter Lang
2010 conf
INSS
Xin Wei Wang, Amir Jabbari, Rainer Laur, Walter Lang
2009 J jnl
IEEE Trans. Evol. Comput.
Karin Zielinski, Petra Weitkemper, Rainer Laur, Karl-Dirk Kammeyer
2008 A conf
PPSN
Karin Zielinski, Xinwei Wang, Rainer Laur
2008 B conf
IEEE Congress on Evolutionary Computation
Karin Zielinski, Matthias Joost, Rainer Laur, Bernd Orlik
2007 B conf
IEEE Congress on Evolutionary Computation
Karin Zielinski, Rainer Laur
2007 Misc conf
SenSys
Christian Behrens, Ole Bischoff, Steffen Paul, Rainer Laur
2007 C conf
ISCAS
Hans Georg Brachtendorf, Angelika Bunse-Gerstner, Barbara Lang, Rainer Laur
2007 B conf
IEEE Congress on Evolutionary Computation
Karin Zielinski, Rainer Laur
2007 ch.
NICSO
Karin Zielinski, Shyam Praveen Vudathu, Rainer Laur
2007 J jnl
CoRR
Shyam Praveen Vudathu, Kishore K. Duganapalli, Rainer Laur, D. Kubalinska, Angelika Bunse-Gerstner
2007 J jnl
Informatica (Slovenia)
Karin Zielinski, Rainer Laur
2007 conf
MCDM
Karin Zielinski, Rainer Laur
2006 B conf
IEEE Congress on Evolutionary Computation
Karin Zielinski, Rainer Laur
2006 B conf
IEEE Congress on Evolutionary Computation
Karin Zielinski, Rainer Laur
2006 B conf
IEEE Congress on Evolutionary Computation
Karin Zielinski, Petra Weitkemper, Rainer Laur, Karl-Dirk Kammeyer
2006 conf
Computational Intelligence
Karin Zielinski, Rainer Laur
2005 conf
GI Jahrestagung (2)
Christian Gorecki, Christian Behrens, Rainer Laur
2002 A conf
DATE
Hans Georg Brachtendorf, Siegmar Lampe, Rainer Laur, Robert C. Melville, Peter Feldmann
2000 J jnl
Integr.
Hans Georg Brachtendorf, Rainer Laur
2000 C conf
ISCAS
Hans Georg Brachtendorf, Rainer Laur
1999 A conf
DATE
Christoph Jäschke, Rainer Laur, Friedrich Beckmann
1998 conf
ISSS
Christoph Jäschke, Rainer Laur
1995 C conf
ISCAS
Stefan Honken, Feng-Ming Yang, Rainer Laur
1995 J jnl
Int. J. Circuit Theory Appl.
Hans Georg Brachtendorf, Günther Welsch, Rainer Laur
1995 C conf
ISCAS
Hans Georg Brachtendorf, Günther Welsch, Rainer Laur
1995 C conf
ISCAS
Stefan Wolter, Holger Matz, Andreas Schubert, Rainer Laur
1994 C conf
ISCAS
Beom-Ik Cheon, Walter Anheier, Rainer Laur
1994 C conf
ISCAS
Hans Georg Brachtendorf, Rainer Laur
1994 Misc conf
VLSI Design
Feng-Ming Yang, Stefan Wolter, Rainer Laur
1993 C conf
ISCAS
Stefan Wolter, Andreas Schubert, Holger Matz, Rainer Laur
1992 conf
EUROSIM
Hans Georg Brachtendorf, Rainer Laur
1982 J jnl
IEEE Trans. Comput. Aided Des. Integr. Circuits Syst.
Walter L. Engl, Rainer Laur, Heinz K. Dirks
redb/extractors/detectiteasy.py
← Index redb/extractors/detectiteasy.py python
import inspect
from pprint import pprint
import subprocess
import json
from typing import Any
from datetime import datetime, timezone
import os
from dotenv import load_dotenv

from redb.extractors.enum import Tag
from redb.models.dataclasses import DIEinfo
from redb.extractors.extractor import Extractor

load_dotenv(override=True)

class DIEExtractor(Extractor):

    def __init__(
        self,
        filepath,
        log,
        exporters=None,
        index_prefix=None,
        elastic_index=None,
        known_benign=False,
        known_malicious=False,
        precomputed_hashes=None,
    ):
        super().__init__(
            filepath, log, exporters, index_prefix, elastic_index, known_benign, known_malicious,
            precomputed_hashes=precomputed_hashes
        )
        self.log.debug(inspect.currentframe().f_code.co_name)
        self.die_info = None
        self.die_info_dict = {}
        self.elastic_index = self.index_prefix + "-die"

    def _recursive_entry(self, die_dict, master_key):
        self.log.debug(inspect.currentframe().f_code.co_name)
        if master_key:
            self.die_info_dict[master_key] = {}
        else:
            self.die_info_dict = {}
        for value in die_dict:
            if "type" in value:
                type_key = value["type"].lower().replace(" ", "_")
                name = value.get("name", "")
                version = f"({value.get('version')})" if value.get("version") else ""
                info = f"[{value.get('info')}]" if value.get("info") else ""

                if master_key:
                    self.die_info_dict[master_key][type_key] = f"{name}"
                    self.die_info_dict[master_key][f'{type_key}(full)'] = f"{name}{version}{info}"
                else:
                    self.die_info_dict[type_key] = f"{name}"
                    self.die_info_dict[f'{type_key}(full)'] = f"{name}{version}{info}"

            elif "parentfilepart" in value:
                child_key = (
                    value["parentfilepart"].lower().replace(" ", "_")
                    + "."
                    + value["filetype"].lower().replace(" ", "_")
                )
                if master_key:
                    self._recursive_entry(value["values"], f"{master_key}.{child_key}")
                else:
                    self._recursive_entry(value["values"], f"{child_key}")

    def _extract_dieinfo(self):
        """
        Execute a command-line binary with arguments and parse its JSON output.

        :param command: The command or path to the binary to execute
        :param args: Additional arguments to pass to the command
        :return: Parsed JSON output as a Python object
        """
        self.log.debug(inspect.currentframe().f_code.co_name)

        # Construct the full command
        # command = "nfdc" # UNCOMMENT FOR PROD
        # command = "/Users/p4c0/_tools/NFD.app/Contents/MacOS/nfdc" # COMMENT FOR TESTING ON MAC
        command = os.getenv("DIE_PATH")
        args = ["-durj", self.filepath]
        full_command = [command] + list(args)
        TIMEOUT = int(os.getenv("DIE_TIMEOUT", "180"))

        try:
            # Execute the command and capture its output
            result = subprocess.run(
                full_command,
                capture_output=True,
                text=True,
                check=True,
                timeout=TIMEOUT,
            )

            # Parse the JSON output
            nfdc_output = json.loads(result.stdout)

            # Extract the DIE information from the json output
            for die_entry in nfdc_output["detects"]:
                if die_entry["parentfilepart"] == "Header":
                    master_key = (
                        die_entry["parentfilepart"].lower().replace(" ", "_")
                        + "."
                        + die_entry["filetype"].lower().replace(" ", "_")
                    )
                    self._recursive_entry(die_entry["values"], None)

            # pprint(json.dumps(self.die_info_dict, indent=2)) #debug
            self.die_info = DIEinfo(result.stdout, self.die_info_dict)
            self.log.debug(f"NFDC-DIE JSON dump: todo")
        except subprocess.TimeoutExpired:
            self.log.error(f"The DIE command timed out after {TIMEOUT} seconds")
            return None
        except subprocess.CalledProcessError as e:
            self.log.error(f"Error executing DIE command: {e}")
            self.log.error(f"Command output (stderr): {e.stderr}")
            return None
        except json.JSONDecodeError as e:
            self.log.error(f"Error parsing DIE JSON output: {e}")
            self.log.error(f"Raw output: {result.stdout}")
            return None

    def prepare_export_data(self, exporter_type: str) -> Any:
        if exporter_type == "ElasticsearchExporter":
            return self.die_info
        elif exporter_type == "ClickHouseExporter":
            # Convert DIE info to JSON string
            die_info_json = json.dumps(self.die_info_dict)
            
            data = [[
                self.sha256,
                self.md5,
                self.sha1,
                die_info_json,
                datetime.now(timezone.utc)
            ]]
            
            column_names = [
                'sha256', 'md5', 'sha1', 'die_info', 'analysis_date'
            ]
            
            column_type_names = [
                'String', 'String', 'String', 'JSON', 'DateTime64(3, \'UTC\')'
            ]
            
            return (data, column_names, column_type_names)

    def get_clickhouse_table(self) -> str:
        return "redb_die"

    def extract(self):
        self.log.debug(inspect.currentframe().f_code.co_name)
        try:
            self._extract_dieinfo()
            
            # Check if there's a packer in the DIE results
            is_packed = False
            if self.die_info_dict:
                # Check if 'packer' exists in the DIE results
                is_packed = bool(self.die_info_dict.get('packer'))
            
            return self.die_info  # Return the extracted data instead of exporting directly
        except Exception as e:
            self.log.error(f"Error extracting DIE information: {e}")
            return None

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