Vikram Mehta

17 papers A* 3B 5Journal 3Unranked 6
YearRankTypeTitle / Venue / Authors
2024 J jnl
Int. J. Hum. Comput. Stud.
Daniel Gooch, Arosha K. Bandara, Amel Bennaceur, Emilie Giles, Lydia Harkin, Dmitri S. Katz, Mark Levine, Vikram Mehta, Bashar Nuseibeh, Clifford Stevenson, Avelie Stuart, Catherine V. Talbot, Blaine A. Price
2023 B conf
TEI
Vikram Mehta, Daniel Gooch, Arosha K. Bandara, Blaine A. Price, Bashar Nuseibeh
2023 conf
TAS
Amel Bennaceur, Avelie Stuart, Blaine A. Price, Arosha K. Bandara, Mark Levine, Linda Clare, Jessica Cohen, Ciaran McCormick, Vikram Mehta, Mohamed Bennasar, Daniel Gooch, Carlos Gavidia-Calderon, Anastasia Kordoni, Bashar Nuseibeh
2021 J jnl
ACM Trans. Internet Techn.
Vikram Mehta, Daniel Gooch, Arosha K. Bandara, Blaine A. Price, Bashar Nuseibeh
2021 B conf
TEI
Vikram Mehta, Arosha K. Bandara, Blaine A. Price, Bashar Nuseibeh, Daniel Gooch
2020 B conf
TEI
Daniel Gooch, Vikram Mehta, Blaine A. Price, Ciaran McCormick, Arosha K. Bandara, Amel Bennaceur, Mohamed Bennasar, Avelie Stuart, Linda Clare, Mark Levine, Jessica Cohen, Bashar Nuseibeh
2019 B conf
KES
Mohamed Bennasar, Blaine A. Price, Avelie Stuart, Daniel Gooch, Ciaran McCormick, Vikram Mehta, Linda Clare, Amel Bennaceur, Jessica Cohen, Arosha K. Bandara, Mark Levine, Bashar Nuseibeh
2019 B conf
TEI
Vikram Mehta
2018 A* conf
CHI
Blaine A. Price, Ryan Kelly, Vikram Mehta, Ciaran McCormick, Hanad Ahmed, Oliver Pearce
2017 J jnl
Proc. ACM Interact. Mob. Wearable Ubiquitous Technol.
Blaine A. Price, Avelie Stuart, Gul Calikli, Ciaran McCormick, Vikram Mehta, Luke Hutton, Arosha K. Bandara, Mark Levine, Bashar Nuseibeh
2016 conf
CHI Extended Abstracts
Vikram Mehta, Arosha K. Bandara, Blaine A. Price, Bashar Nuseibeh
2016 conf
UbiComp Adjunct
Nova Ahmed, Sadd Azmeen Ur Rahman, Rahat Jahangir Rony, Tanvir Mushfique, Vikram Mehta
2016 conf
UbiComp Adjunct
Vikram Mehta, Arosha K. Bandara, Blaine A. Price, Bashar Nuseibeh
2015 A* conf
CHI
Dominik Schmidt, Robert Kovacs, Vikram Mehta, Udayan Umapathi, Sven Köhler, Lung-Pan Cheng, Patrick Baudisch
2015 conf
CHI Extended Abstracts
Dominik Schmidt, Robert Kovacs, Vikram Mehta, Udayan Umapathi, Sven Köhler, Lung-Pan Cheng, Patrick Baudisch
2014 A* conf
CHI
Martin Weigel, Vikram Mehta, Jürgen Steimle
2009 conf
ISSCC
Raymond Zeng, Navneet Chalagalla, Dan Chu, Daniel Elmhurst, Matt Goldman, Chris Haid, Atif Huq, Takaaki Ichikawa, Joel Jorgensen, Owen Jungroth, Nishnat Kajla, Ravinder Kajley, Koichi Kawai, Jiro Kishimoto, Ali Madraswala, Tetsuji Manabe, Vikram Mehta, Midori Morooka, Katie Nguyen, Yoko Oikawa, Bharat Pathak, Rod Rozman, Tom Ryan, Andy Sendrowski, William Sheung, Martin Szwarc, Yasuhiro Takashima, Satoru Tamada, Toru Tanzawa, Tomoharu Tanaka, Mase Taub, Darshak Udeshi, Sjigekazu Yamada, Hiroyuki Yokoyama
redb/extractors/apk_extractors/apk_native_libs.py
← Index redb/extractors/apk_extractors/apk_native_libs.py python
import fnmatch
import hashlib
import inspect
from datetime import datetime, timezone
from typing import Any

from redb.extractors.enum import Tag
from redb.extractors.apk_extractor import APKExtractor
from redb.models.dataclasses import APKNativeLib

# Known packer/protector native library names
KNOWN_PACKER_LIBS = {
    # Jiagu (360/Qihoo)
    "libjiagu.so", "libjiagu_a64.so", "libjiagu_x86.so", "libjiagu_x64.so",
    # Bangcle/SecNeo
    "libsecexe.so", "libsecmain.so", "libSecShell.so",
    # Baidu
    "libbaiduprotect.so",
    # Tencent (Legu)
    "libtxAppProtect.so", "libBugly.so",
    # iJiami
    "libexec.so", "libexecmain.so",
    # Alibaba
    "libmobisec.so", "libaliprotect.so",
    # APKProtect
    "libAPKProtect.so",
    # Pangxie (Pangolin)
    "libdexjni.so",
    # DexProtector
    "libdexprotector.so",
    # AppSolid
    "libAppSolid.so",
    # Kiwisec
    "libkwscmm.so",
    # DingXiang
    "libx3g.so",
    # NQ Shield
    "libnqshield.so",
    # Generic / other
    "libprotectClass.so",
    "libDexHelper.so",
    "libdexloader.so",
    "libfdog.so",
}

# Glob-style patterns for packer libs (e.g. libshella-*.so)
KNOWN_PACKER_PATTERNS = [
    "libshella-*.so",
    "libshell-super.*.so",
]


def is_known_packer_lib(filename):
    """Check if a native library filename matches known packer signatures."""
    if filename in KNOWN_PACKER_LIBS:
        return True
    for pattern in KNOWN_PACKER_PATTERNS:
        if fnmatch.fnmatch(filename, pattern):
            return True
    return False


class APKNativeLibExtractor(APKExtractor):

    def __init__(
        self, filepath, log, exporters=None, index_prefix=None,
        known_benign=False, known_malicious=False,
        apk=None,
    ):
        super().__init__(
            filepath, log, exporters, index_prefix,
            known_benign, known_malicious, apk,
        )
        self.native_libs = []
        self.abis = set()
        self.log.debug(inspect.currentframe().f_code.co_name)

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

    def extract(self):
        if not self._is_valid_apk():
            self.log.error(f"Invalid APK for {self.hash.sha256}")
            return None

        self.native_libs = []
        self.abis = set()

        zf = self._get_zip_file()
        if not zf:
            return None

        with zf:
            for info in zf.infolist():
                if not (info.filename.startswith("lib/") and info.filename.endswith(".so")):
                    continue
                parts = info.filename.split("/")
                if len(parts) < 3:
                    continue

                abi = parts[1]
                filename = parts[-1]
                self.abis.add(abi)

                try:
                    data = zf.read(info.filename)
                    lib_sha256 = hashlib.sha256(data).hexdigest()
                except Exception as e:
                    self.log.warning(f"Error reading native lib {info.filename}: {e}")
                    continue

                self.native_libs.append(APKNativeLib(
                    abi=abi,
                    filename=filename,
                    size=info.file_size,
                    sha256=lib_sha256,
                    is_known_packer=is_known_packer_lib(filename),
                ))

        if not self.native_libs:
            return None

        return {
            "native_lib_count": len(self.native_libs),
            "abis": sorted(self.abis),
            "native_libs": self.native_libs,
            "known_packer_libs": [
                lib for lib in self.native_libs if lib.is_known_packer
            ],
        }

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

            current_time = datetime.now(timezone.utc)
            data = []
            for lib in self.native_libs:
                data.append([
                    self.sha256,
                    lib.abi,
                    lib.filename,
                    lib.size,
                    lib.sha256,
                    int(lib.is_known_packer),
                    current_time,
                ])

            column_names = [
                'sha256', 'lib_abi', 'lib_filename', 'lib_size',
                'lib_sha256', 'lib_is_known_packer', 'analysis_date',
            ]

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

            return (data, column_names, column_type_names)

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