Hajin Lim

55 papers A* 14A 7Misc 1Journal 22Unranked 11
YearRankTypeTitle / Venue / Authors
2026 conf
CHI Extended Abstracts
Chaerin Song, Keyeun Lee, Hajin Lim
2026 A* conf
CHI
Sora Kang, Jaemin Zoh, Hyoju Kim, Hyeonseo Park, Hajin Lim, Joonhwan Lee
2026 J jnl
CoRR
Sora Kang, Jaemin Zoh, Hyoju Kim, Hyeonseo Park, Hajin Lim, Joonhwan Lee
2026 A* conf
CHI
Suhwoo Yoon, Dakyeom Ahn, Yunseo Choi, Seoyeon Hong, Hajin Lim
2026 A* conf
CHI
Seo Hyeong Kim, Esther Hehsun Kim, Huiyeon Yang, Joonhwan Lee, Hajin Lim
2026 A* conf
CHI
Hana Oh, Eunbi Lee, Seungju Shin, Keyeun Lee, Miran Pyun, Hajin Lim
2026 A* conf
CHI
Hayeon Jeon, Dakyeom Ahn, Sunyu Pang, Yunseo Choi, Suhwoo Yoon, Joonhwan Lee, Eun-mee Kim, Hajin Lim
2026 J jnl
CoRR
Hayeon Jeon, Dakyeom Ahn, Sunyu Pang, Yunseo Choi, Suhwoo Yoon, Joonhwan Lee, Eun-mee Kim, Hajin Lim
2025 conf
ACL (Findings)
Keyeun Lee, Seolhee Lee, Esther Hehsun Kim, Yena Ko, Jinsu Eun, DaHee Kim, Hyewon Cho, Haiyi Zhu, Robert E. Kraut, Eunyoung Suh, Eun-mee Kim, Hajin Lim
2025 J jnl
CoRR
Keyeun Lee, Seolhee Lee, Esther Hehsun Kim, Yena Ko, Jinsu Eun, DaHee Kim, Hyewon Cho, Haiyi Zhu, Robert E. Kraut, Eunyoung Suh, Eun-mee Kim, Hajin Lim
2025 J jnl
CoRR
Dakyeom Ahn, Hajin Lim
2025 A* conf
CHI
Dakyeom Ahn, Hajin Lim
2025 A* conf
CHI
Dakyeom Ahn, Seora Park, Seolhee Lee, Jieun Cho, Hajin Lim
2025 J jnl
CoRR
Dakyeom Ahn, Seora Park, Seolhee Lee, Jieun Cho, Hajin Lim
2025 A* conf
CHI
Hayeon Jeon, Suhwoo Yoon, Keyeun Lee, SeoHyeong Kim, Esther Hehsun Kim, Seonghye Cho, Yena Ko, Soeun Yang, Laura Dabbish, John Zimmerman, Eun-mee Kim, Hajin Lim
2025 J jnl
CoRR
Hayeon Jeon, Suhwoo Yoon, Keyeun Lee, SeoHyeong Kim, Esther Hehsun Kim, Seonghye Cho, Yena Ko, Soeun Yang, Laura Dabbish, John Zimmerman, Eun-mee Kim, Hajin Lim
2025 A conf
Conference on Designing Interactive Systems
Joonyoung Park, Hyewon Cho, Hyehyun Chu, YeEun Lee, Hajin Lim
2025 J jnl
CoRR
Joonyoung Park, Hyewon Cho, Hyehyun Chu, YeEun Lee, Hajin Lim
2025 conf
NAACL (Long Papers)
Keyeun Lee, SeoHyeong Kim, Seolhee Lee, Jinsu Eun, Yena Ko, Hayeon Jeon, Esther Hehsun Kim, Seonghye Cho, Soeun Yang, Eun-mee Kim, Hajin Lim
2025 J jnl
CoRR
Keyeun Lee, SeoHyeong Kim, Seolhee Lee, Jinsu Eun, Yena Ko, Hayeon Jeon, Esther Hehsun Kim, Seonghye Cho, Soeun Yang, Eun-mee Kim, Hajin Lim
2025 J jnl
XRDS
Esther Hehsun Kim, Seo Hyeong Kim, Hajin Lim, Joonhwan Lee
2025 J jnl
CoRR
YeEun Lee, Dakyeom Ahn, JungYu Kwon, Seungji Lee, Hajin Lim
2025 J jnl
Proc. ACM Hum. Comput. Interact.
YeEun Lee, Dakyeom Ahn, JungYu Kwon, Seungji Lee, Hajin Lim
2024 A* conf
CHI
Seora Park, Hajin Lim, Joonhwan Lee
2024 A conf
ASSETS
Hyungwoo Song, Minjeong Shin, Hyehyun Chu, Jiin Hong, Jaechan Lee, Jinsu Eun, Hajin Lim
2024 J jnl
CoRR
Hyungwoo Song, Minjeong Shin, Hyehyun Chu, Jiin Hong, Jaechan Lee, Jinsu Eun, Hajin Lim
2024 A* conf
CHI
Kieun Park, Hajin Lim, Joonhwan Lee, Bongwon Suh
2024 conf
CHI Extended Abstracts
Suhwoo Yoon, Soobin Kim, Gyeryeong Park, Hajin Lim
2024 conf
CHI Extended Abstracts
Miran Park, Kyuri Park, Hyewon Cho, Hwan Choi, Hajin Lim
2024 J jnl
Proc. ACM Hum. Comput. Interact.
Hyolim Kim, Seolim Oh, Gaeun Lee, Sumin Jung, Kyuha Jung, Hajin Lim
2024 A* conf
CHI
Jiyeon Seo, Hajin Lim, Bongwon Suh, Joonhwan Lee
2024 A* conf
CHI
Ha Yeon Lee, Seora Park, Esther Hehsun Kim, Jiyeon Seo, Hajin Lim, Joonhwan Lee
2024 A conf
ASSETS
Yaxin Hu, Hajin Lim, Lisa Kakonge, Jade T. Mitchell, Hailey L. Johnson, Lyn S. Turkstra, Melissa C. Duff, Catalina L. Toma, Bilge Mutlu
2024 J jnl
CoRR
Yaxin Hu, Hajin Lim, Lisa Kakonge, Jade T. Mitchell, Hailey L. Johnson, Lyn S. Turkstra, Melissa C. Duff, Catalina L. Toma, Bilge Mutlu
2023 conf
CHI Extended Abstracts
Wonjin Lee, Kayoung Park, Jiyoung Yoo, Hajin Lim
2023 conf
CSCW Companion
Kitae Kim, Nayoung Hong, Jiwon Park, Hajin Lim
2023 A conf
Conference on Designing Interactive Systems
Yewon Jin, SeonYul Lee, SeoHyeong Kim, Jiyeon Seo, Kyuha Jung, Hajin Lim, Joonhwan Lee
2023 A conf
ASSETS
Yaxin Hu, Hajin Lim, Hailey L. Johnson, Josephine M. O'Shaughnessy, Lisa Kakonge, Lyn S. Turkstra, Melissa C. Duff, Catalina L. Toma, Bilge Mutlu
2023 J jnl
CoRR
Yaxin Hu, Hajin Lim, Hailey L. Johnson, Josephine M. O'Shaughnessy, Lisa Kakonge, Lyn S. Turkstra, Melissa C. Duff, Catalina L. Toma, Bilge Mutlu
2023 A* conf
CHI
Hajin Lim, Lisa Kakonge, Yaxin Hu, Lyn S. Turkstra, Melissa C. Duff, Catalina L. Toma, Bilge Mutlu
2023 J jnl
CoRR
Hajin Lim, Lisa Kakonge, Yaxin Hu, Lyn S. Turkstra, Melissa C. Duff, Catalina L. Toma, Bilge Mutlu
2023 A conf
Conference on Designing Interactive Systems
Jiyeon Seo, Yoobin Elyson Park, Esther Hehsun Kim, Hajin Lim, Joonhwan Lee
2022 J jnl
Frontiers Digit. Health
Fangyun Zhao, Hajin Lim, Emily L. Morrow, Lyn S. Turkstra, Melissa C. Duff, Bilge Mutlu
2022 J jnl
Proc. ACM Hum. Comput. Interact.
Hajin Lim, Dan Cosley, Susan R. Fussell
2019 J jnl
Proc. ACM Hum. Comput. Interact.
Hajin Lim, Dan Cosley, Susan R. Fussell
2018 A* conf
CHI
Hajin Lim, Dan Cosley, Susan R. Fussell
2018 conf
CSCW Companion
Hajin Lim
2017 J jnl
Cyberpsychology Behav. Soc. Netw.
Samuel Hardman Taylor, Alexandra S. Hinck, Hajin Lim
2017 J jnl
Proc. ACM Hum. Comput. Interact.
Hajin Lim, Ian Arawjo, Yaxian Xie, Negar Khojasteh, Susan R. Fussell
2017 J jnl
Proc. ACM Hum. Comput. Interact.
Hajin Lim, Susan R. Fussell
2017 A conf
ICWSM
Hajin Lim, Susan R. Fussell
2014 Misc conf
CHI PLAY
Hajin Lim, Jaehyeon Park, Bongwon Suh
2014 conf
CSCW Companion
Hajin Lim, Bongwon Suh
2014 conf
Mobile HCI
Hajin Lim, Hyunjin Ahn, Junwoo Kang, Bongwon Suh, Joonhwan Lee
2013 conf
CHI Extended Abstracts
Hajin Lim, Seohee Choi, Joonhwan Lee
redb/extractors/elf_extractors/elf_symbols.py
← Index redb/extractors/elf_extractors/elf_symbols.py python
import inspect
from datetime import datetime, timezone
from typing import Any, List, Dict

from elftools.elf.elffile import ELFFile
from elftools.common.exceptions import ELFError

from redb.extractors.enum import Tag
from redb.extractors.elf_extractor import ELFExtractor
from redb.models.dataclasses import ELFSymbol


class ELFSymbolExtractor(ELFExtractor):

    def __init__(
        self,
        filepath,
        log,
        exporters=None,
        index_prefix=None,
        elastic_index=None,
        known_benign=False,
        known_malicious=False,
        elf=None,
    ):
        super().__init__(
            filepath,
            log,
            exporters,
            index_prefix,
            elastic_index,
            known_benign,
            known_malicious,
            elf,
        )
        self.elf_symbols = []
        self.elastic_index = self.index_prefix + "-elf_symbols"
        self.log.debug(inspect.currentframe().f_code.co_name)

    def _map_symbol_type(self, st_type_str: str) -> int:
        """Map symbol type string to enum value."""
        type_map = {
            'STT_NOTYPE': 0,
            'STT_OBJECT': 1,
            'STT_FUNC': 2,
            'STT_SECTION': 3,
            'STT_FILE': 4,
            'STT_COMMON': 5,
            'STT_TLS': 6
        }
        return type_map.get(st_type_str, 0)

    def _map_symbol_bind(self, st_bind_str: str) -> int:
        """Map symbol binding string to enum value."""
        bind_map = {
            'STB_LOCAL': 0,
            'STB_GLOBAL': 1,
            'STB_WEAK': 2
        }
        return bind_map.get(st_bind_str, 0)

    def _map_symbol_visibility(self, st_vis_str: str) -> int:
        """Map symbol visibility string to enum value."""
        vis_map = {
            'STV_DEFAULT': 0,
            'STV_INTERNAL': 1,
            'STV_HIDDEN': 2,
            'STV_PROTECTED': 3
        }
        return vis_map.get(st_vis_str, 0)

    def _extract_symbol_data(self, symbol, is_dynamic: bool = False) -> Dict:
        """Extract data from a single symbol."""
        try:
            # Get symbol name (handle empty names)
            symbol_name = symbol.name if symbol.name else f"<unnamed_{symbol.entry.get('st_name', 0)}>"

            # Get symbol properties
            symbol_value = symbol.entry.get('st_value', 0)
            symbol_size = symbol.entry.get('st_size', 0)

            # Handle section index - can be integer or special string like 'SHN_UNDEF'
            st_shndx_raw = symbol.entry.get('st_shndx', 0)
            if isinstance(st_shndx_raw, str):
                # Map special section index strings to integers
                shndx_map = {
                    'SHN_UNDEF': 0,
                    'SHN_ABS': 65521,  # 0xFFF1
                    'SHN_COMMON': 65522,  # 0xFFF2
                    'SHN_XINDEX': 65535,  # 0xFFFF
                }
                symbol_section_index = shndx_map.get(st_shndx_raw, 0)
                symbol_section_index_str = st_shndx_raw.replace('SHN_', '') if st_shndx_raw.startswith('SHN_') else st_shndx_raw
            else:
                symbol_section_index = st_shndx_raw
                symbol_section_index_str = str(st_shndx_raw)

            # Get symbol type and map to enum
            st_type_str = symbol.entry.get('st_info', {}).get('type', 'STT_NOTYPE')
            symbol_type_enum = self._map_symbol_type(st_type_str)
            symbol_type_str = st_type_str.replace('STT_', '') if st_type_str.startswith('STT_') else st_type_str

            # Get symbol binding and map to enum
            st_bind_str = symbol.entry.get('st_info', {}).get('bind', 'STB_LOCAL')
            symbol_bind_enum = self._map_symbol_bind(st_bind_str)
            symbol_bind_str = st_bind_str.replace('STB_', '') if st_bind_str.startswith('STB_') else st_bind_str

            # Get symbol visibility and map to enum
            st_vis_str = symbol.entry.get('st_other', {}).get('visibility', 'STV_DEFAULT')
            symbol_visibility_enum = self._map_symbol_visibility(st_vis_str)
            symbol_visibility_str = st_vis_str.replace('STV_', '') if st_vis_str.startswith('STV_') else st_vis_str

            return ELFSymbol(
                symbol_name=symbol_name,
                symbol_value=symbol_value,
                symbol_size=symbol_size,
                symbol_type=symbol_type_enum,
                symbol_type_str=symbol_type_str,
                symbol_bind=symbol_bind_enum,
                symbol_bind_str=symbol_bind_str,
                symbol_visibility=symbol_visibility_enum,
                symbol_visibility_str=symbol_visibility_str,
                symbol_section_index=symbol_section_index,
                symbol_section_index_str=symbol_section_index_str,
                is_dynamic=1 if is_dynamic else 0
            )

        except Exception as e:
            self.log.error(f"Error extracting symbol data: {e}")
            return None

    def _extract_symbols_from_section(self, elf, section_name: str, is_dynamic: bool = False) -> List[Dict]:
        """Extract symbols from a specific symbol table section."""
        symbols = []

        try:
            section = elf.get_section_by_name(section_name)
            if not section:
                self.log.debug(f"No {section_name} section found")
                return symbols

            if not hasattr(section, 'iter_symbols'):
                self.log.debug(f"Section {section_name} is not a symbol table")
                return symbols

            # Iterate through symbols in the section with per-symbol error handling
            for symbol_index, symbol in enumerate(section.iter_symbols()):
                try:
                    symbol_data = self._extract_symbol_data(symbol, is_dynamic)
                    if symbol_data:
                        symbols.append(symbol_data)
                except Exception as e:
                    self.log.warning(f"Error processing symbol {symbol_index} in {section_name}: {e}")
                    # Continue with other symbols

        except Exception as e:
            self.log.error(f"Error extracting symbols from {section_name}: {e}")

        return symbols

    def tag(self):
        return Tag.ELF_SYMBOLS.value if hasattr(Tag, 'ELF_SYMBOLS') else "elf_symbols"

    def extract(self):
        try:
            self.log.debug(inspect.currentframe().f_code.co_name)

            def extract_data(elf):
                all_symbols = []

                # Extract static symbols from .symtab with individual error handling
                try:
                    static_symbols = self._extract_symbols_from_section(elf, '.symtab', is_dynamic=False)
                    all_symbols.extend(static_symbols)
                    self.log.debug(f"Extracted {len(static_symbols)} static symbols from .symtab")
                except Exception as e:
                    self.log.warning(f"Error extracting static symbols from .symtab: {e}")

                # Extract dynamic symbols from .dynsym with individual error handling
                try:
                    dynamic_symbols = self._extract_symbols_from_section(elf, '.dynsym', is_dynamic=True)
                    all_symbols.extend(dynamic_symbols)
                    self.log.debug(f"Extracted {len(dynamic_symbols)} dynamic symbols from .dynsym")
                except Exception as e:
                    self.log.warning(f"Error extracting dynamic symbols from .dynsym: {e}")

                return all_symbols

            if not self._is_elf_file():
                return None

            result = self._with_elf_file(extract_data)
            if result is None:
                return None

            self.elf_symbols = result
            return self.elf_symbols

        except Exception as e:
            self.log.error(f"Error extracting ELF symbols {self.hash.sha256}: {e}")
            return None

    def prepare_export_data(self, exporter_type: str) -> Any:
        self.log.debug(inspect.currentframe().f_code.co_name)

        if exporter_type == "ElasticsearchExporter":
            return self.elf_symbols
        elif exporter_type == "ClickHouseExporter":
            try:
                # Return valid empty structure if no symbols (e.g., stripped binary)
                # None is reserved for actual errors

                # Prepare data arrays for all symbols
                data = []
                current_time = datetime.now(timezone.utc)
                for symbol in self.elf_symbols:
                    row = [
                        self.sha256,
                        self.md5,
                        self.sha1,
                        symbol.symbol_name,
                        symbol.symbol_value,
                        symbol.symbol_size,
                        symbol.symbol_type,
                        symbol.symbol_type_str,
                        symbol.symbol_bind,
                        symbol.symbol_bind_str,
                        symbol.symbol_visibility,
                        symbol.symbol_visibility_str,
                        symbol.symbol_section_index,
                        symbol.symbol_section_index_str,
                        symbol.is_dynamic,
                        current_time
                    ]
                    data.append(row)

                column_names = [
                    'sha256', 'md5', 'sha1',
                    'symbol_name', 'symbol_value', 'symbol_size',
                    'symbol_type', 'symbol_type_str',
                    'symbol_bind', 'symbol_bind_str',
                    'symbol_visibility', 'symbol_visibility_str',
                    'symbol_section_index', 'symbol_section_index_str', 'is_dynamic',
                    'analysis_date'
                ]

                column_type_names = [
                    'FixedString(64)', 'FixedString(32)', 'FixedString(40)',
                    'LowCardinality(String)', 'UInt64', 'UInt64',
                    "Enum8('NOTYPE'=0, 'OBJECT'=1, 'FUNC'=2, 'SECTION'=3, 'FILE'=4, 'COMMON'=5, 'TLS'=6)",
                    'LowCardinality(String)',
                    "Enum8('LOCAL'=0, 'GLOBAL'=1, 'WEAK'=2)",
                    'LowCardinality(String)',
                    "Enum8('DEFAULT'=0, 'INTERNAL'=1, 'HIDDEN'=2, 'PROTECTED'=3)",
                    'LowCardinality(String)',
                    'UInt16', 'LowCardinality(String)', 'UInt8',
                    'DateTime64(3, \'UTC\')'
                ]

                if not data:
                    return None

                return (data, column_names, column_type_names)

            except Exception as e:
                self.log.error(f"Error preparing export data: {e}")
                raise

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