Oleg Ursu

18 papers Misc 1Journal 16Unranked 1
YearRankTypeTitle / Venue / Authors
2022 J jnl
J. Chem. Inf. Model.
Javier L. Baylon, Oleg Ursu, Anja Muzdalo, Anne Mai Wassermann, Gregory L. Adams, Martin Spale, Petr Mejzlík, Anna Gromek, Viktor Pisarenko, Dzianis Hancharyk, Esteban Jenkins, David Bednar, Charlie Chang, Kamila Clarova, Meir Glick, Danny A. Bitton
2021 J jnl
Nucleic Acids Res.
Sorin I. Avram, Cristian Bologa, Jayme Holmes, Giovanni Bocci, Thomas B. Wilson, Dac-Trung Nguyen, Ramona Curpan, Liliana Halip, Alina Bora, Jeremy J. Yang, Jeffrey Knockel, Suman Sirimulla, Oleg Ursu, Tudor I. Oprea
2019 J jnl
Nucleic Acids Res.
Oleg Ursu, Jayme Holmes, Cristian Bologa, Jeremy J. Yang, Stephen L. Mathias, Vasileios Stathias, Dac-Trung Nguyen, Stephan C. Schürer, Tudor I. Oprea
2018 J jnl
Health Informatics J.
Rodrigo Vazquez Guillamet, Oleg Ursu, Gary Iwamoto, Pope L. Moseley, Tudor I. Oprea
2017 J jnl
J. Biomed. Semant.
Yu Lin, Saurabh Mehta, Hande Küçük-McGinty, John Paul Turner, Dusica Vidovic, Michele Forlin, Amar Koleti, Dac-Trung Nguyen, Lars Juhl Jensen, Rajarshi Guha, Stephen L. Mathias, Oleg Ursu, Vasileios Stathias, Jianbin Duan, Nooshin Nabizadeh, Caty Chung, Christopher Mader, Ubbo Visser, Jeremy J. Yang, Cristian Bologa, Tudor I. Oprea, Stephan C. Schürer
2017 J jnl
Nucleic Acids Res.
Oleg Ursu, Jayme Holmes, Jeffrey Knockel, Cristian Bologa, Jeremy J. Yang, Stephen L. Mathias, Stuart J. Nelson, Tudor I. Oprea
2017 J jnl
J. Am. Medical Informatics Assoc.
Stuart J. Nelson, Tudor I. Oprea, Oleg Ursu, Cristian Bologa, Amrapali Zaveri, Jayme Holmes, Jeremy J. Yang, Stephen L. Mathias, Subramani Mani, Mark S. Tuttle, Michel Dumontier
2017 conf
BIBM
Qiong Cheng, Oleg Ursu, Tudor I. Oprea, Stephan C. Schürer
2017 J jnl
Nucleic Acids Res.
Dac-Trung Nguyen, Stephen L. Mathias, Cristian Bologa, Søren Brunak, Nicolas F. Fernandez, Anna Gaulton, Anne Hersey, Jayme Holmes, Lars Juhl Jensen, Anneli Karlsson, Guixia Liu, Avi Ma'ayan, Geetha Mandava, Subramani Mani, Saurabh Mehta, John P. Overington, Juhee Patel, Andrew D. Rouillard, Stephan C. Schürer, Timothy Sheils, Anton Simeonov, Larry A. Sklar, Noel Southall, Oleg Ursu, Dusica Vidovic, Anna Waller, Jeremy J. Yang, Ajit Jadhav, Tudor I. Oprea, Rajarshi Guha
2017 J jnl
J. Biomed. Informatics
Subramani Mani, Daniel Cannon, Robin Ohls, Tudor I. Oprea, Stephen L. Mathias, Karri Ballard, Oleg Ursu, Cristian Bologa
2017 J jnl
Bioinform.
Daniel Cannon, Jeremy J. Yang, Stephen L. Mathias, Oleg Ursu, Subramani Mani, Anna Waller, Stephan C. Schürer, Lars Juhl Jensen, Larry A. Sklar, Cristian Bologa, Tudor I. Oprea
2016 J jnl
J. Cheminformatics
Jeremy J. Yang, Oleg Ursu, Christopher A. Lipinski, Larry A. Sklar, Tudor I. Oprea, Cristian Bologa
2016 J jnl
J. Cheminformatics
Gergely Zahoránszky-Köhalmi, Cristian Bologa, Oleg Ursu, Tudor I. Oprea
2016 J jnl
J. Cheminformatics
Gergely Zahoránszky-Köhalmi, Cristian Bologa, Oleg Ursu, Tudor I. Oprea
2015 Misc conf
AMIA
Subramani Mani, Daniel Cannon, Tudor I. Oprea, Stephen L. Mathias, Oleg Ursu, Cristian Bologa
2013 J jnl
Database J. Biol. Databases Curation
Stephen L. Mathias, Jarrett Hines-Kay, Jeremy J. Yang, Gergely Zahoránszky-Köhalmi, Cristian Bologa, Oleg Ursu, Tudor I. Oprea
2010 J jnl
J. Chem. Inf. Model.
Oleg Ursu, Tudor I. Oprea
2010 J jnl
Bioinform.
Ricard García-Serna, Oleg Ursu, Tudor I. Oprea, Jordi Mestres
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"