James Theiler

80 papers A* 3A 1B 1C 13Misc 1Journal 35Unranked 25
YearRankTypeTitle / Venue / Authors
2024 J jnl
CoRR
Youzuo Lin, Shihang Feng, James Theiler, Yinpeng Chen, Umberto Villa, Jing Rao, John James Greenhall, Cristian Pantea, Mark A. Anastasio, Brendt Wohlberg
2023 J jnl
IEEE Trans. Geosci. Remote. Sens.
Stefania Matteoli, James Theiler
2023 C conf
IGARSS
James Theiler
2023 C conf
IGARSS
Stefania Matteoli, James Theiler
2023 J jnl
IEEE Signal Process. Mag.
Youzuo Lin, James Theiler, Brendt Wohlberg
2022 J jnl
IEEE Geosci. Remote. Sens. Lett.
Renán Rojas-Gómez, Jihyun Yang, Youzuo Lin, James Theiler, Brendt Wohlberg
2021 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
James Theiler
2021 C conf
IGARSS
James Theiler, Stefania Matteoli, Amanda Ziemann
2020 conf
SSIAI
Christopher X. Ren, Amanda Ziemann, James Theiler, Alice M. S. Durieux
2020 conf
SSIAI
Youzuo Lin, James Theiler, Brendt Wohlberg, Yue Wu, Zhongping Zhang
2020 J jnl
CoRR
Christopher X. Ren, Amanda Ziemann, James Theiler, Alice M. S. Durieux
2020 conf
SSIAI
Elena C. Reinisch, James Theiler, Amanda Ziemann
2020 conf
SSIAI
Christopher X. Ren, Matthew T. Calef, Alice M. S. Durieux, Amanda Ziemann, James Theiler
2020 J jnl
CoRR
Renán Rojas-Gómez, Jihyun Yang, Youzuo Lin, James Theiler, Brendt Wohlberg
2020 C conf
IGARSS
James Theiler, Alan P. Schaum
2019 J jnl
CoRR
Christopher X. Ren, Amanda Ziemann, Alice M. S. Durieux, James Theiler
2018 C conf
IGARSS
James Theiler, Beate G. Zimmer, Amanda Ziemann
2018 J jnl
CoRR
James Theiler, G. Beate Zimmer, Amanda Ziemann
2018 J jnl
IEEE Geosci. Remote. Sens. Lett.
James Theiler, Guen Grosklos
2017 C conf
IGARSS
James Theiler, Amanda Ziemann
2017 J jnl
Stat. Anal. Data Min.
James Theiler, Beate G. Zimmer
2017 C conf
IGARSS
Amanda Ziemann, James Theiler
2016 conf
WHISPERS
James Theiler, Guen Grosklos
2016 conf
SSIAI
James Theiler
2016 J jnl
IEEE Geosci. Remote. Sens. Lett.
James Theiler, Guen Grosklos
2016 conf
Computational Imaging
James Theiler, Amanda K. Ziemann
2015 conf
AIPR
Amanda K. Ziemann, James Theiler, David W. Messinger
2014 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Stefania Matteoli, Marco Diani, James Theiler
2013 J jnl
J. Electr. Comput. Eng.
Heesung Kwon, Xiaofei Hu, James Theiler, Alina Zare, Prudhvi Gurram
2013 J jnl
Comput. Sci. Eng.
Reid B. Porter, James Theiler, Don R. Hush
2013 J jnl
Technometrics
James Theiler
2013 conf
WHISPERS
James Theiler, Brendt Wohlberg
2013 conf
GlobalSIP
James Theiler
2012 conf
SSIAI
James Theiler, Brendt Wohlberg
2012 J jnl
IEEE Trans. Geosci. Remote. Sens.
James Theiler, Brendt Wohlberg
2012 Misc conf
ICASSP
Brendt Wohlberg, Rick Chartrand, James Theiler
2011 conf
WHISPERS
James Theiler
2011 conf
AIPR
Leonardo R. Bachega, James Theiler, Charles A. Bouman
2011 J jnl
IEEE J. Sel. Top. Signal Process.
James Theiler, Guangzhi Cao, Leonardo R. Bachega, Charles A. Bouman
2010 C conf
IGARSS
Anna Matsekh, James Theiler
2010 J jnl
IEEE Geosci. Remote. Sens. Lett.
James Theiler, Clint Scovel, Brendt Wohlberg, Bernard R. Foy
2010 J jnl
J. Complex.
Clint Scovel, Don R. Hush, Ingo Steinwart, James Theiler
2010 conf
Visual Information Processing
Neal R. Harvey, Reid B. Porter, James Theiler
2010 C conf
IGARSS
James Theiler, Guangzhi Cao, Charles A. Bouman
2010 C conf
IGARSS
James Theiler, Don R. Hush
2010 conf
Computational Imaging
Brendt Wohlberg, James Theiler
2010 C conf
IGARSS
Ingo Steinwart, James Theiler, Daniel Llamocca
2009 conf
Visual Information Processing
Reid B. Porter, Neal R. Harvey, James Theiler
2009 conf
Visual Information Processing
Lakshman Prasad, James Theiler
2009 book
Mark Galassi, Jim Davies, James Theiler, Brian Gough, Gerard Jungman
2009 conf
WHISPERS
Brendt Wohlberg, James Theiler
2009 conf
Computational Imaging
James Theiler, Clint Scovel
2009 conf
WHISPERS
Guangzhi Cao, Charles A. Bouman, James Theiler
2008 conf
AIPR
James Theiler, Steven M. Adler-Golden
2008 conf
IGARSS (1)
James Theiler, Bernard R. Foy
2008 J jnl
Bioinform.
James Thurmond, Hyejin Yoon, Carla Kuiken, Karina Yusim, Simon Perkins, James Theiler, Tanmoy Bhattacharya, Bette T. Korber, Will Fischer
2007 J jnl
Comput. Stat. Data Anal.
D. Michael Cai, Maya B. Gokhale, James Theiler
2006 J jnl
IEEE Geosci. Remote. Sens. Lett.
James Theiler, Bernard R. Foy
2006 C conf
IGARSS
Murat Dundar, James Theiler, Simon Perkins
2006 J jnl
IEEE Trans. Circuits Syst. I Regul. Pap.
Richard Kuehnel, James Theiler, Yuke Wang
2005 conf
Data Mining, Intrusion Detection, Information Assurance, and Data Networks Security
Dongming Cai, James Theiler, Maya B. Gokhale
2005 A* conf
ICML
Karen A. Glocer, Damian Eads, James Theiler
2005 J jnl
IEEE Trans. Geosci. Remote. Sens.
Amy E. Galbraith, James Theiler, Kurtis J. Thome, Richard W. Ziolkowski
2004 J jnl
Neural Networks
Garrett T. Kenyon, Dan Hill, James Theiler, John S. George, David W. Marshak
2004 conf
AIPR
James Theiler, Neal R. Harvey, Nancy A. David, John M. Irvine
2004 J jnl
Neural Comput.
Garrett T. Kenyon, James Theiler, John S. George, Bryan J. Travis, David W. Marshak
2004 J jnl
IEEE Trans. Neural Networks
Garrett T. Kenyon, Bryan J. Travis, James Theiler, John S. George, Greg J. Stephens, David W. Marshak
2004 J jnl
Pattern Recognit.
Junshui Ma, James Theiler, Simon Perkins
2003 J jnl
Neural Comput.
Junshui Ma, James Theiler, Simon Perkins
2003 J jnl
J. Supercomput.
Maya B. Gokhale, Janette Frigo, Kevin McCabe, James Theiler, Christophe Wolinski, Dominique Lavenier
2003 B conf
IJCNN
Garrett T. Kenyon, James Theiler, David W. Marshak, Bartlett Moore, Janelle Jeffs, Bryan J. Travis
2003 J jnl
J. Mach. Learn. Res.
Simon Perkins, Kevin Lacker, James Theiler
2003 A* conf
ICML
Simon Perkins, James Theiler
2003 J jnl
J. Math. Imaging Vis.
Reid B. Porter, Neal R. Harvey, Simon Perkins, James Theiler, Steven P. Brumby, Jeffrey J. Bloch, Maya B. Gokhale, John J. Szymanski
2003 A* conf
ICML
Reid B. Porter, Damian Eads, Don R. Hush, James Theiler
2002 J jnl
IEEE Trans. Geosci. Remote. Sens.
Neal R. Harvey, James Theiler, Steven P. Brumby, Simon Perkins, John J. Szymanski, Jeffrey J. Bloch, Reid B. Porter, Mark Galassi, A. Cody Young
2002 C conf
ICMLA
Junshui Ma, Simon Perkins, James Theiler, Stanley C. Ahalt
2001 A conf
FPGA
Mike Estlick, Miriam Leeser, James Theiler, John J. Szymanski
2001 J jnl
IEEE Trans. Geosci. Remote. Sens.
Christopher C. Funk, James Theiler, Dar A. Roberts, Christoph C. Borel
2000 conf
EvoWorkshops
Neal R. Harvey, Simon Perkins, Steven P. Brumby, James Theiler, Reid B. Porter, A. Cody Young, Anil K. Varghese, John J. Szymanski, Jeffrey J. Bloch
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"