Jae-Won Lee

49 papers A* 4A 3B 2C 2Misc 1Journal 21Unranked 14
YearRankTypeTitle / Venue / Authors
2024 conf
ICEIC
Jae-Won Lee, Ki-Taeg Lim, Seonghyun Alex Jang, Byoungman Robert An, Chi-ho Lin
2024 conf
MetaCom
Sang-Woo Son, Jae-Hyun Rho, Jae-Won Lee, Hye-Min Lee, Youngwoo Lee, Hyeon-Beom Choi, Eeksu Leem, Jeongwook Seo
2023 conf
MetaCom
Jae-Won Lee, Youngwoo Lee, Hyeon-Beom Choi, Sang-Woo Son, Eeksu Leem, Jeongwook Seo
2023 J jnl
Bioinform.
Jae-Won Lee, Jong-Hyun Won, Seonggwang Jeon, Yujin Choo, Yubin Yeon, Jin-Seon Oh, Minsoo Kim, Seonhwa Kim, InSuk Joung, Cheongjae Jang, Sung Jong Lee, Tae Hyun Kim, Kyong Hwan Jin, Giltae Song, Eun-Sol Kim, Jejoong Yoo, Eunok Paek, Yung-Kyun Noh, Keehyoung Joo
2022 J jnl
Expert Syst. Appl.
Hyungjung Kim, Woo-Kyun Jung, Young-Chul Park, Jae-Won Lee, Sung-Hoon Ahn
2022 B conf
VRST
Joohwan Chae, Donghan Kim, Woo Seok Jeong, Eunchan Jo, Won-Ki Jeong, Junyoung Choi, Seung-wook Kim, MyoungGon Kim, Jae-Won Lee, Hyechan Lee, Junghyun Han
2021
Jae-Won Lee
2021 J jnl
J. Comput. Inf. Sci. Eng.
Woo-Kyun Jung, Young-Chul Park, Jae-Won Lee, Eun Suk Suh
2020 J jnl
Int. J. Prod. Res.
Woo-Kyun Jung, Hyungjung Kim, Young-Chul Park, Jae-Won Lee, Sung-Hoon Ahn
2017 J jnl
J. Vis. Commun. Image Represent.
Oh-Young Lee, Jae-Won Lee, Jong-Ok Kim
2017 J jnl
J. Vis. Commun. Image Represent.
Jae-Won Lee, Oh-Young Lee, Jong-Ok Kim
2016 C conf
VCIP
Oh-Young Lee, Jae-Won Lee, Dae-Yeol Lee, Jong-Ok Kim
2016 J jnl
Multim. Tools Appl.
Sung-Hoon Hong, Jae-Won Lee, Ramesh Kumar Lama, Goo-Rak Kwon
2015 J jnl
Sensors
Jae-Won Lee, Ho-Shin Cho
2015 conf
BigDAS
Jae-Won Lee, Ji-Seong Jeong, Mihye Kim, Kwan-Hee Yoo
2014 J jnl
Sensors
Jae-Won Lee, Ho-Shin Cho
2014 conf
ICTC
Sung-Cheol Pyo, Jae-Hwan Yoon, Jae-Won Lee, Sang-Sun Lee
2013 conf
ICISA
Jae-Won Lee, Sang-Sun Lee
2013 J jnl
J. Inf. Sci.
Jae-Won Lee, Han-joon Kim, Sang-goo Lee
2013 J jnl
Sensors
Arindam Ghosh, Jae-Won Lee, Ho-Shin Cho
2011 J jnl
J. Inf. Sci.
Jae-Won Lee, Sang-goo Lee, Han-joon Kim
2011 conf
UCMA (2)
Jae-Won Lee, Seung Ho Choi
2011 J jnl
J. Inf. Sci. Eng.
Jae-Won Lee, Han-joon Kim, Sang-goo Lee
2011 conf
FGIT-FGCN (2)
Jae-Won Lee, Seung Ho Choi
2010 C conf
APWeb
Jae-Won Lee, Han-joon Kim, Sang-goo Lee
2010 Misc conf
SAC
Jae-Won Lee, Han-joon Kim, Sang-goo Lee
2010 conf
ICUIMC
Ig-hoon Lee, Jae-Won Lee, Junho Shim, Sang-goo Lee
2010 J jnl
Neurocomputing
Jae-Won Lee, Han-joon Kim, Sang-goo Lee
2010 conf
ISCSLP
Hua Zhang, Xuan Zhu, Teng-Rong Su, Ki-Wan Eom, Jae-Won Lee
2009 conf
AINA Workshops
Jong-Pil Kim, Jae-Won Lee, Youn-Seon Jang, Kweon Son, Ho-Shin Cho
2009 B conf
CEC
Dongmin Shin, Jae-Won Lee, Jongheum Yeon, Sang-goo Lee
2009 ch.
Software Engineering, Artificial Intelligence, Networking and Parallel/Distributed Computing
Jae-Won Lee, Kwang-Hyun Nam, Sang-goo Lee
2008 conf
ICUIMC
Chulki Lee, Sungchan Park, Dongjoo Lee, Jae-Won Lee, Ok-Ran Jeong, Sang-goo Lee
2007 conf
CEC/EEE
Jae-Won Lee, Taehee Lee, SangKeun Lee, Ok-Ran Jeong, Sang-goo Lee
2006 A* conf
ACL
Young-In Song, Hoo-Jung Chung, Kyoung-Soo Han, Joo-Young Lee, Hae-Chang Rim, Jae-Won Lee
2004 A conf
INTERSPEECH
Attila Ferencz, Jeongsu Kim, Yong-Beom Lee, Jae-Won Lee
2002 A conf
IROS
Young-Hoon Chung, Jeong-Gun Gang, Jae-Won Lee
2001 J jnl
Concurr. Eng. Res. Appl.
Seong-Jin Cho, Jae-Won Lee
2000 A* conf
ICRA
Jae-Won Lee, Sukhan Lee
2000 conf
CDC
Jae-Won Lee, Sukhan Lee, Dongmok Shin
2000 J jnl
IEEE Trans. Autom. Control.
Jae-Won Lee
2000 J jnl
IEEE Trans. Autom. Control.
Ki Baek Kim, Jae-Won Lee, Wook Hyun Kwon
1999 A conf
IROS
Sukhan Lee, Woong Kwon, Jae-Won Lee
1999 A* conf
ICRA
Sukhan Lee, Jae-Won Lee, Dongmok Shin, Woong Kwon, Dong Yoon Kim, Kyoung-Sig Roh, Kwang S. Boo
1999 A* conf
ICRA
Woong Kwon, Jae-Won Lee, Dongmok Shin, Kyoung-Sig Roh, Dong Yoon Kim, Sukhan Lee
1998 J jnl
Mach. Transl.
Jae-Won Lee, Jungyun Seo, Gil-Chang Kim
1998 J jnl
Artif. Intell. Eng. Des. Anal. Manuf.
Heung-Yeoul Shin, Jae-Won Lee
1998 J jnl
Autom.
Jae-Won Lee, Wook Hyun Kwon, Jinhoon Choi
1996 J jnl
IEEE Trans. Autom. Control.
Joon Hwa Lee, Wook Hyan Kwon, Jae-Won Lee
redb/extractors/decompiler/apk/smali_normalization.py
← Index redb/extractors/decompiler/apk/smali_normalization.py python
"""Semantic normalization of Dalvik/smali instructions.

Analogous to Binary Ninja's LLIL normalization: strips register allocation
noise and instruction encoding variants while preserving semantic operations.

Three normalization levels (most aggressive to most detailed):
  - 'category':    semantic category only (MOV, ALU, CALL, ...)
  - 'opcode':      base opcode, width-invariant (add, sub, invoke, ...)
  - 'opcode_api':  opcode category + API method/field references for
                   invoke/field/alloc instructions (default for MinHash)

References:
  - Smali+ 12-category reduction (Canfora et al.)
  - MOSDroid opcode family grouping
  - DroidSIFT/DroidSim API-sensitive similarity
"""

import re
from typing import List

# ---------------------------------------------------------------------------
# Dalvik opcode -> semantic category mapping
# ---------------------------------------------------------------------------
# Prefix-matched against instruction opcodes. Order matters for overlapping
# prefixes (longer/more-specific prefixes should come first in iteration,
# but since we use startswith and break on first match, we order by
# specificity within the list).

OPCODE_CATEGORIES = {
    # Arithmetic/logic
    "add": "ALU", "sub": "ALU", "mul": "ALU", "div": "ALU",
    "rem": "ALU", "and": "ALU", "or": "ALU", "xor": "ALU",
    "shl": "ALU", "shr": "ALU", "ushr": "ALU", "neg": "ALU",
    "not": "ALU",
    # Data movement
    "move": "MOV", "const": "CONST",
    # Memory access (field/array)
    "iget": "LOAD", "sget": "LOAD", "aget": "LOAD",
    "iput": "STORE", "sput": "STORE", "aput": "STORE",
    # Invocations
    "invoke": "CALL",
    # Control flow
    "if": "BRANCH", "goto": "JMP",
    "switch": "SWITCH",
    "return": "RET",
    # Object/type
    "new": "ALLOC", "check": "TYPE", "instance": "TYPE",
    # Array
    "fill": "ARR", "array": "ARR",
    # Comparison
    "cmpl": "CMP", "cmpg": "CMP", "cmp": "CMP",
    # Exception / synchronization
    "throw": "EXC", "monitor": "SYNC",
    # Conversion (int-to-long, float-to-int, etc.)
    "int-to": "CONV", "long-to": "CONV", "float-to": "CONV",
    "double-to": "CONV",
}

# Pre-compiled regexes for operand extraction
_METHOD_REF_RE = re.compile(r"(L[\w/$]+;->[\w<>]+\(.*?\)[\w/$;\[]*)")
_FIELD_REF_RE = re.compile(r"(L[\w/$]+;->[\w]+:[\w/$;\[]+)")
_CLASS_REF_RE = re.compile(r"(L[\w/$]+;)")
_CONST_STRING_RE = re.compile(r'^const-string(?:/jumbo)?\s')


def categorize_opcode(opcode: str) -> str:
    """Map a Dalvik opcode to its semantic category.

    Prefix-matched: 'add-int/2addr' matches 'add' -> 'ALU'.
    Returns 'OTHER' for unrecognized opcodes.
    """
    for prefix, cat in OPCODE_CATEGORIES.items():
        if opcode.startswith(prefix):
            return cat
    return "OTHER"


# Mapping from semantic categories to the ACFG feature vector indices
# used by Binary Ninja's build_block_features (cfg_features.py).
# This enables cross-platform ACFG feature comparison.
CATEGORY_TO_ACFG_INDEX = {
    "ALU": 0,       # CAT_ARITHMETIC
    "CONV": 0,      # arithmetic-adjacent
    "CMP": 4,       # CAT_COMPARISON
    "MOV": 2,       # CAT_TRANSFER
    "CONST": 2,     # transfer-adjacent (loading constants)
    "LOAD": 5,      # CAT_MEMORY
    "STORE": 5,     # CAT_MEMORY
    "CALL": 3,      # CAT_CALL
    "BRANCH": 1,    # CAT_LOGIC (conditional logic)
    "JMP": 1,       # CAT_LOGIC
    "SWITCH": 1,    # CAT_LOGIC
    "RET": 2,       # CAT_TRANSFER
    "ALLOC": 5,     # CAT_MEMORY (heap allocation)
    "TYPE": 6,      # CAT_OTHER
    "ARR": 5,       # CAT_MEMORY
    "EXC": 6,       # CAT_OTHER
    "SYNC": 6,      # CAT_OTHER
    "OTHER": 6,     # CAT_OTHER
}


def normalize_instruction(line: str, level: str = "opcode_api") -> str:
    """Normalize a single smali instruction line.

    Args:
        line: A single smali instruction (whitespace-stripped).
        level: Normalization level:
            'category'   - most aggressive: just semantic category
            'opcode'     - base opcode only, width/addressing-mode invariant
            'opcode_api' - category + API references for invoke/field/alloc
                          (default, best for MinHash similarity)

    Returns:
        Normalized instruction string, or empty string for non-instructions.
    """
    stripped = line.strip()
    if not stripped:
        return ""

    parts = stripped.split(None, 1)
    opcode = parts[0]
    operands = parts[1] if len(parts) > 1 else ""

    if level == "category":
        return categorize_opcode(opcode)

    if level == "opcode":
        # Strip type/width suffixes for invariance:
        # add-int, add-long, add-float -> 'add'
        # add-int/2addr -> 'add'
        base = re.split(r"[-/]", opcode)[0]
        return base

    if level == "opcode_api":
        # const-string: preserve string content (encrypted strings are a
        # key malware indicator)
        if _CONST_STRING_RE.match(stripped):
            # Extract the string literal
            str_match = re.search(r'"(.*)"', operands)
            if str_match:
                return f"CONST_STR \"{str_match.group(1)}\""
            return "CONST_STR"

        # invoke-*: preserve method reference
        if opcode.startswith("invoke"):
            ref = _METHOD_REF_RE.search(operands)
            if ref:
                return f"CALL {ref.group(1)}"
            return "CALL"

        # Field access: preserve field reference
        if opcode.startswith(("iget", "iput", "sget", "sput")):
            ref = _FIELD_REF_RE.search(operands)
            if ref:
                cat = "LOAD" if "get" in opcode else "STORE"
                return f"{cat} {ref.group(1)}"
            # Fallback: try space-separated format from androguard
            # e.g. "iget v0, p0, Lcom/Foo;->field Ljava/lang/String;"
            space_ref = re.search(
                r"(L[\w/$]+;->[\w]+)\s+([\w/$;\[]+)", operands
            )
            if space_ref:
                cat = "LOAD" if "get" in opcode else "STORE"
                return f"{cat} {space_ref.group(1)}:{space_ref.group(2)}"
            cat = "LOAD" if "get" in opcode else "STORE"
            return cat

        # new-instance: preserve allocated type
        if opcode.startswith("new-instance") or opcode == "new-array":
            ref = _CLASS_REF_RE.search(operands)
            if ref:
                return f"ALLOC {ref.group(1)}"
            return "ALLOC"

        # Everything else: just the category
        return categorize_opcode(opcode)

    # Unknown level: return raw opcode
    return opcode


def normalize_method_body(
    body: str, level: str = "opcode_api"
) -> List[str]:
    """Normalize all instructions in a smali method body.

    Filters out directives (.), labels (:), comments (#), and blank lines.
    Returns a list of normalized instruction strings.

    Args:
        body: Raw smali method body text.
        level: Normalization level (see normalize_instruction).

    Returns:
        List of normalized instruction strings (no empty strings).
    """
    normalized = []
    for line in body.split("\n"):
        stripped = line.strip()
        # Skip non-instructions
        if not stripped:
            continue
        if stripped.startswith((".",":", "#")):
            continue
        result = normalize_instruction(stripped, level)
        if result:
            normalized.append(result)
    return normalized