Hanna Schraffenberger

25 papers A* 1B 2C 2Journal 7Unranked 13
YearRankTypeTitle / Venue / Authors
2026 conf
CHI Extended Abstracts
Gabi Schaap, Yana van de Sande, Hanna Schraffenberger
2026 conf
CHI Extended Abstracts
Floris Jansen, Hanna Schraffenberger, Bart Jacobs
2026 J jnl
CoRR
Simon W. S. Fischer, Hanna Schraffenberger, Serge Thill, Pim Haselager
2025 J jnl
CoRR
Paul Graßl, Hanna Schraffenberger, Frederik J. Zuiderveen Borgesius, Moniek Buijzen
2025 conf
FAccT
Tim De Jonge, Hanna Schraffenberger, Jorrit Geels, Jaap-Henk Hoepman, Marie-Sophie Simon, Frederik J. Zuiderveen Borgesius
2025 J jnl
CoRR
Simon W. S. Fischer, Hanna Schraffenberger, Serge Thill, Pim Haselager
2024 conf
CHI Extended Abstracts
Yorick Last, Jorrit Geels, Hanna Schraffenberger
2024 J jnl
CoRR
Yorick Last, Jorrit Geels, Hanna Schraffenberger
2024 conf
NordiCHI (Adjunct)
Marie-Sophie Simon, Hanna Schraffenberger, Raphaël Gellert
2024 conf
CHI Extended Abstracts
Gabi Schaap, Yana van de Sande, Hanna Schraffenberger
2024 A* conf
CHI
Ashley Sheil, Gunes Acar, Hanna Schraffenberger, Raphaël Gellert, David Malone
2023 J jnl
CoRR
Ashley Sheil, Gunes Acar, Hanna Schraffenberger, Raphaël Gellert, David Malone
2023 conf
CHI Extended Abstracts
Jelmer Tiemessen, Hanna Schraffenberger, Gunes Acar
2021 conf
UMAP (Adjunct Publication)
Frederik J. Zuiderveen Borgesius, Hanna Schraffenberger, Marvin van Bekkum
2021 J jnl
CoRR
Staas de Jong, Jeroen Jillissen, Dünya Kirkali, Alwin de Rooij, Hanna Schraffenberger, Arnout Terpstra
2019 conf
BNAIC/BENELEARN
Hanna Schraffenberger, Yana van de Sande, Gabi Schaap, Tibor Bosse
2019 B conf
CogSci
Thijs van Den Hout, Hanna Schraffenberger, Florian Krauze, Tibor Bosse, Frank T. M. Leoné
2018 B conf
TEI
Alwin de Rooij, Hanna Schraffenberger, Mathijs Bontje
2017 conf
ArtsIT/DLI
Hanna Schraffenberger, Edwin van der Heide
2017 conf
ArtsIT/DLI
Alwin de Rooij, Michel van Dartel, Antal Ruhl, Hanna Schraffenberger, Bente van Melick, Mathijs Bontje, Mischa Daams, Michel Witter
2016 conf
MVAR@ICMI
Hanna Schraffenberger, Edwin van der Heide
2015 J jnl
Int. J. Arts Technol.
Hanna Schraffenberger, Edwin van der Heide
2013 C conf
ArtsIT
Hanna Schraffenberger, Edwin van der Heide
2011 C conf
ArtsIT
Hanna Schraffenberger, Edwin van der Heide
2010 conf
CHI Extended Abstracts
Staas de Jong, Dünya Kirkali, Hanna Schraffenberger, Jeroen Jillissen, Alwin de Rooij, Arnout Terpstra
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"