R. Sudharshan Kaarthik

26 papers C 10Journal 13Unranked 3
YearRankTypeTitle / Venue / Authors
2025 J jnl
IEEE Trans. Instrum. Meas.
Sreehari Balachandran Nair, Anoop Chandrika Sreekantan, R. Sudharshan Kaarthik
2025 J jnl
IEEE Instrum. Meas. Mag.
Sreehari Balachandran Nair, Anoop Chandrika Sreekantan, R. Sudharshan Kaarthik, Umesh R. Kadhane, V. S. Sooraj
2024 J jnl
IEEE Trans. Ind. Electron.
Vidya V, Balwant Kushwaha, R. Sudharshan Kaarthik
2023 C conf
IECON
Vidya V, R. Sudharshan Kaarthik
2023 C conf
IECON
Deeksha Bhule, R. Sudharshan Kaarthik
2023 J jnl
IEEE Trans. Instrum. Meas.
Sreehari Balachandran Nair, Anoop Chandrika Sreekantan, R. Sudharshan Kaarthik
2022 J jnl
IEEE Trans. Instrum. Meas.
Sreehari Balachandran Nair, Naveen Suresh, Anoop Chandrika Sreekantan, R. Sudharshan Kaarthik
2021 J jnl
IEEE Trans. Ind. Electron.
G. S. Athira, Archana C. M, R. Sudharshan Kaarthik, P. P. Rajeevan
2019 conf
ISIE
S. Ranjith, R. Sudharshan Kaarthik
2018 C conf
IECON
G. S. Athira, R. Sudharshan Kaarthik, P. P. Rajeevan
2018 C conf
IECON
S. Ranjith, R. Sudharshan Kaarthik
2018 conf
CCECE
Tamanwe Payarou, Kirankumar Kuruvinashetti, R. Sudharshan Kaarthik, Pragasen Pillay, Muthukumaran Packirisamy
2017 C conf
IECON
R. Sudharshan Kaarthik, Jaison Mathew, K. Gopakumar
2017 J jnl
IEEE Trans. Ind. Electron.
Abhijit Kshirsagar, R. Sudharshan Kaarthik, K. Gopakumar, Loganathan Umanand, Kaushik Rajashekara
2016 J jnl
IEEE Trans. Ind. Electron.
S. Arun Rahul, R. Sudharshan Kaarthik, K. Gopakumar, Leopoldo García Franquelo, Jose Ignacio León Galván
2016 J jnl
IEEE Trans. Ind. Electron.
Mathews Boby, Sumit Pramanick, R. Sudharshan Kaarthik, S. Arun Rahul, K. Gopakumar, Loganathan Umanand
2016 C conf
IECON
Abhijit Kshirsagar, R. Sudharshan Kaarthik, S. Arun Rahul, K. Gopakumar, Loganathan Umanand, Sujit Biswas, Carlo Cecati
2016 J jnl
IEEE Trans. Ind. Electron.
R. Sudharshan Kaarthik, K. Gopakumar, Carlo Cecati, István Nagy
2015 J jnl
IEEE Trans. Ind. Electron.
R. Sudharshan Kaarthik, K. Gopakumar, Carlo Cecati, István Nagy
2015 conf
ICIT
R. Sudharshan Kaarthik, P. Roshan Kumar, K. Gopakumar, José I. Leon, Leopoldo García Franquelo
2015 J jnl
IEEE Trans. Ind. Electron.
Sumit Pramanick, Najath Abdul Azeez, R. Sudharshan Kaarthik, K. Gopakumar, Carlo Cecati
2015 J jnl
IEEE Trans. Ind. Electron.
R. Sudharshan Kaarthik, K. Gopakumar, Jaison Mathew, Tore Undeland
2015 C conf
IECON
Abhijit Kshirsagar, R. Sudharshan Kaarthik, Loganathan Umanand, K. Gopakumar, Kaushik Rajashekara
2015 C conf
IECON
R. Sudharshan Kaarthik, K. Gopakumar, Carlo Cecati, István Nagy
2014 C conf
IECON
R. Sudharshan Kaarthik, K. Gopakumar, Carlo Cecati, István Nagy
2013 C conf
IECON
P. Roshan Kumar, R. Sudharshan Kaarthik, K. Gopakumar, P. P. Rajeevan, José I. Leon, Leopoldo García Franquelo
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"