Manish Agrawal

58 papers A 1C 4Journal 42Unranked 7
YearRankTypeTitle / Venue / Authors
2025 J jnl
Eng. Appl. Artif. Intell.
Shivam Choubey, Shailendra Rahi, Birupaksha Pal, Manish Agrawal
2025 J jnl
CoRR
Chaitanya Kumar Konda, Piyush Agrawal, Shivansh Srivastava, Manish Agrawal
2025 J jnl
Comput. Phys. Commun.
Sanjeet Patra, Manish Agrawal, Prasenjit Rath, Anirban Bhattacharya
2024 J jnl
CoRR
Shivam Choubey, Birupaksha Pal, Manish Agrawal
2024 A conf
ASSETS
Zhuohao Zhang, John R. Thompson, Aditi Shah, Manish Agrawal, Alper Sarikaya, Jacob O. Wobbrock, Edward Cutrell, Bongshin Lee
2024 J jnl
CoRR
Zhuohao (Jerry) Zhang, John R. Thompson, Aditi Shah, Manish Agrawal, Alper Sarikaya, Jacob O. Wobbrock, Edward Cutrell, Bongshin Lee
2024 J jnl
CoRR
Piyush Agrawal, Ihina Mahajan, Shivam Choubey, Manish Agrawal
2024 conf
HICSS
Varol O. Kayhan, Shivendu Shivendu, Manish Agrawal, David Zeng
2024 J jnl
Wirel. Networks
Khalid K. Almuzaini, Shubham Joshi, Stephen Ojo, Manish Agrawal, Preetam Suman, Piyush Kumar Pareek, Prashant Kumar Shukla
2024 J jnl
CoRR
Varol O. Kayhan, Shivendu Shivendu, Rouzbeh Behnia, Clinton Daniel, Manish Agrawal
2023 J jnl
Decis. Support Syst.
Varol O. Kayhan, Manish Agrawal, Shivendu Shivendu
2023 J jnl
Inf. Syst. Frontiers
Clinton Daniel, Matthew T. Mullarkey, Manish Agrawal
2021 J jnl
DTRAP
Rohit Valecha, Srikrishna Krishnarao Srinivasan, Tejaswi Volety, K. Hazel Kwon, Manish Agrawal, H. Raghav Rao
2021 J jnl
Int. J. Inf. Manag.
Shankar Prawesh, Kaushal Chari, Manish Agrawal
2021 ch.
IFIP's Exciting First 60+ Years
Steven Furnell, Paul S. Haskell-Dowland, Manish Agrawal, Richard L. Baskerville, Anirban Basu, Matt Bishop, Jorge Cuéllar, Sara Foresti, Lynn Futcher, Nurit Gal-Oz, Tejaswini (Teju) Herath, Christian Damsgaard Jensen, Allen C. Johnston, Wouter Joosen, Giovanni Livraga, Javier López, Stephen Marsh, Fabio Martinelli, Fabio Massacci, Aljosa Pasic, Stef Schinagl, Abbas Shahim, Kerry-Lynn Thomson, Jaideep Vaidya, Tony Vance, Merrill Warkentin
2021 J jnl
IT Prof.
Anupam Bhattacharjee, Manish Agrawal
2021 conf
SKM
Clinton Daniel, Matthew Mullarkey, Manish Agrawal
2021 conf
AMCIS
Manish Agrawal, Clinton Daniel, Beth Golub
2020 J jnl
CoRR
Manish Agrawal, Abhilash Nandy
2020 J jnl
IET Softw.
Manish Agrawal, Kaushal Chari
2018 J jnl
Decis. Support Syst.
He Zhang, Kaushal Chari, Manish Agrawal
2018 J jnl
Gov. Inf. Q.
Onook Oh, Priya Gupta, Manish Agrawal, H. Raghav Rao
2018 J jnl
Empir. Softw. Eng.
Kaushal Chari, Manish Agrawal
2017 J jnl
Appl. Math. Comput.
Manish Agrawal, C. S. Jog
2016 J jnl
J. Inf. Technol. Educ. Discuss. Cases
Manish Agrawal, Shivendu Shivendu
2016 J jnl
Inf. Syst. Manag.
Shankar Prawesh, Manish Agrawal, Kaushal Chari
2016 J jnl
Appl. Math. Comput.
C. S. Jog, Manish Agrawal, Arup Nandy
2015 J jnl
Artif. Intell. Law
Harvey S. Hyman, Terry Sincich, Rick Will, Manish Agrawal, Balaji Padmanabhan, Warren Fridy III
2015 conf
AMCIS
Jaeung Lee, Basma Abdul Rehman, Manish Agrawal, H. Raghav Rao
2015 J jnl
Inf. Syst. Frontiers
Jaeung Lee, Manish Agrawal, H. Raghav Rao
2015 conf
WEB
Jaeung Lee, Basma Abdul Rehman, Manish Agrawal, H. Raghav Rao
2014 C conf
ICIS
Srikanth Venkatesan, Himanshu Yadav, H. Raghav Rao, Manish Agrawal
2013 J jnl
MIS Q.
Onook Oh, Manish Agrawal, H. Raghav Rao
2013 J jnl
J. Organ. Comput. Electron. Commer.
Manish Agrawal, Govind Hariharan, H. Raghav Rao, Rajiv Kishore
2013 J jnl
J. Inf. Technol. Educ. Discuss. Cases
Manish Agrawal, Grandon Gill
2012 J jnl
J. Inf. Technol. Educ. Discuss. Cases
Manish Agrawal, Grandon Gill
2012 J jnl
J. Inf. Technol. Educ. Discuss. Cases
Manish Agrawal
2011 ch.
Cyber Security, Cyber Crime and Cyber Forensics
Himanshu Maheshwari, Harvey S. Hyman, Manish Agrawal
2011 C conf
ICIS
Onook Oh, Kyounghee Kwon, Manish Agrawal, H. Raghav Rao
2011 ch.
Cyber Security, Cyber Crime and Cyber Forensics
Divya Shankar, Manish Agrawal, H. Raghav Rao
2011 J jnl
Inf. Syst. Frontiers
Onook Oh, Manish Agrawal, H. Raghav Rao
2011 conf
WTS
Clayton Whitelaw, Manish Agrawal, H. Raghav Rao, Onook Oh
2009 J jnl
Manag. Sci.
Johan L. Perols, Kaushal Chari, Manish Agrawal
2009 J jnl
Int. J. Intell. Inf. Technol.
Manish Agrawal, Kaushal Chari
2008 J jnl
ACM Trans. Internet Techn.
Manish Gupta, Shamik Banerjee, Manish Agrawal, H. Raghav Rao
2007 J jnl
INFORMS J. Comput.
Kaushal Chari, Manish Agrawal
2007 J jnl
IEEE Trans. Software Eng.
Manish Agrawal, Kaushal Chari
2006 C conf
ICIS
Johan L. Perols, Kaushal Chari, Manish Agrawal
2006 J jnl
Inf. Manag.
Manish Agrawal, Rajiv Kishore, H. Raghav Rao
2005 J jnl
Decis. Support Syst.
Manish Agrawal, Govind Hariharan, Rajiv Kishore, H. Raghav Rao
2004 J jnl
J. Organ. Comput. Electron. Commer.
Ram D. Gopal, G. Lawrence Sanders, Sudip Bhattacharjee, Manish Agrawal, Suzanne C. Wagner
2004 C conf
ICEC
Manish Agrawal, Hemant Padmanabhan, Lokesh Pandey, H. Raghav Rao, Shambhu J. Upadhyaya
2004 conf
ICEIS (4)
Kaushal Chari, Manish Agrawal
2004 J jnl
J. Manag. Inf. Syst.
Rajiv Kishore, Manish Agrawal, H. Raghav Rao
2003 J jnl
Commun. ACM
Dan Jong Kim, Manish Agrawal, Bharat Jayaraman, H. Raghav Rao
2003 J jnl
Commun. Assoc. Inf. Syst.
Manish Agrawal, Kaushal Chari, Ravi Sankar
2003 J jnl
J. Organ. Comput. Electron. Commer.
Manish Agrawal, H. Raghav Rao, G. Lawrence Sanders
2002 ch.
Encyclopedia of Information Systems
Manish Agrawal, Chun-Jen Kuo, H. Raghav Rao, Kichan Nam
redb/extractors/apk_extractors/apk_features.py
← Index redb/extractors/apk_extractors/apk_features.py python
import inspect
import zipfile
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 APKFeatures


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

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

    def _extract_zip_timestamps(self):
        """Extract earliest and latest content modification from ZIP entries."""
        earliest = None
        latest = None
        try:
            zf = self._get_zip_file()
            if zf:
                with zf:
                    for info in zf.infolist():
                        try:
                            dt = datetime(*info.date_time)
                            if earliest is None or dt < earliest:
                                earliest = dt
                            if latest is None or dt > latest:
                                latest = dt
                        except (ValueError, TypeError):
                            continue
        except Exception as e:
            self.log.warning(f"Error extracting ZIP timestamps: {e}")
        return (
            earliest.isoformat() if earliest else None,
            latest.isoformat() if latest else None,
        )

    def _extract_supported_abis(self):
        """Determine supported ABIs from lib/ directory."""
        abis = set()
        for f in self._list_files():
            if f.startswith("lib/") and f.endswith(".so"):
                parts = f.split("/")
                if len(parts) >= 3:
                    abis.add(parts[1])
        return sorted(abis)

    def _count_dex_files(self):
        """Count DEX files and compute total size."""
        dex_count = 0
        total_size = 0
        try:
            zf = self._get_zip_file()
            if zf:
                with zf:
                    for info in zf.infolist():
                        if info.filename.endswith(".dex"):
                            dex_count += 1
                            total_size += info.file_size
        except Exception as e:
            self.log.warning(f"Error counting DEX files: {e}")
        return dex_count, total_size

    def _check_embedded_apk(self):
        """Check if the archive contains nested APK files."""
        for f in self._list_files():
            if f.lower().endswith(".apk"):
                return True
        return False

    def _safe_extract(self, field_name, func, default=None):
        """Extract a single field, logging and returning default on failure."""
        try:
            return func()
        except Exception as e:
            self.log.warning(
                f"Error extracting APK field '{field_name}' for "
                f"{self.hash.sha256}: {e}"
            )
            return default

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

        package_name = self._safe_extract(
            "package_name", lambda: self.apk.get_package()
        )
        app_name = self._safe_extract(
            "app_name", lambda: self.apk.get_app_name()
        )

        def _get_version_code():
            try:
                return int(self.apk.get_androidversion_code() or 0)
            except (ValueError, TypeError):
                return 0

        version_code = self._safe_extract("version_code", _get_version_code)
        version_name = self._safe_extract(
            "version_name", lambda: self.apk.get_androidversion_name()
        )

        def _get_sdk(getter):
            val = getter()
            return int(val) if val else None

        min_sdk = self._safe_extract(
            "min_sdk_version", lambda: _get_sdk(self.apk.get_min_sdk_version)
        )
        target_sdk = self._safe_extract(
            "target_sdk_version", lambda: _get_sdk(self.apk.get_target_sdk_version)
        )
        compile_sdk = self._safe_extract(
            "compile_sdk_version",
            lambda: _get_sdk(self.apk.get_effective_target_sdk_version),
        )

        main_activity = self._safe_extract(
            "main_activity", lambda: self.apk.get_main_activity()
        )

        is_debuggable = self._safe_extract(
            "is_debuggable",
            lambda: self.apk.get_attribute_value(
                "application", "debuggable"
            ) == "true",
            False,
        )
        allow_backup = self._safe_extract(
            "allow_backup",
            lambda: self.apk.get_attribute_value(
                "application", "allowBackup"
            ) != "false",
            True,
        )
        uses_cleartext = self._safe_extract(
            "uses_cleartext_traffic",
            lambda: self.apk.get_attribute_value(
                "application", "usesCleartextTraffic"
            ) == "true",
            False,
        )

        supported_abis = self._safe_extract(
            "supported_abis", self._extract_supported_abis, []
        )
        dex_count, total_dex_size = self._safe_extract(
            "dex_files", self._count_dex_files, (0, 0)
        )
        all_files = self._safe_extract("file_list", self._list_files, [])
        total_file_count = len(all_files)
        has_native_code = any(
            f.startswith("lib/") and f.endswith(".so") for f in all_files
        )
        has_assets = any(f.startswith("assets/") for f in all_files)
        contains_embedded_apk = self._safe_extract(
            "contains_embedded_apk", self._check_embedded_apk, False
        )

        uses_libraries = self._safe_extract(
            "uses_libraries",
            lambda: list(self.apk.get_libraries() or []),
            [],
        )

        earliest_mod, latest_mod = self._safe_extract(
            "zip_timestamps", self._extract_zip_timestamps, (None, None)
        )

        self.apk_features = APKFeatures(
            package_name=package_name,
            app_name=app_name,
            version_code=version_code,
            version_name=version_name,
            min_sdk_version=min_sdk,
            target_sdk_version=target_sdk,
            compile_sdk_version=compile_sdk,
            main_activity=main_activity,
            is_debuggable=is_debuggable,
            allow_backup=allow_backup,
            uses_cleartext_traffic=uses_cleartext,
            supported_abis=supported_abis,
            dex_count=dex_count,
            total_dex_size=total_dex_size,
            total_file_count=total_file_count,
            has_native_code=has_native_code,
            has_assets=has_assets,
            uses_libraries=uses_libraries,
            earliest_content_modification=earliest_mod,
            latest_content_modification=latest_mod,
            contains_embedded_apk=contains_embedded_apk,
        )
        return self.apk_features

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

            f = self.apk_features
            current_time = datetime.now(timezone.utc)
            data = [[
                self.sha256,
                f.package_name,
                f.app_name,
                f.version_code,
                f.version_name,
                f.min_sdk_version,
                f.target_sdk_version,
                f.compile_sdk_version,
                f.main_activity,
                int(f.is_debuggable),
                int(f.allow_backup),
                int(f.uses_cleartext_traffic),
                f.supported_abis,
                f.dex_count,
                f.total_dex_size,
                f.total_file_count,
                int(f.has_native_code),
                int(f.has_assets),
                f.uses_libraries,
                f.earliest_content_modification,
                f.latest_content_modification,
                int(f.contains_embedded_apk),
                current_time,
            ]]

            column_names = [
                "sha256",
                "package_name", "app_name", "version_code", "version_name",
                "min_sdk_version", "target_sdk_version", "compile_sdk_version",
                "main_activity",
                "is_debuggable", "allow_backup", "uses_cleartext_traffic",
                "supported_abis",
                "dex_count", "total_dex_size", "total_file_count",
                "has_native_code", "has_assets",
                "uses_libraries",
                "earliest_content_modification", "latest_content_modification",
                "contains_embedded_apk",
                "analysis_date",
            ]

            column_type_names = [
                "FixedString(64)",
                "Nullable(String)", "Nullable(String)", "Nullable(UInt32)", "Nullable(String)",
                "Nullable(UInt16)", "Nullable(UInt16)", "Nullable(UInt16)",
                "Nullable(String)",
                "UInt8", "UInt8", "UInt8",
                "Array(String)",
                "UInt16", "UInt64", "UInt32",
                "UInt8", "UInt8",
                "Array(String)",
                "Nullable(String)", "Nullable(String)",
                "UInt8",
                "DateTime64(3, 'UTC')",
            ]

            return (data, column_names, column_type_names)

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