Neil McBride

35 papers B 1Misc 1Journal 23Unranked 10
YearRankTypeTitle / Venue / Authors
2024 conf
TAS
Harriet R. Cameron, Neil McBride, Paschal A. Ochang, Bernd C. Stahl
2023 J jnl
Eur. J. Inf. Syst.
Neil McBride, Samuel Liyala
2021 J jnl
J. Inf. Technol.
Neil McBride
2020 J jnl
AI Soc.
Neil McBride
2020 J jnl
IEEE Technol. Soc. Mag.
Neil McBride
2019 conf
ICT4D (2)
Bakari Mashaka, Neil McBride, Kutoma Wakunuma
2018 J jnl
Commun. Assoc. Inf. Syst.
Neil McBride
2018 J jnl
Commun. Assoc. Inf. Syst.
Neil McBride
2016 J jnl
IEEE Intell. Syst.
Neil McBride, Robert R. Hoffman
2015 J jnl
SIGCAS Comput. Soc.
Neil McBride
2015 J jnl
Int. J. Bus. Intell. Res.
Neil McBride
2014 J jnl
Int. J. Inf. Manag.
Neil McBride
2014 J jnl
Int. J. Technoethics
Brent D. Mittelstadt, N. Ben Fairweather, Mark Christopher Shaw, Neil McBride
2013 conf
UKAIS
Neil McBride
2012 J jnl
Commun. ACM
Neil McBride
2011 B conf
Intelligent Environments (Workshops)
Neil McBride
2010 conf
WEBIST (2)
Mohammed Altayar, N. Ben Fairweather, Neil McBride
2010 J jnl
J. Inf. Commun. Ethics Soc.
Bernd Carsten Stahl, Neil McBride, Ibrahim Elbeltagi
2010 Misc conf
QUATIC
Neil McBride
2009 J jnl
Int. J. Inf. Manag.
Neil McBride
2008 J jnl
Inf. Technol. People
Neil McBride
2007 conf
ECIS
Aileen Cater-Steel, Neil McBride
2005 J jnl
J. Inf. Syst. Educ.
Neil McBride
2005 J jnl
Inf. Syst. J.
Neil McBride
2005 J jnl
J. Glob. Inf. Manag.
Ibrahim Elbeltagi, Neil McBride, Glenn Hardaker
2003 J jnl
Inf. Softw. Technol.
Neil McBride
2003 J jnl
Commun. Assoc. Inf. Syst.
Neil McBride, Ray Hackney
2002 J jnl
Commun. Assoc. Inf. Syst.
Ray Hackney, Neil McBride
2002 J jnl
J. Organ. End User Comput.
Neil McBride, Trevor Wood-Harper
2001 conf
ECIS
Neil McBride, Ray Hackney
1999 conf
HICSS
Ray Hackney, Gurpreet Dhillon, Neil McBride, Shalini Kesar
1997 conf
ECIS
Gurpreet Dhillon, Tony Cornford, Ray Hackney, Neil McBride, Leiser Silva
1997 J jnl
Inf. Syst. J.
Neil McBride
1996 conf
ECIS
Neil McBride
1995 conf
HICSS (3)
Neil McBride
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"