Mahdi Nabiyouni

14 papers A* 1B 1C 1Journal 2Unranked 8
YearRankTypeTitle / Venue / Authors
2021 J jnl
Comput. Hum. Behav.
Rayan Ebnali Harari, Babak Ravandi, Mahdi Nabiyouni, Abdullah Altaweel, Hamid Salmani Nodooshan, Hassan Karimi, Hua Helen Wang
2017 conf
3DUI
Run Yu, Wallace Santos Lages, Mahdi Nabiyouni, Brandon Ray, Navyaram Kondur, Vikram Chandrashekar, Doug A. Bowman
2017
Mahdi Nabiyouni
2016 conf
ISS Companion
Mahdi Nabiyouni, Doug A. Bowman
2016 conf
CHI PLAY (Companion)
Wallace Santos Lages, Mahdi Nabiyouni, Leonardo Arantes
2016 J jnl
Frontiers ICT
Mahdi Nabiyouni, Siroberto Scerbo, Doug A. Bowman, Tobias Höllerer
2015 conf
3DUI
Mahdi Nabiyouni, Ayshwarya Saktheeswaran, Doug A. Bowman, Ambika Karanth
2015 A* conf
VR
Mahdi Nabiyouni, Ayshwarya Saktheeswaran, Doug A. Bowman, Ambika Karanth
2015 conf
3DUI
Mahdi Nabiyouni, Siroberto Scerbo, Vincent DeVito, Stefan Smolen, Patrick Starrin, Doug A. Bowman
2015 conf
3DUI
Wallace Santos Lages, Mahdi Nabiyouni, Javier Tibau, Doug A. Bowman
2014 conf
3DUI
Mahdi Nabiyouni, Bireswar Laha, Doug A. Bowman
2014 conf
3DUI
Felipe Bacim, Mahdi Nabiyouni, Doug A. Bowman
2012 B conf
CCGRID
Mahdi Nabiyouni, Delasa Aghamirzaie
2010 C conf
VLSI-SoC
Delasa Aghamirzaie, Seyyed Ahmad Razavi, Morteza Saheb Zamani, Mahdi Nabiyouni
redb/extractors/js_extractors/js_content.py
← Index redb/extractors/js_extractors/js_content.py python
"""Persists raw + normalised text into the generic `code_text_content` table.

Reads the raw source and the deobfuscation result directly from the shared
JSContext so no extra compute happens here — both values are computed once
per sample (the source at JSContext construction, the deobfuscation lazily
on first access) and reused by any extractor that needs them.

`text_normalized` is left NULL when the deobfuscation pass produced no
output, so analysts can distinguish "we tried and got nothing" from
"normalisation succeeded".
"""

import inspect
from datetime import datetime, timezone
from typing import Any

from redb.extractors.enum import Tag
from redb.extractors.js_extractor import JSExtractor


class JSContentExtractor(JSExtractor):

    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.content_row = None
        self.log.debug(inspect.currentframe().f_code.co_name)

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

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

        deobfuscated, normalizer_used = self._context.deobfuscated

        self.content_row = {
            "content_type": self._context.content_type,
            "text_raw": src,
            "text_normalized": deobfuscated,  # may be None
            "normalizer_used": normalizer_used,  # may be None
        }
        return self.content_row

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

        r = self.content_row
        data = [[
            self.sha256,
            r["content_type"],
            r["text_raw"],
            r["text_normalized"],
            r["normalizer_used"],
            datetime.now(timezone.utc),
        ]]

        column_names = [
            "sha256",
            "content_type",
            "text_raw",
            "text_normalized",
            "normalizer_used",
            "analysis_date",
        ]

        column_type_names = [
            "FixedString(64)",
            "LowCardinality(String)",
            "String",
            "Nullable(String)",
            "Nullable(String)",
            "DateTime64(3, 'UTC')",
        ]

        return (data, column_names, column_type_names)

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