Hangcheng Cao

48 papers A* 5A 3B 1Journal 37Unranked 2
YearRankTypeTitle / Venue / Authors
2026 J jnl
CoRR
Haonan An, Guang Hua, Wei Du, Hangcheng Cao, Yihang Tao, Guowen Xu, Susanto Rahardja, Yuguang Fang
2026 J jnl
IEEE Trans. Mob. Comput.
Wenbin Huang, Ju Ren, Hangcheng Cao, Hongbo Jiang, Panlong Yang, Zhangjie Fu
2026 J jnl
CoRR
Yihang Tao, Senkang Hu, Haonan An, Zhengru Fang, Hangcheng Cao, Yuguang Fang
2026 J jnl
IEEE Trans. Mob. Comput.
Longzhi Yuan, Hangcheng Cao, Yanan Ma, Wei Gong, Yuguang Fang
2026 A* conf
AAAI
Xinyuan Qian, Haoyong Wang, Hangcheng Cao, Shuai Yuan, Senkang Hu, Qingchuan Zhao, Hongwei Li, Guowen Xu
2026 J jnl
IEEE Trans. Dependable Secur. Comput.
Shuai Yuan, Guowen Xu, Hongwei Li, Rui Zhang, Hangcheng Cao, Xinyuan Qian, Tao Ni, Qingchuan Zhao, Yuguang Fang
2026 J jnl
Inf. Fusion
Ziyang He, Yuan Liu, Laurence T. Yang, Zhaoyang Ge, Ling Kuang, Cong Yang, Hangcheng Cao, Nan Lin
2026 J jnl
CoRR
Haonan An, Xiaohui Ye, Guang Hua, Yihang Tao, Hangcheng Cao, Xiangyu Yu, Yuguang Fang
2026 A* conf
AAAI
Haonan An, Guang Hua, Hangcheng Cao, Zhengru Fang, Guowen Xu, Susanto Rahardja, Yuguang Fang
2026 J jnl
IEEE Trans. Dependable Secur. Comput.
Hangcheng Cao, Wenbin Huang, Guowen Xu, Xianhao Chen, Ziyang He, Jingyang Hu, Hongbo Jiang, Yuguang Fang
2026 J jnl
IEEE Trans. Netw.
Longzhi Yuan, Hangcheng Cao, Wei Gong, Yuguang Fang
2025 A conf
AsiaCCS
Hangcheng Cao, Guowen Xu, Wenbin Huang, Hongwei Li
2025 J jnl
Inf. Fusion
Liwen Wu, Zhizhi Liu, Bin Pu, Kang Wei, Hangcheng Cao, Shaowen Yao
2025 conf
BIBM
Bin Pu, Jiewen Yang, Hangcheng Cao, Xingguo Lv, Lei Zhao, Qika Lin, Zhan Gao, Yifan Zhu, Haiyan Chen, Kenli Li
2025 J jnl
CoRR
Shuai Yuan, Guowen Xu, Hongwei Li, Rui Zhang, Xinyuan Qian, Wenbo Jiang, Hangcheng Cao, Qingchuan Zhao
2025 J jnl
CoRR
Yihang Tao, Senkang Hu, Yue Hu, Haonan An, Hangcheng Cao, Yuguang Fang
2025 J jnl
IEEE Trans. Inf. Forensics Secur.
Wenbin Huang, Ju Ren, Hangcheng Cao, Hanyuan Chen, Hongbo Jiang, Zhangjie Fu
2025 J jnl
CoRR
Haonan An, Guang Hua, Yu Guo, Hangcheng Cao, Susanto Rahardja, Yuguang Fang
2025 A* conf
ICML
Shuai Yuan, Hongwei Li, Rui Zhang, Hangcheng Cao, Wenbo Jiang, Tao Ni, Wenshu Fan, Qingchuan Zhao, Guowen Xu
2025 J jnl
CoRR
Haonan An, Guang Hua, Hangcheng Cao, Zhengru Fang, Guowen Xu, Susanto Rahardja, Yuguang Fang
2025 J jnl
IEEE Trans. Inf. Forensics Secur.
Cong Wu, Hangcheng Cao, Jing Chen, Xiyu Yan, Guowen Xu, Ziming Zhao, Yang Liu, Hongbo Jiang
2025 J jnl
CoRR
Hangcheng Cao, Baixiang Huang, Longzhi Yuan, Haonan An, Zihan Fang, Xianhao Chen, Yuguang Fang
2025 J jnl
IEEE Trans. Inf. Forensics Secur.
Hangcheng Cao, Guowen Xu, Ziyang He, Xuan Zhang, Shengmin Xu, Xinyuan Qian, Anjia Yang, Jianting Ning
2025 J jnl
IEEE Trans. Inf. Forensics Secur.
Hangcheng Cao, Guowen Xu, Ziyang He, Shaoqing Shi, Shengmin Xu, Cong Wu, Jianting Ning
2024 J jnl
IEEE Trans. Mob. Comput.
Junyi Zhou, Henglin Pu, Hangcheng Cao, Chao Cai, Peng Guo, Hongbo Jiang
2024 J jnl
IEEE Trans. Mob. Comput.
Hangcheng Cao, Daibo Liu, Hongbo Jiang, Chao Cai, Tianyue Zheng, John C. S. Lui, Jun Luo
2024 J jnl
CoRR
Zihan Fang, Zheng Lin, Senkang Hu, Hangcheng Cao, Yiqin Deng, Xianhao Chen, Yuguang Fang
2024 J jnl
CoRR
Zhe Chen, Chao Hu, Tianyue Zheng, Hangcheng Cao, Yanbing Yang, Yen Chu, Hongbo Jiang, Jun Luo
2024 J jnl
IEEE Trans. Mob. Comput.
Cong Wu, Hangcheng Cao, Guowen Xu, Chengjie Zhou, Jianfei Sun, Ran Yan, Yang Liu, Hongbo Jiang
2024 J jnl
IEEE Internet Things J.
Ling Kuang, Fanzi Zeng, Daibo Liu, Hangcheng Cao, Hongbo Jiang, Jiangchuan Liu
2024 A* conf
INFOCOM
Jingyang Hu, Hongbo Jiang, Tianyue Zheng, Jingzhi Hu, Hongbo Wang, Hangcheng Cao, Zhe Chen, Jun Luo
2024 A* conf
SP
Jun Luo, Hangcheng Cao, Hongbo Jiang, Yanbing Yang, Zhe Chen
2024 J jnl
IEEE Trans. Mob. Comput.
Hangcheng Cao, Daibo Liu, Hongbo Jiang, Jun Luo
2024 J jnl
IEEE Trans. Mob. Comput.
Wenbin Huang, Hanyuan Chen, Hangcheng Cao, Ju Ren, Hongbo Jiang, Zhangjie Fu, Yaoxue Zhang
2024 J jnl
CoRR
Zhengru Fang, Senkang Hu, Haonan An, Yuang Zhang, Jingjing Wang, Hangcheng Cao, Xianhao Chen, Yuguang Fang
2024 J jnl
IEEE Trans. Mob. Comput.
Zhengru Fang, Senkang Hu, Haonan An, Yuang Zhang, Jingjing Wang, Hangcheng Cao, Xianhao Chen, Yuguang Fang
2024 J jnl
CoRR
Hangcheng Cao, Longzhi Yuan, Guowen Xu, Ziyang He, Zhengru Fang, Yuguang Fang
2024 J jnl
CoRR
Hangcheng Cao, Wenbin Huang, Guowen Xu, Xianhao Chen, Ziyang He, Jingyang Hu, Hongbo Jiang, Yuguang Fang
2024 B conf
TrustCom
Shengmin Xu, Jianfei Sun, Hangcheng Cao, Yulan Gao, Ziyang He, Cong Wu
2024 J jnl
IEEE Trans. Mob. Comput.
Hongbo Jiang, Panyi Ji, Taiyuan Zhang, Hangcheng Cao, Daibo Liu
2023 J jnl
IEEE Internet Things J.
Hangcheng Cao, Hongbo Jiang, Kehua Yang, Siyu Chen, Wenqi Wu, Jiangchuan Liu, Schahram Dustdar
2023 A conf
ICDCS
Jingyang Hu, Hongbo Jiang, Daibo Liu, Zhu Xiao, Hangcheng Cao, Yue Qi, Schahram Dustdar, Jiangchuan Liu
2023 J jnl
IEEE Commun. Mag.
Zhe Chen, Tianyue Zheng, Chao Hu, Hangcheng Cao, Yanbing Yang, Hongbo Jiang, Jun Luo
2023 J jnl
IEEE Internet Things J.
Hangcheng Cao, Hongbo Jiang, Daibo Liu, Ruize Wang, Geyong Min, Jiangchuan Liu, Schahram Dustdar, John C. S. Lui
2023 J jnl
CoRR
Jun Luo, Hangcheng Cao, Hongbo Jiang, Yanbing Yang, Zhe Chen
2022 conf
ISACom@MobiCom
Zhe Chen, Tianyue Zheng, Chao Hu, Hangcheng Cao, Yanbing Yang, Hongbo Jiang, Jun Luo
2021 A conf
ICDCS
Hangcheng Cao, Hongbo Jiang, Daibo Liu, Jie Xiong
2020 J jnl
Proc. ACM Interact. Mob. Wearable Ubiquitous Technol.
Hongbo Jiang, Hangcheng Cao, Daibo Liu, Jie Xiong, Zhichao Cao
redb/extractors/decompiler/apk/smali_parser.py
← Index redb/extractors/decompiler/apk/smali_parser.py python
"""Smali file parser — extracts individual method bodies from apktool output.

Parses .smali files produced by apktool and extracts per-method bodies,
instruction counts, and register counts.
"""

import os
import re
from dataclasses import dataclass, field
from typing import Dict, List, Optional


@dataclass
class SmaliMethod:
    """Parsed smali method data."""
    class_name: str
    method_name: str
    method_signature: str
    body: str
    instruction_count: int = 0
    register_count: int = 0
    access_flags: List[str] = field(default_factory=list)


# Directives start with '.' — these are metadata, not instructions
_DIRECTIVE_RE = re.compile(r"^\s*\.")
# Labels start with ':'
_LABEL_RE = re.compile(r"^\s*:")
# Blank or comment lines
_BLANK_OR_COMMENT_RE = re.compile(r"^\s*(#.*)?$")
# Method declaration
_METHOD_START_RE = re.compile(
    r"^\.method\s+(.*?)\s+(\S+)\(([^)]*)\)(\S+)\s*$"
)
_METHOD_START_SIMPLE_RE = re.compile(
    r"^\.method\s+(.*)"
)
# .registers or .locals directive
_REGISTERS_RE = re.compile(r"^\s*\.registers\s+(\d+)")
_LOCALS_RE = re.compile(r"^\s*\.locals\s+(\d+)")
# .line directive
_LINE_RE = re.compile(r"^\s*\.line\s+\d+")


class SmaliParser:
    """Parser for apktool smali output files."""

    @staticmethod
    def parse_smali_file(filepath: str) -> List[SmaliMethod]:
        """Parse a single .smali file and return list of methods.

        Each .smali file contains one class with all its methods.
        """
        with open(filepath, "r", encoding="utf-8", errors="replace") as f:
            content = f.read()

        return SmaliParser._parse_smali_content(content, filepath)

    @staticmethod
    def _parse_smali_content(content: str, source: str = "") -> List[SmaliMethod]:
        """Parse smali text content and extract methods."""
        lines = content.split("\n")
        methods = []

        # Extract class name from .class directive
        class_name = ""
        for line in lines:
            if line.startswith(".class "):
                parts = line.split()
                class_name = parts[-1]  # Last token is the class descriptor
                break

        in_method = False
        method_lines = []
        method_header = ""
        access_flags = []
        skip_method = False

        for line in lines:
            if line.startswith(".method "):
                in_method = True
                method_lines = []
                method_header = line
                skip_method = False

                # Parse access flags and method signature
                remainder = line[len(".method "):].strip()
                tokens = remainder.split()
                access_flags = []
                method_sig_token = tokens[-1] if tokens else ""

                for t in tokens[:-1]:
                    access_flags.append(t)

                # Skip abstract and native methods (no body)
                if "abstract" in access_flags or "native" in access_flags:
                    skip_method = True

            elif line.startswith(".end method"):
                if in_method and not skip_method:
                    body = "\n".join(method_lines)
                    method_name, signature = SmaliParser._parse_method_sig(
                        method_header
                    )
                    instruction_count = SmaliParser.count_instructions(body)
                    register_count = SmaliParser._extract_register_count(body)

                    methods.append(
                        SmaliMethod(
                            class_name=class_name,
                            method_name=method_name,
                            method_signature=signature,
                            body=body,
                            instruction_count=instruction_count,
                            register_count=register_count,
                            access_flags=access_flags,
                        )
                    )
                in_method = False
                method_lines = []
                access_flags = []

            elif in_method and not skip_method:
                method_lines.append(line)

        return methods

    @staticmethod
    def parse_smali_directory(dirpath: str) -> Dict[str, SmaliMethod]:
        """Parse all .smali files in a directory tree.

        Returns dict keyed by 'ClassName->methodName(signature)ReturnType'.
        """
        result = {}
        for root, _dirs, files in os.walk(dirpath):
            for fname in files:
                if fname.endswith(".smali"):
                    fpath = os.path.join(root, fname)
                    try:
                        methods = SmaliParser.parse_smali_file(fpath)
                        for m in methods:
                            key = SmaliParser.make_method_key(
                                m.class_name, m.method_name, m.method_signature
                            )
                            result[key] = m
                    except Exception:
                        continue
        return result

    @staticmethod
    def normalize_smali_body(body: str) -> str:
        """Normalize smali body for consistent hashing.

        Strips comments, .line directives, normalizes whitespace.
        """
        lines = []
        for line in body.split("\n"):
            stripped = line.strip()
            # Skip empty lines, comments, and .line directives
            if not stripped or stripped.startswith("#"):
                continue
            if _LINE_RE.match(stripped):
                continue
            lines.append(stripped)
        return "\n".join(lines)

    @staticmethod
    def count_instructions(body: str) -> int:
        """Count actual Dalvik instructions (skip directives, labels, blanks)."""
        count = 0
        for line in body.split("\n"):
            stripped = line.strip()
            if not stripped:
                continue
            if _DIRECTIVE_RE.match(stripped):
                continue
            if _LABEL_RE.match(stripped):
                continue
            if _BLANK_OR_COMMENT_RE.match(stripped):
                continue
            count += 1
        return count

    @staticmethod
    def _extract_register_count(body: str) -> int:
        """Extract register count from .registers or .locals directive.

        apktool outputs .locals (local registers only) by default.
        .registers (total = locals + params) is used with --use-registers.
        We return whichever is present.
        """
        for line in body.split("\n"):
            stripped = line.strip()
            m = _REGISTERS_RE.match(stripped)
            if m:
                return int(m.group(1))
            m = _LOCALS_RE.match(stripped)
            if m:
                return int(m.group(1))
        return 0

    @staticmethod
    def _parse_method_sig(header_line: str) -> tuple:
        """Parse method name and signature from .method header line.

        Input: '.method public onCreate(Landroid/os/Bundle;)V'
        Returns: ('onCreate', '(Landroid/os/Bundle;)V')
        """
        remainder = header_line[len(".method "):].strip()
        tokens = remainder.split()
        if not tokens:
            return ("unknown", "()")

        # Last token contains methodName(params)returnType
        method_part = tokens[-1]

        paren_idx = method_part.find("(")
        if paren_idx == -1:
            return (method_part, "()")

        method_name = method_part[:paren_idx]
        signature = method_part[paren_idx:]

        return (method_name, signature)

    @staticmethod
    def make_method_key(class_name: str, method_name: str, signature: str) -> str:
        """Build a canonical method key for cross-tool matching.

        Format: 'Lcom/example/Foo;->methodName(params)ReturnType'
        """
        return f"{class_name}->{method_name}{signature}"