N. Dinesh Reddy

28 papers A* 9A 2C 1Journal 11Unranked 5
YearRankTypeTitle / Venue / Authors
2025 J jnl
CoRR
Siddharth Tourani, Jayaram Reddy, Akash Kumbar, Satyajit Tourani, Nishant Goyal, Madhava Krishna, N. Dinesh Reddy, Muhammad Haris Khan
2025 J jnl
CoRR
Siddharth Tourani, Jayaram Reddy, Sarvesh Thakur, K. Madhava Krishna, Muhammad Haris Khan, N. Dinesh Reddy
2025 J jnl
CoRR
N. Dinesh Reddy, Dylan Snyder, Lona Kiragu, Mirajul Mohin, Shahrear Bin Amin, Sudeep Pillai
2024 A* conf
ICRA
Siddharth Tourani, Jayaram Reddy, Sarvesh Thakur, K. Madhava Krishna, Muhammad Haris Khan, N. Dinesh Reddy
2024 A* conf
CVPR
Khiem Vuong, N. Dinesh Reddy, Robert Tamburo, Srinivasa G. Narasimhan
2024 J jnl
CoRR
Khiem Vuong, N. Dinesh Reddy, Robert Tamburo, Srinivasa G. Narasimhan
2023 A* conf
CVPR
Anurag Ghosh, N. Dinesh Reddy, Christoph Mertz, Srinivasa G. Narasimhan
2023 J jnl
CoRR
Anurag Ghosh, N. Dinesh Reddy, Christoph Mertz, Srinivasa G. Narasimhan
2023 A* conf
CVPR
Gengshan Yang, Chaoyang Wang, N. Dinesh Reddy, Deva Ramanan
2023 J jnl
CoRR
Gengshan Yang, Chaoyang Wang, N. Dinesh Reddy, Deva Ramanan
2022 A* conf
CVPR
N. Dinesh Reddy, Robert Tamburo, Srinivasa G. Narasimhan
2021 A* conf
CVPR
N. Dinesh Reddy, Laurent Guigues, Leonid Pishchulin, Jayan Eledath, Srinivasa G. Narasimhan
2021 C conf
IV
Fangyu Li, N. Dinesh Reddy, Xudong Chen, Srinivasa G. Narasimhan
2020 conf
ECCV (2)
Mark Sheinin, N. Dinesh Reddy, Matthew O'Toole, Srinivasa G. Narasimhan
2019 A* conf
CVPR
N. Dinesh Reddy, Minh Vo, Srinivasa G. Narasimhan
2018 A* conf
CVPR
N. Dinesh Reddy, Minh Vo, Srinivasa G. Narasimhan
2017 conf
VISIGRAPP (5: VISAPP)
Nazrul Haque, N. Dinesh Reddy, K. Madhava Krishna
2017 J jnl
CoRR
Nazrul Haque, N. Dinesh Reddy, K. Madhava Krishna
2017 conf
EMMCVPR
Nazrul Haque, N. Dinesh Reddy, K. Madhava Krishna
2016 J jnl
CoRR
N. Dinesh Reddy, Iman Abbasnejad, Sheetal Reddy, Amit Kumar Mondal, Vindhya Devalla
2016 A conf
IROS
N. Dinesh Reddy, Iman Abbasnejad, Sheetal Reddy, Amit Kumar Mondal, Vindhya Devalla
2016 A* conf
ICRA
Falak Chhaya, N. Dinesh Reddy, Sarthak Upadhyay, Visesh Chari, M. Zeeshan Zia, K. Madhava Krishna
2015 J jnl
CoRR
N. Dinesh Reddy, Prateek Singhal, Visesh Chari, K. Madhava Krishna
2015 A conf
IROS
N. Dinesh Reddy, Prateek Singhal, Visesh Chari, K. Madhava Krishna
2015 J jnl
CoRR
N. Dinesh Reddy, Prateek Singhal, K. Madhava Krishna
2014 conf
ICVGIP
N. Dinesh Reddy, Prateek Singhal, K. Madhava Krishna
2014 conf
ICVGIP
Prateek Singhal, Aditya Deshpande, Harit Pandya, N. Dinesh Reddy, K. Madhava Krishna
2013 J jnl
CoRR
Prateek Singhal, Aditya Deshpande, N. Dinesh Reddy, K. Madhava Krishna
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"