Wai-Tat Fu

127 papers A* 21A 21B 19Misc 1Journal 23Unranked 37
YearRankTypeTitle / Venue / Authors
2019 J jnl
Proc. ACM Hum. Comput. Interact.
Dennis Wang, Yi-Chieh Lee, Wai-Tat Fu
2019 A* conf
CHI
Helen C. Wauck, Elisa D. Mekler, Wai-Tat Fu
2019 J jnl
Comput. Graph. Forum
Chi-Hsien (Eric) Yen, Aditya G. Parameswaran, Wai-Tat Fu
2019 A conf
IUI
Chi-Hsien (Eric) Yen, Yu-Chun (Grace) Yen, Wai-Tat Fu
2019 A ed.
IUI
Wai-Tat Fu, Shimei Pan, Oliver Brdiczka, Polo Chau, Gaelle Calvary
2019 J jnl
ACM Trans. Interact. Intell. Syst.
Fang Chen, Carlos Duarte, Wai-Tat Fu
2019 conf
IUI Companion
Yi-Chieh Lee, Wai-Tat Fu
2019 B conf
MobileHCI
Yi-Chieh Lee, Chi-Hsien (Eric) Yen, Dennis Wang, Wai-Tat Fu
2019 conf
SUI
Sanorita Dey, Wai-Tat Fu, Karrie Karahalios
2019 J jnl
Proc. ACM Hum. Comput. Interact.
Sanorita Dey, Brittany R. L. Duff, Wai-Tat Fu, Karrie Karahalios
2019 A conf
IUI
Ziang Xiao, Michelle X. Zhou, Wai-Tat Fu
2018 conf
IUI Companion
Ziang Xiao, Yuqi Yao, Wai-Tat Fu
2018 B conf
VRST
Yishuo Liu, Yichuan Zhang, Shiliang Zuo, Wai-Tat Fu
2018 A conf
IUI
Mingkun Gao, Hyo Jin Do, Wai-Tat Fu
2018 ch.
Computational Interaction
Wai-Tat Fu, Mingkun Gao, Hyo Jin Do
2018 A conf
IUI
Ziang Xiao, Helen Wauck, Zeya Peng, Hanfei Ren, Lei Zhang, Shiliang Zuo, Yuqi Yao, Wai-Tat Fu
2018 A* conf
CHI
Sanorita Dey, Karrie Karahalios, Wai-Tat Fu
2018 conf
SUI
Sanorita Dey, Karrie Karahalios, Wai-Tat Fu
2018 A conf
IUI
Po-Tsung Chiu, Helen Wauck, Ziang Xiao, Yuqi Yao, Wai-Tat Fu
2018 ch.
Computational Interaction
Wai-Tat Fu, Jessie Chin, Q. Vera Liao
2018 conf
CHI Extended Abstracts
Yi-Chieh Lee, Chi-Hsien (Eric) Yen, Po-Tsung Chiu, Jung-Tai King, Wai-Tat Fu
2018 J jnl
Proc. ACM Hum. Comput. Interact.
Mingkun Gao, Ziang Xiao, Karrie Karahalios, Wai-Tat Fu
2018 A conf
IUI
Chi-Hsien (Eric) Yen, Yi-Chieh Lee, Wai-Tat Fu
2017 A conf
IUI
Helen Wauck, Wai-Tat Fu
2017 conf
IUI Companion
Yuan Yao, Po-Tsung Chiu, Wai-Tat Fu
2017 A conf
IUI
Mingkun Gao, Hyo Jin Do, Wai-Tat Fu
2017 J jnl
J. Assoc. Inf. Sci. Technol.
Saraschandra Karanam, Herre van Oostendorp, Mylène Sanchiz, Aline Chevalier, Jessie Chin, Wai-Tat Fu
2017 ed.
IUI Companion
George A. Papadopoulos, Tsvi Kuflik, Fang Chen, Carlos Duarte, Wai-Tat Fu
2017 A* conf
CHI
Helen Wauck, Yu-Chun (Grace) Yen, Wai-Tat Fu, Elizabeth Gerber, Steven P. Dow, Brian P. Bailey
2017 B conf
FG
Michael J. Junokas, Greg Kohlburn, Benjamin Lane, Sahil Kumar, Wai-Tat Fu, Robb Lindgren
2017 conf
SBP-BRiMS
Chi-Hsien (Eric) Yen, Yi-Chieh Lee, Wai-Tat Fu
2017 A ed.
IUI
George A. Papadopoulos, Tsvi Kuflik, Fang Chen, Carlos Duarte, Wai-Tat Fu
2017 B conf
CHIIR
Mylène Sanchiz, Aline Chevalier, Wai-Tat Fu, Franck Amadieu
2017 J jnl
Inf. Process. Manag.
Mylène Sanchiz, Jessie Chin, Aline Chevalier, Wai-Tat Fu, Franck Amadieu, Jibo He
2017 A conf
CSCW
Sanorita Dey, Brittany R. L. Duff, Karrie Karahalios, Wai-Tat Fu
2017 A* conf
CHI
Sanorita Dey, Karrie Karahalios, Wai-Tat Fu
2017 A conf
IUI
Helen Wauck, Ziang Xiao, Po-Tsung Chiu, Wai-Tat Fu
2017 conf
MMLA-CrossLAK@LAK
Michael J. Junokas, Greg Kohlburn, Sahil Kumar, Benjamin Lane, Wai-Tat Fu, Robb Lindgren
2017 A* conf
CHI
Farnaz Jahanbakhsh, Wai-Tat Fu, Karrie Karahalios, Darko Marinov, Brian P. Bailey
2016 A* conf
CHI
Qingzi Vera Liao, Wai-Tat Fu, Markus Strohmaier
2016 conf
ICHI
Mingkun Gao, Liu Yuan, Wai-Tat Fu
2016 conf
ICHI
Thomas George Kannampallil, Daniel G. Morrow, Wai-Tat Fu, Liza Raquel, Angela Muriset
2016 conf
ICHI
Hyo Jin Do, Wai-Tat Fu
2016 conf
SBP-BRiMS
Yi-Chieh Lee, Chi-Hsien (Eric) Yen, Wai-Tat Fu
2016 J jnl
ACM Trans. Intell. Syst. Technol.
Huaming Rao, Shih-Wen Huang, Wai-Tat Fu
2016 conf
ICHI
Ping-Jing Yang, Wai-Tat Fu
2016 J jnl
J. Inf. Sci.
Saraschandra Karanam, Herre van Oostendorp, Wai-Tat Fu
2016 J jnl
Minds Mach.
Wai-Tat Fu
2016 A* conf
CHI
Jennifer G. Kim, Ha Kyung Kong, Karrie Karahalios, Wai-Tat Fu, Hwajung Hong
2015 ed.
ICHI
Prabhakaran Balakrishnan, Jaideep Srivatsava, Wai-Tat Fu, Sanda M. Harabagiu, Fei Wang
2015 B conf
CogSci
Jessie Chin, Evan Anderson, Chieh-Li Chin, Wai-Tat Fu
2015 J jnl
Top. Cogn. Sci.
Jessie Chin, Brennan R. Payne, Wai-Tat Fu, Daniel G. Morrow, Elizabeth A. L. Stine-Morrow
2015 J jnl
Top. Cogn. Sci.
Wai-Tat Fu, Thomas T. Hills, Peter M. Todd
2015 A* conf
CHI
Qingzi Vera Liao, Wai-Tat Fu, Sri Shilpa Mamidi
2015 conf
WIMS
Saraschandra Karanam, Herre van Oostendorp, Mylène Sanchiz, Aline Chevalier, Jessie Chin, Wai-Tat Fu
2015 A conf
CSCW
Jason Chen Zhao, Wai-Tat Fu, Hanzhe Zhang, Shengdong Zhao, Henry B. L. Duh
2015 B conf
CogSci
Rebecca Albrecht, Holger Schultheis, Wai-Tat Fu
2014 J jnl
ACM Trans. Comput. Hum. Interact.
Qingzi Vera Liao, Wai-Tat Fu
2014 A conf
CSCW
Qingzi Vera Liao, Wai-Tat Fu
2014 conf
SBP
Huaming Rao, Anbang Xu, Xiao Yang, Wai-Tat Fu
2014 A* conf
CHI
Qingzi Vera Liao, Wai-Tat Fu
2014 Misc conf
OZCHI
Simon Stannus, Wai-Tat Fu, Arko Lucieer
2014 B conf
VRST
Simon Stannus, Arko Lucieer, Wai-Tat Fu
2014 B conf
CogSci
Andrew Battles, Wai-Tat Fu
2014 A* conf
CHI
Anbang Xu, Xiao Yang, Huaming Rao, Wai-Tat Fu, Shih-Wen Huang, Brian P. Bailey
2013 A* conf
CHI
Qingzi Vera Liao, Wai-Tat Fu
2013 A* conf
CHI
Shih-Wen Huang, Wai-Tat Fu
2013 J jnl
Spatial Cogn. Comput.
Wai-Tat Fu, Laura D'Andrea, Sven Bertel
2013 A* conf
ISMAR
Wai-Tat Fu, John Gasper, Seong-Whan Kim
2013 A conf
CSCW
Shih-Wen Huang, Wai-Tat Fu
2013 J jnl
Cogn. Technol. Work.
Thomas George Kannampallil, Kevin Waicekauskas, Daniel G. Morrow, Kathryn M. Kopren, Wai-Tat Fu
2013 A conf
IUI
Shih-Wen Huang, Pei-Fen Tu, Wai-Tat Fu, Mohammad Amanzadeh
2013 conf
OZCHI (LNCS Selection)
Winyu Chinthammit, Soojeong Yoo, Callum Parker, Susan Turland, Scott J. Pedersen, Wai-Tat Fu
2013 conf
CSCW Companion
Shih-Wen Huang, Wai-Tat Fu
2013 B conf
HCOMP
Huaming Rao, Shih-Wen Huang, Wai-Tat Fu
2012 conf
IHI
Qingzi Vera Liao, Wai-Tat Fu
2012 A* conf
CHI
Jessie Chin, Wai-Tat Fu
2012 J jnl
IEEE Intell. Syst.
Wai-Tat Fu, Wei Dong
2012 A* conf
CHI
Roshanak Zilouchian Moghaddam, Brian P. Bailey, Wai-Tat Fu
2012 B conf
CogSci
Jessie Chin, Brennan R. Payne, Andrew Battles, Wai-Tat Fu, Daniel G. Morrow, Elizabeth A. L. Stine-Morrow
2012 conf
SBP
Wai-Tat Fu, Qingzi Vera Liao
2012 A conf
CSCW
Wei Dong, Wai-Tat Fu
2012 conf
IHI
Yan Zhang, Prasenjit Mitra, John Yen, Wai-Tat Fu
2012 conf
UIST (Adjunct Volume)
Shih-Wen Huang, Pei-Fen Tu, Mohammad Amanzadeh, Wai-Tat Fu
2012 conf
HCOMP@AAAI
Shih-Wen Huang, Wai-Tat Fu
2012 A* conf
CHI
Qingzi Vera Liao, Claudia Wagner, Peter Pirolli, Wai-Tat Fu
2011 B conf
CogSci
Wai-Tat Fu, Panying Rong, Hyunkyu Lee, Arthur F. Kramer, Ann M. Graybiel
2011 J jnl
Cogn. Sci.
Wai-Tat Fu
2011 conf
HICSS
Elahe Javadi, Wai-Tat Fu, Judith Gebauer
2011 B conf
CogSci
Wei Dong, Wai-Tat Fu
2011 conf
SBP
Wai-Tat Fu, Vera Liao
2011 conf
HCI (20)
Yan Zhang, Wai-Tat Fu
2011 B conf
CogSci
Qingzi Vera Liao, Wai-Tat Fu
2011 B conf
CogSci
Wai-Tat Fu, Thomas T. Hills
2011 B conf
CogSci
Yasuaki Sakamoto, Wai-Tat Fu
2011 conf
HCI (20)
Elahe Javadi, Wai-Tat Fu
2011 B conf
CogSci
Sven Bertel, Hyunkyu Lee, Wai-Tat Fu
2011 B conf
CogSci
Qingzi Vera Liao, Wai-Tat Fu
2011 B conf
CogSci
Jessie Chin, Wai-Tat Fu, Elizabeth A. L. Stine-Morrow
2010 conf
CHI Extended Abstracts
Wai-Tat Fu, Thomas George Kannampallil
2010 A* conf
CHI
Wei Dong, Wai-Tat Fu
2010 A* conf
CHI
Ruogu Kang, Wai-Tat Fu, Thomas George Kannampallil
2010 A conf
IUI
Ruogu Kang, Wai-Tat Fu
2010 conf
SocialCom/PASSAT
Wai-Tat Fu, Wei Dong
2010 A conf
IUI
Wai-Tat Fu, Thomas George Kannampallil, Ruogu Kang
2010 A* conf
CHI
Jessie Chin, Wai-Tat Fu
2010 J jnl
ACM Trans. Comput. Hum. Interact.
Wai-Tat Fu, Thomas George Kannampallil, Ruogu Kang, Jibo He
2010 A conf
IUI
Wei Dong, Wai-Tat Fu
2009 conf
CSE (4)
Wai-Tat Fu, Thomas George Kannampallil, Ruogu Kang
2009 A* conf
CHI
Jessie Chin, Wai-Tat Fu, Thomas George Kannampallil
2009 conf
HCI (16)
Ruogu Kang, Thomas George Kannampallil, Jibo He, Wai-Tat Fu
2009 conf
CHI Extended Abstracts
J. Michelle Moon, Wai-Tat Fu
2009 conf
HCI (16)
Thomas George Kannampallil, Wai-Tat Fu
2009 conf
HCI (16)
J. Michelle Moon, Wai-Tat Fu
2008 J jnl
Cogn. Sci.
Wai-Tat Fu
2008 A conf
CSCW
Wai-Tat Fu
2007 ch.
Integrated Models of Cognitive Systems
Wai-Tat Fu
2007 conf
PerMIS
Gary Berg-Cross, Wai-Tat Fu, Augustine Kwon
2007 J jnl
Hum. Comput. Interact.
Wai-Tat Fu, Peter Pirolli
2006 J jnl
Interact. Comput.
Wai-Tat Fu, Daniel Bothell, Scott Douglass, Craig Haimson, Myeong-Ho Sohn, John R. Anderson
2004 conf
ICCM
Wai-Tat Fu, Daniel Bothell, Scott Douglass, Craig Haimson, Myeong-Ho Sohn, John R. Anderson
2004 J jnl
Cogn. Sci.
Wai-Tat Fu, Wayne D. Gray
2004 J jnl
Cogn. Sci.
Wayne D. Gray, Wai-Tat Fu
2003 conf
User Modeling
Peter Pirolli, Wai-Tat Fu
2002 B conf
AVI
Peter Pirolli, Wai-Tat Fu, Robert W. Reeder, Stuart K. Card
2001 A* conf
CHI
Wayne D. Gray, Wai-Tat Fu
1999 conf
CHI Extended Abstracts
Wai-Tat Fu, Wayne D. Gray
redb/extractors/apk_extractors/apk_manifest.py
← Index redb/extractors/apk_extractors/apk_manifest.py python
import inspect
import json
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 APKManifest, APKManifestComponent


class APKManifestExtractor(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.manifest = None
        self.components = []
        self.log.debug(inspect.currentframe().f_code.co_name)

    def tag(self):
        return Tag.APK_MANIFEST.value

    def _is_component_exported(self, component_type, component_name):
        """Determine if a component is exported.

        Pre-API 31: exported is implicitly True if intent filters exist.
        API 31+: android:exported must be explicit; default is False.
        """
        try:
            exported_attr = None
            # Try to get the exported attribute directly from the XML
            axml = self.apk.get_android_manifest_xml()
            if axml is not None:
                for node in axml.getElementsByTagName(component_type):
                    name = node.getAttributeNS(
                        "http://schemas.android.com/apk/res/android", "name"
                    )
                    if name == component_name:
                        exported_attr = node.getAttributeNS(
                            "http://schemas.android.com/apk/res/android", "exported"
                        )
                        break
        except Exception:
            exported_attr = None

        if exported_attr == "true":
            return True
        if exported_attr == "false":
            return False

        # If not explicitly set, check for intent filters (pre-API 31 behavior)
        try:
            intent_filters = self.apk.get_intent_filters(component_type, component_name)
            if intent_filters:
                actions = intent_filters.get("action", [])
                if actions:
                    return True
        except Exception:
            pass

        return False

    def _get_intent_filters_for_component(self, component_type, component_name):
        """Get intent filters for a specific component."""
        actions = []
        categories = []
        try:
            intent_filters = self.apk.get_intent_filters(component_type, component_name)
            if intent_filters:
                actions = intent_filters.get("action", [])
                categories = intent_filters.get("category", [])
        except Exception:
            pass
        return actions, categories

    def _safe_extract(self, field_name, func, default=None):
        """Extract a single field, logging and returning default on failure."""
        try:
            return func()
        except Exception as e:
            self.log.warning(
                f"Error extracting APK manifest field '{field_name}' for "
                f"{self.hash.sha256}: {e}"
            )
            return default

    def extract(self):
        if not self._is_valid_apk():
            self.log.error(f"Invalid APK for {self.hash.sha256}")
            return None

        activities = self._safe_extract(
            "activities", lambda: list(self.apk.get_activities() or []), []
        )
        services = self._safe_extract(
            "services", lambda: list(self.apk.get_services() or []), []
        )
        receivers = self._safe_extract(
            "receivers", lambda: list(self.apk.get_receivers() or []), []
        )
        providers = self._safe_extract(
            "providers", lambda: list(self.apk.get_providers() or []), []
        )

        # Build component list with intent filter info
        self.components = []
        all_actions = set()
        all_categories = set()
        exported_components = []

        component_map = [
            ("activity", activities),
            ("service", services),
            ("receiver", receivers),
            ("provider", providers),
        ]

        for comp_type, comp_list in component_map:
            for comp_name in comp_list:
                try:
                    is_exported = self._is_component_exported(comp_type, comp_name)
                    actions, categories = self._get_intent_filters_for_component(
                        comp_type, comp_name
                    )
                    all_actions.update(actions)
                    all_categories.update(categories)
                    if is_exported:
                        exported_components.append(comp_name)

                    self.components.append(APKManifestComponent(
                        component_type=comp_type,
                        class_name=comp_name,
                        is_exported=is_exported,
                        intent_actions=list(actions),
                        intent_categories=list(categories),
                    ))
                except Exception as e:
                    self.log.warning(
                        f"Error processing component '{comp_name}' for "
                        f"{self.hash.sha256}: {e}"
                    )
                    # Still add the component with minimal info
                    self.components.append(APKManifestComponent(
                        component_type=comp_type,
                        class_name=comp_name,
                        is_exported=False,
                        intent_actions=[],
                        intent_categories=[],
                    ))

        # Uses-feature
        uses_features = []
        try:
            uses_features = list(self.apk.get_features() or [])
        except Exception:
            pass

        # Meta-data
        meta_data = None
        try:
            axml = self.apk.get_android_manifest_xml()
            if axml is not None:
                md = {}
                for node in axml.getElementsByTagName("meta-data"):
                    name = node.getAttributeNS(
                        "http://schemas.android.com/apk/res/android", "name"
                    )
                    value = node.getAttributeNS(
                        "http://schemas.android.com/apk/res/android", "value"
                    )
                    resource = node.getAttributeNS(
                        "http://schemas.android.com/apk/res/android", "resource"
                    )
                    if name:
                        md[name] = value or resource or ""
                if md:
                    meta_data = md
        except Exception:
            pass

        # Full manifest XML
        manifest_xml = None
        try:
            axml = self.apk.get_android_manifest_xml()
            if axml is not None:
                manifest_xml = axml.toxml()
        except Exception:
            try:
                manifest_xml = self.apk.get_android_manifest_axml().get_xml()
                if isinstance(manifest_xml, bytes):
                    manifest_xml = manifest_xml.decode("utf-8", errors="replace")
            except Exception:
                pass

        self.manifest = APKManifest(
            activity_count=len(activities),
            service_count=len(services),
            receiver_count=len(receivers),
            provider_count=len(providers),
            activities=activities,
            services=services,
            receivers=receivers,
            providers=providers,
            exported_components=exported_components,
            intent_filters_by_action=sorted(all_actions),
            intent_filters_by_category=sorted(all_categories),
            uses_features=uses_features,
            meta_data=meta_data,
            manifest_xml=manifest_xml,
        )
        return self.manifest

    def prepare_export_data(self, exporter_type: str) -> Any:
        if exporter_type == "ClickHouseExporter":
            if not self.manifest:
                return None

            current_time = datetime.now(timezone.utc)
            m = self.manifest

            # Components table (one row per component)
            components_data = []
            for comp in self.components:
                components_data.append([
                    self.sha256,
                    comp.component_type,
                    comp.class_name,
                    int(comp.is_exported),
                    comp.intent_actions,
                    comp.intent_categories,
                    current_time,
                ])

            # Manifest summary table (one row per APK)
            manifest_data = [[
                self.sha256,
                m.activity_count,
                m.service_count,
                m.receiver_count,
                m.provider_count,
                m.intent_filters_by_action,
                m.intent_filters_by_category,
                m.uses_features,
                m.manifest_xml,
                current_time,
            ]]

            return {
                'multi_table': True,
                'manifest': {
                    'table': 'redb_apk_manifest',
                    'data': manifest_data,
                    'column_names': [
                        'sha256',
                        'activity_count', 'service_count', 'receiver_count', 'provider_count',
                        'intent_filters_by_action', 'intent_filters_by_category',
                        'uses_features', 'manifest_xml', 'analysis_date',
                    ],
                    'column_type_names': [
                        'FixedString(64)',
                        'UInt16', 'UInt16', 'UInt16', 'UInt16',
                        'Array(String)', 'Array(String)',
                        'Array(String)', 'Nullable(String)',
                        "DateTime64(3, 'UTC')",
                    ],
                },
                'components': {
                    'table': 'redb_apk_components',
                    'data': components_data,
                    'column_names': [
                        'sha256', 'component_type', 'class_name', 'is_exported',
                        'intent_actions', 'intent_categories', 'analysis_date',
                    ],
                    'column_type_names': [
                        'FixedString(64)', 'LowCardinality(String)', 'String', 'UInt8',
                        'Array(String)', 'Array(String)',
                        "DateTime64(3, 'UTC')",
                    ],
                },
            }

    def get_clickhouse_table(self) -> str:
        return "redb_apk_manifest"