Oliver Scheuer

31 papers A 5B 10C 1Journal 5Unranked 10
YearRankTypeTitle / Venue / Authors
2013 conf
CSCL (2)
Oliver Scheuer, Bruce M. McLaren, Armin Weinberger
2013 J jnl
IEEE Trans. Learn. Technol.
Oliver Scheuer, Bruce M. McLaren
2013 conf
CSCL (2)
Dimitra Tsovaltzi, Armin Weinberger, Oliver Scheuer, Toby Dragon, Bruce M. McLaren
2012 B conf
EC-TEL
Dimitra Tsovaltzi, Armin Weinberger, Oliver Scheuer, Toby Dragon, Bruce M. McLaren
2012 B conf
ITS
Oliver Scheuer, Bruce M. McLaren, Armin Weinberger, Sabine Niebuhr
2011 conf
CSCL
Frank Loll, Niels Pinkwart, Oliver Scheuer, Bruce M. McLaren
2011 C conf
ICCE
Oliver Scheuer, Bruce M. McLaren, Maralee Harrell, Armin Weinberger
2011 A conf
AIED
Oliver Scheuer, Bruce M. McLaren, Maralee Harrell, Armin Weinberger
2010 B conf
EC-TEL
Frank Loll, Oliver Scheuer, Bruce M. McLaren, Niels Pinkwart
2010 J jnl
Int. J. Comput. Support. Collab. Learn.
Oliver Scheuer, Frank Loll, Niels Pinkwart, Bruce M. McLaren
2010 conf
MKWI
Frank Loll, Niels Pinkwart, Oliver Scheuer, Bruce M. McLaren
2010 J jnl
Comput. Educ.
Rupert Wegerif, Bruce M. McLaren, Marian Chamrada, Oliver Scheuer, Nasser Mansour, Jan Miksatko, Mriga Williams
2010 B conf
Intelligent Tutoring Systems (2)
Frank Loll, Oliver Scheuer, Bruce M. McLaren, Niels Pinkwart
2010 conf
ICWL Workshops
Xiaohong Tan, Carsten Ullrich, Oliver Scheuer, Erica Melis, Ruimin Shen
2010 J jnl
Int. J. Artif. Intell. Educ.
Bruce M. McLaren, Oliver Scheuer, Jan Miksatko
2009 A conf
AIED
Oliver Scheuer, Bruce M. McLaren, Frank Loll, Niels Pinkwart
2009 conf
CSCL (2)
Frank Loll, Niels Pinkwart, Oliver Scheuer, Bruce M. McLaren
2009 A conf
AIED
Bruce M. McLaren, Rupert Wegerif, Jan Miksatko, Oliver Scheuer, Marian Chamrada, Nasser Mansour
2009 conf
CSCL (2)
Niels Pinkwart, Frank Loll, Oliver Scheuer, Bruce M. McLaren
2009 conf
CSCL (1)
Rupert Wegerif, Bruce M. McLaren, Marian Chamrada, Oliver Scheuer, Nasser Mansour, Jan Miksatko
2009 B conf
ICALT
Frank Loll, Niels Pinkwart, Oliver Scheuer, Bruce M. McLaren
2008 B conf
EC-TEL
Dimitra Tsovaltzi, Nikol Rummel, Niels Pinkwart, Andreas Harrer, Oliver Scheuer, Isabel Braun, Bruce M. McLaren
2008 B conf
Intelligent Tutoring Systems
Oliver Scheuer, Bruce M. McLaren
2008 B conf
Intelligent Tutoring Systems
Andreas Harrer, Niels Pinkwart, Bruce M. McLaren, Oliver Scheuer
2008 J jnl
IEEE Trans. Learn. Technol.
Andreas Harrer, Niels Pinkwart, Bruce M. McLaren, Oliver Scheuer
2008 B conf
Intelligent Tutoring Systems
Dimitra Tsovaltzi, Bruce M. McLaren, Nikol Rummel, Oliver Scheuer, Andreas Harrer, Niels Pinkwart, Isabel Braun
2007 conf
CSCL
Rakheli Hever, Reuma De Groot, Maarten de Laat, Andreas Harrer, Ulrich Hoppe, Bruce M. McLaren, Oliver Scheuer
2007 A conf
AIED
Oliver Scheuer, Claus Zinn
2007 A conf
AIED
Bruce M. McLaren, Oliver Scheuer, Maarten de Laat, Rakheli Hever, Reuma De Groot, Carolyn P. Rosé
2006 B conf
EC-TEL
Claus Zinn, Oliver Scheuer
2005 conf
LWA
Martin Mühlenbrock, Oliver Scheuer
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"