Malin Premaratne

30 papers A* 1C 2Journal 14Unranked 13
YearRankTypeTitle / Venue / Authors
2026 J jnl
IEEE Commun. Lett.
Kosala Herath, Malin Premaratne, Sharadhi Gunathilake, Ampalavanapillai Nirmalathas
2026 J jnl
IEEE Open J. Commun. Soc.
Sharadhi Gunathilake, Ampalavanapillai Nirmalathas, Kosala Herath, Malin Premaratne
2025 J jnl
IEEE Open J. Commun. Soc.
Sharadhi Gunathilake, Ampalavanapillai Nirmalathas, Kosala Herath, Malin Premaratne
2024 J jnl
IEEE J. Sel. Areas Commun.
Kosala Herath, Ampalavanapillai Nirmalathas, Sarath D. Gunapala, Malin Premaratne
2024 A* conf
AAAI
Nisal Ranasinghe, Damith A. Senanayake, Sachith Seneviratne, Malin Premaratne, Saman K. Halgamuge
2024 J jnl
IEEE Open J. Commun. Soc.
Kosala Herath, Malin Premaratne, Sharadhi Gunathilake, Ampalavanapillai Nirmalathas
2023 J jnl
CoRR
Nisal Ranasinghe, Damith A. Senanayake, Sachith Seneviratne, Malin Premaratne, Saman K. Halgamuge
2020 J jnl
NeuroImage
Shenpeng Li, Sharna D. Jamadar, Phillip G. D. Ward, Malin Premaratne, Gary F. Egan, Zhaolin Chen
2019 J jnl
IEEE Access
Linda Shao, Malin Premaratne, Weiren Zhu
2019 J jnl
IEEE Commun. Lett.
Saman Atapattu, Nathan Ross, Yindi Jing, Malin Premaratne
2014 J jnl
Neurocomputing
Prashan Premaratne, Malin Premaratne
2013 J jnl
Neurocomputing
Prashan Premaratne, Sabooh Ajaz, Malin Premaratne
2012 conf
ICHIT (1)
Chintha C. Handapangoda, Malin Premaratne, Saeid Nahavandi
2012 conf
EMBC
Chintha Chamalie Handapangoda, Malin Premaratne, Saeid Nahavandi
2012 C conf
ISCC
Vineetha Kalavally, Ivan D. Rukhlenko, Malin Premaratne
2012 conf
ICIC (3)
Prashan Premaratne, Malin Premaratne
2012 conf
ICIC (3)
Prashan Premaratne, Malin Premaratne
2011 conf
ICIC (2)
Sabooh Ajaz, Prashan Premaratne, Malin Premaratne
2011 conf
ICIC (2)
Prashan Premaratne, Sabooh Ajaz, Malin Premaratne
2010 conf
ICIC (3)
Prashan Premaratne, Quang Nguyen, Malin Premaratne
2009 J jnl
Sensors
Suhinthan Maheswararajah, Saman K. Halgamuge, Malin Premaratne
2009 J jnl
IEEE Trans. Veh. Technol.
Suhinthan Maheswararajah, Saman K. Halgamuge, Malin Premaratne
2007 conf
FBIT
Chintha C. Handapangoda, Malin Premaratne, Leslie Y. Yeo, James R. Friend
2007 conf
ICNSC
Pubudu N. Pathirana, Allan E. K. Lim, John Carminati, Malin Premaratne
2006 conf
DELTA
Vineetha Kalavally, Tin Win, Malin Premaratne
2006 conf
DELTA
Lau Bei Yer, Vineetha Kalavally, Tin Win, Malin Premaratne
2005 J jnl
IEICE Trans. Electron.
Andrew Che-On Chan, Malin Premaratne
2005 conf
Web Intelligence
Rasika Amarasiri, Damminda Alahakoon, Kate A. Smith, Malin Premaratne
2004 C conf
ISPA
Elankovan Sundararajan, Malin Premaratne, Shanika Karunasekera, Aaron Harwood
2004 conf
GECCO (2)
Mohammad Amin Dallaali, Malin Premaratne
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"