Rainer Simon

44 papers A* 1B 3C 1Journal 12Unranked 24
YearRankTypeTitle / Venue / Authors
2026 ch.
Künstliche Intelligenz und Wir: Stand, Nutzung und Herausforderungen der KI
Rainer Simon, Thomas Purper
2023 J jnl
ERCIM News
Refiz Duro, Rainer Simon, Christoph Singewald
2023 conf
DH
Michela Vignoli, Doris Gruber, Rainer Simon
2023 conf
DH
Michela Vignoli, Doris Gruber, Rainer Simon
2023 conf
DH
Elton T. E. Barker, Tom Gheldof, Shai Gordin, Orly Lewis, Elisa Nury, Valeria Vitale, Rainer Simon, Katherine McDonough, Anne Chen, Miranda Williams, Adnan Almohamad, Sarah Middle, Duncan Hay, Alex Butterworth
2021 J jnl
Int. J. Humanit. Arts Comput.
Valeria Vitale, Pau de Soto Cañamares, Rainer Simon, Elton T. E. Barker, Leif Isaksen, Rebecca Kahn
2021 J jnl
Int. J. Humanit. Arts Comput.
Rebecca Kahn, Leif Isaksen, Elton T. E. Barker, Rainer Simon, Pau de Soto Cañamares, Valeria Vitale
2020 conf
GRAPH
Rebecca Kahn, Rainer Simon
2020 conf
DH
Jan Rörden, Rainer Simon, Doris Gruber, Martin Krickl, Bernhard Haslhofer
2019 ch.
Encyclopedia of Big Data Technologies
Bernhard Haslhofer, Antoine Isaac, Rainer Simon
2018 J jnl
CoRR
Bernhard Haslhofer, Antoine Isaac, Rainer Simon
2018 conf
NKOS@TPDL
Jan Rörden, Bernhard Haslhofer, Rainer Simon, Sven Schlarb
2017 conf
DH
Karl E. Grossner, Merrick Lex Berman, Rainer Simon
2017 conf
DH
Leif Isaksen, Rainer Simon, Elton T. E. Barker
2016 B conf
TPDL
Hugo Manguinhas, Nuno Freire, Antoine Isaac, Juliane Stiller, Valentine Charles, Aitor Soroa, Rainer Simon, Vladimir Alexiev
2016 conf
DH
Gabriel Bodard, Tom Gheldof, K. Faith Lawrence, Simona Stoyanova, Charlotte Tupman, Leif Isaksen, Rainer Simon, Elton T. E. Barker, Pau de Soto Cañamares, Hugh Cayless
2014 J jnl
Multim. Tools Appl.
Bernhard Haslhofer, Robert Sanderson, Rainer Simon, Herbert Van de Sompel
2014 conf
DH
Rainer Simon, Elton T. E. Barker, Pau de Soto Cañamares, Leif Isaksen
2014 conf
WebSci
Leif Isaksen, Rainer Simon, Elton T. E. Barker, Pau de Soto Cañamares
2013 B conf
TPDL
Rainer Simon, Andrew Jackson
2013 J jnl
Bull. IEEE Tech. Comm. Digit. Libr.
Rainer Simon, Bernhard Haslhofer, Joachim Jung
2012 J jnl
CoRR
Bernhard Haslhofer, Robert Sanderson, Rainer Simon, Herbert Van de Sompel
2012 conf
DH
Elton T. E. Barker, Rainer Simon, Leif Isaksen
2011 conf
JCDL
Rainer Simon, Bernhard Haslhofer, Werner Robitza, Elaheh Momeni
2011 J jnl
CoRR
Bernhard Haslhofer, Rainer Simon, Robert Sanderson, Herbert Van de Sompel
2011 conf
MMWeb@I-KNOW
Bernhard Haslhofer, Rainer Simon, Robert Sanderson, Herbert Van de Sompel
2011 B conf
TPDL
Rainer Simon, Joachim Jung, Bernhard Haslhofer
2011 J jnl
ERCIM News
Joachim Jung, Rainer Simon, Bernhard Haslhofer
2010 conf
I-SEMANTICS
Bernhard Haslhofer, Elaheh Momeni, Manuel Gay, Rainer Simon
2010 conf
GIR
Matthias Baldauf, Rainer Simon
2009 J jnl
Pers. Ubiquitous Comput.
Peter Fröhlich, Rainer Simon, Lynne Baillie
2008 conf
Mobile HCI
Peter Fröhlich, Gerhard Obernberger, Rainer Simon, Peter Reichl
2008 J jnl
Interactions
Peter Fröhlich, Lynne Baillie, Rainer Simon
2007 A* conf
WWW
Rainer Simon, Peter Fröhlich
2007 conf
Mobile Response
Peter Fröhlich, Rainer Simon, Christian Kaufmann
2007 J jnl
Trans. GIS
Rainer Simon, Peter Fröhlich, Hermann Anegg
2007 conf
BCS HCI (2)
Peter Fröhlich, Rainer Simon, Elisabeth Muss, Andrea Stepan, Peter Reichl
2007 conf
CHI Extended Abstracts
Peter Fröhlich, Rainer Simon, Lynne Baillie, Joi Roberts, Roderick Murray-Smith
2007 ch.
Location Based Services and TeleCartography
Rainer Simon, Harald Kunczier, Hermann Anegg
2006 C conf
W2GIS
Rainer Simon, Peter Fröhlich, Hermann Anegg
2006 conf
Mobile HCI
Peter Fröhlich, Rainer Simon, Lynne Baillie, Hermann Anegg
2005 conf
Mobile HCI
Rainer Simon, Florian Wegscheider, Konrad Tolar
2004 conf
WWW (Alternate Track Papers & Posters)
Rainer Simon, Michael Jank, Florian Wegscheider
2004 conf
WWW (Alternate Track Papers & Posters)
Florian Wegscheider, Thomas Dangl, Michael Jank, Rainer Simon
redb/extractors/js_extractors/js_deobfuscation.py
← Index redb/extractors/js_extractors/js_deobfuscation.py python
import hashlib
import inspect
import re
from datetime import datetime, timezone
from typing import Any

from redb.extractors.enum import Tag
from redb.extractors.js_extractor import JSExtractor
from redb.extractors.js_extractors.js_patterns import PATTERNS

# String literals of 4+ characters; only used by the deobfuscation diff to count
# strings revealed after deobfuscation. Compiled once at module load.
_STRING_LITERAL_4PLUS_RE = re.compile(r"[\"\']([^\"\']{4,})[\"\']")


class JSDeobfuscationExtractor(JSExtractor):
    """Compute pre/post-deobfuscation metrics for a JS sample.

    The actual deobfuscation pass (external tool with jsbeautifier fallback)
    lives on `JSContext.deobfuscated` and is cached per sample, so any other
    extractor that needs the deobfuscated text reads the same value without
    re-running the subprocess. Configure the external tool via env vars:
        JS_DEOBFUSCATOR_PATH    Path or name (default: webcrack)
        JS_DEOBFUSCATE_TIMEOUT  Seconds (default: 60)
    """

    def __init__(
        self, filepath, log, exporters=None, index_prefix=None,
        known_benign=False, known_malicious=False, source=None, context=None,
    ):
        super().__init__(
            filepath, log, exporters, index_prefix,
            known_benign, known_malicious, source, context=context,
        )
        self.deobfuscation_result = None
        self.log.debug(inspect.currentframe().f_code.co_name)

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

    def extract(self):
        src = self.js_source
        if not src:
            return None

        deobfuscated, deobfuscator_used = self._context.deobfuscated
        if deobfuscated is None:
            return None

        original_size = len(src)
        original_entropy = self._context.text_entropy
        deobfuscated_size = len(deobfuscated)
        deobfuscated_entropy = self._calculate_text_entropy(deobfuscated)
        size_change_ratio = round(deobfuscated_size / original_size, 4) if original_size else 0.0

        # Strings revealed by deobfuscation: matched literals are extracted from
        # both versions and the set difference is the count of "new" strings.
        original_strings = set(_STRING_LITERAL_4PLUS_RE.findall(src))
        deobfuscated_strings = set(_STRING_LITERAL_4PLUS_RE.findall(deobfuscated))
        new_strings = deobfuscated_strings - original_strings

        # Suspicious APIs revealed by deobfuscation. Both sides of the diff
        # come from JSContext caches: the raw scan is computed once for the
        # whole pipeline; the deobfuscated scan is computed once and reused
        # by JSSuspiciousAPIsExtractor's revealed_by_deobf rows.
        original_apis = {n for n in self._context.scan if n in PATTERNS}
        deobfuscated_apis = set(self._context.scan_deobfuscated)
        new_apis = deobfuscated_apis - original_apis

        deobfuscated_sha256 = hashlib.sha256(deobfuscated.encode('utf-8')).hexdigest()

        self.deobfuscation_result = {
            'deobfuscator_used': deobfuscator_used,
            'deobfuscation_successful': True,
            'original_size': original_size,
            'deobfuscated_size': deobfuscated_size,
            'size_change_ratio': size_change_ratio,
            'original_entropy': original_entropy,
            'deobfuscated_entropy': deobfuscated_entropy,
            'new_strings_found': len(new_strings),
            'new_apis_found': len(new_apis),
            'deobfuscated_sha256': deobfuscated_sha256,
        }
        return self.deobfuscation_result

    def prepare_export_data(self, exporter_type: str) -> Any:
        if exporter_type == "ClickHouseExporter":
            if not self.deobfuscation_result:
                return None

            r = self.deobfuscation_result
            current_time = datetime.now(timezone.utc)
            data = [[
                self.sha256,
                r['deobfuscator_used'],
                int(r['deobfuscation_successful']),
                r['original_size'],
                r['deobfuscated_size'],
                r['size_change_ratio'],
                r['original_entropy'],
                r['deobfuscated_entropy'],
                r['new_strings_found'],
                r['new_apis_found'],
                r['deobfuscated_sha256'],
                current_time,
            ]]

            column_names = [
                "sha256", "deobfuscator_used", "deobfuscation_successful",
                "original_size", "deobfuscated_size", "size_change_ratio",
                "original_entropy", "deobfuscated_entropy",
                "new_strings_found", "new_apis_found",
                "deobfuscated_sha256", "analysis_date",
            ]

            column_type_names = [
                "FixedString(64)", "LowCardinality(String)", "UInt8",
                "UInt64", "UInt64", "Float64",
                "Float64", "Float64",
                "UInt32", "UInt32",
                "FixedString(64)", "DateTime64(3, 'UTC')",
            ]

            return (data, column_names, column_type_names)

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