Wei Chen

168 papers A* 48A 10Journal 97Unranked 13
YearRankTypeTitle / Venue / Authors
2026 A conf
WSDM
Wei Huang, Keping Bi, Yinqiong Cai, Wei Chen, Jiafeng Guo, Xueqi Cheng
2026 A* conf
WWW
Shiqi Sun, Du Su, Wei Chen, Xueqi Cheng
2025 J jnl
ACM Trans. Inf. Syst.
Jiafeng Guo, Yinqiong Cai, Keping Bi, Yixing Fan, Wei Chen, Ruqing Zhang, Xueqi Cheng
2025 A* conf
ICLR
Mingkun Zhang, Keping Bi, Wei Chen, Jiafeng Guo, Xueqi Cheng
2025 J jnl
CoRR
Mingkun Zhang, Keping Bi, Wei Chen, Jiafeng Guo, Xueqi Cheng
2025 J jnl
CoRR
Yu Chen, Siwei Wang, Longbo Huang, Wei Chen
2025 conf
ACL (Findings)
Yuchen Wen, Keping Bi, Wei Chen, Jiafeng Guo, Xueqi Cheng
2025 J jnl
CoRR
Wei Huang, Keping Bi, Yinqiong Cai, Wei Chen, Jiafeng Guo, Xueqi Cheng
2024 J jnl
CoRR
Lu Chen, Wei Huang, Ruqing Zhang, Wei Chen, Jiafeng Guo, Xueqi Cheng
2024 A* conf
NeurIPS
Mingkun Zhang, Keping Bi, Wei Chen, Quanrun Chen, Jiafeng Guo, Xueqi Cheng
2024 J jnl
CoRR
Mingkun Zhang, Keping Bi, Wei Chen, Quanrun Chen, Jiafeng Guo, Xueqi Cheng
2024 A conf
ECAI
Mingkun Zhang, Jianing Li, Wei Chen, Jiafeng Guo, Xueqi Cheng
2024 J jnl
CoRR
Mingkun Zhang, Jianing Li, Wei Chen, Jiafeng Guo, Xueqi Cheng
2024 J jnl
CoRR
Yuchen Wen, Keping Bi, Wei Chen, Jiafeng Guo, Xueqi Cheng
2024 A* conf
NeurIPS
Yubao Tang, Ruqing Zhang, Jiafeng Guo, Maarten de Rijke, Wei Chen, Xueqi Cheng
2024 J jnl
CoRR
Yubao Tang, Ruqing Zhang, Jiafeng Guo, Maarten de Rijke, Wei Chen, Xueqi Cheng
2024 J jnl
CoRR
Yubao Tang, Ruqing Zhang, Jiafeng Guo, Maarten de Rijke, Wei Chen, Xueqi Cheng
2024 J jnl
ACM Trans. Inf. Syst.
Yubao Tang, Ruqing Zhang, Jiafeng Guo, Maarten de Rijke, Wei Chen, Xueqi Cheng
2024 J jnl
CoRR
Bohan Wang, Huishuai Zhang, Qi Meng, Ruoyu Sun, Zhi-Ming Ma, Wei Chen
2024 A* conf
AAAI
Yu-An Liu, Ruqing Zhang, Mingkun Zhang, Wei Chen, Maarten de Rijke, Jiafeng Guo, Xueqi Cheng
2024 A* conf
KDD
Bohan Wang, Yushun Zhang, Huishuai Zhang, Qi Meng, Ruoyu Sun, Zhi-Ming Ma, Tie-Yan Liu, Zhi-Quan Luo, Wei Chen
2023 A conf
CIKM
Yu-An Liu, Ruqing Zhang, Jiafeng Guo, Maarten de Rijke, Wei Chen, Yixing Fan, Xueqi Cheng
2023 J jnl
CoRR
Yu-An Liu, Ruqing Zhang, Jiafeng Guo, Maarten de Rijke, Wei Chen, Yixing Fan, Xueqi Cheng
2023 J jnl
CoRR
Yinqiong Cai, Yixing Fan, Keping Bi, Jiafeng Guo, Wei Chen, Ruqing Zhang, Xueqi Cheng
2023 J jnl
CoRR
Bohan Wang, Jingwen Fu, Huishuai Zhang, Nanning Zheng, Wei Chen
2023 A* conf
NeurIPS
Bohan Wang, Jingwen Fu, Huishuai Zhang, Nanning Zheng, Wei Chen
2023 A* conf
ICLR
Yihan Du, Wei Chen, Yuko Kuroki, Longbo Huang
2023 A conf
CIKM
Jiangui Chen, Ruqing Zhang, Jiafeng Guo, Maarten de Rijke, Wei Chen, Yixing Fan, Xueqi Cheng
2023 J jnl
CoRR
Jiangui Chen, Ruqing Zhang, Jiafeng Guo, Maarten de Rijke, Wei Chen, Yixing Fan, Xueqi Cheng
2023 A* conf
COLT
Bohan Wang, Huishuai Zhang, Zhiming Ma, Wei Chen
2023 J jnl
CoRR
Bohan Wang, Huishuai Zhang, Zhi-Ming Ma, Wei Chen
2023 J jnl
Neurocomputing
Shiqi Gong, Qi Meng, Yue Wang, Lijun Wu, Wei Chen, Zhiming Ma, Tie-Yan Liu
2023 A conf
CIKM
Lu Chen, Ruqing Zhang, Wei Huang, Wei Chen, Jiafeng Guo, Xueqi Cheng
2023 J jnl
CoRR
Lu Chen, Ruqing Zhang, Wei Huang, Wei Chen, Jiafeng Guo, Xueqi Cheng
2023 A conf
CIKM
Yinqiong Cai, Keping Bi, Yixing Fan, Jiafeng Guo, Wei Chen, Xueqi Cheng
2023 J jnl
CoRR
Yinqiong Cai, Keping Bi, Yixing Fan, Jiafeng Guo, Wei Chen, Xueqi Cheng
2023 J jnl
CoRR
Yu-An Liu, Ruqing Zhang, Jiafeng Guo, Wei Chen, Xueqi Cheng
2023 J jnl
CoRR
Yu-An Liu, Ruqing Zhang, Mingkun Zhang, Wei Chen, Maarten de Rijke, Jiafeng Guo, Xueqi Cheng
2023 J jnl
CoRR
Wei Chen, Weitao Du, Zhi-Ming Ma, Qi Meng
2023 A* conf
SIGIR
Yu-An Liu, Ruqing Zhang, Jiafeng Guo, Maarten de Rijke, Wei Chen, Yixing Fan, Xueqi Cheng
2023 J jnl
CoRR
Yu-An Liu, Ruqing Zhang, Jiafeng Guo, Maarten de Rijke, Wei Chen, Yixing Fan, Xueqi Cheng
2023 J jnl
CoRR
Jingwen Fu, Bohan Wang, Huishuai Zhang, Zhizheng Zhang, Wei Chen, Nanning Zheng
2022 A* conf
KDD
Da Yu, Huishuai Zhang, Wei Chen, Jian Yin, Tie-Yan Liu
2022 J jnl
CoRR
Yihan Du, Wei Chen
2022 A conf
CIKM
Chen Wu, Ruqing Zhang, Jiafeng Guo, Wei Chen, Yixing Fan, Maarten de Rijke, Xueqi Cheng
2022 J jnl
CoRR
Chen Wu, Ruqing Zhang, Jiafeng Guo, Wei Chen, Yixing Fan, Maarten de Rijke, Xueqi Cheng
2022 J jnl
J. Syst. Sci. Complex.
Juanping Zhu, Qi Meng, Wei Chen, Yue Wang, Zhiming Ma
2022 A* conf
NeurIPS
Bohan Wang, Qi Meng, Huishuai Zhang, Ruoyu Sun, Wei Chen, Zhi-Ming Ma, Tie-Yan Liu
2022 A* conf
ICLR
Chongchong Li, Yue Wang, Wei Chen, Yuting Liu, Zhi-Ming Ma, Tie-Yan Liu
2022 J jnl
CoRR
Peiyan Hu, Qi Meng, Bingguang Chen, Shiqi Gong, Yue Wang, Wei Chen, Rongchan Zhu, Zhi-Ming Ma, Tie-Yan Liu
2022 J jnl
CoRR
Xiaodong Yang, Huishuai Zhang, Wei Chen, Tie-Yan Liu
2022 A* conf
ICLR
Sang-gil Lee, Heeseung Kim, Chaehun Shin, Xu Tan, Chang Liu, Qi Meng, Tao Qin, Wei Chen, Sungroh Yoon, Tie-Yan Liu
2022 J jnl
CoRR
Bohan Wang, Yushun Zhang, Huishuai Zhang, Qi Meng, Zhi-Ming Ma, Tie-Yan Liu, Wei Chen
2022 A* conf
ICML
Weitao Du, He Zhang, Yuanqi Du, Qi Meng, Wei Chen, Nanning Zheng, Bin Shao, Tie-Yan Liu
2022 J jnl
Mach. Learn.
Huishuai Zhang, Da Yu, Mingyang Yi, Wei Chen, Tie-Yan Liu
2022 A* conf
NeurIPS
Jiawei Huang, Li Zhao, Tao Qin, Wei Chen, Nan Jiang, Tie-Yan Liu
2022 J jnl
CoRR
Jiawei Huang, Li Zhao, Tao Qin, Wei Chen, Nan Jiang, Tie-Yan Liu
2022 A* conf
CVPR
Tianyu Pang, Huishuai Zhang, Di He, Yinpeng Dong, Hang Su, Wei Chen, Jun Zhu, Tie-Yan Liu
2021 J jnl
CoRR
Tianyu Pang, Huishuai Zhang, Di He, Yinpeng Dong, Hang Su, Wei Chen, Jun Zhu, Tie-Yan Liu
2021 J jnl
CoRR
Mingyang Yi, Huishuai Zhang, Wei Chen, Zhi-Ming Ma, Tie-Yan Liu
2021 J jnl
CoRR
Xiangyu Zheng, Xinwei Sun, Wei Chen, Tie-Yan Liu
2021 conf
ACL/IJCNLP (Findings)
Chujie Zheng, Yong Liu, Wei Chen, Yongcai Leng, Minlie Huang
2021 J jnl
CoRR
Chujie Zheng, Yong Liu, Wei Chen, Yongcai Leng, Minlie Huang
2021 J jnl
CoRR
Yihan Du, Wei Chen, Yuko Kuroki, Longbo Huang
2021 J jnl
CoRR
Yihan Du, Yuko Kuroki, Wei Chen
2021 A* conf
AAAI
Yihan Du, Yuko Kuroki, Wei Chen
2021 J jnl
CoRR
Da Yu, Huishuai Zhang, Wei Chen, Tie-Yan Liu
2021 A* conf
ICLR
Da Yu, Huishuai Zhang, Wei Chen, Tie-Yan Liu
2021 conf
EMNLP (1)
Hao Zhou, Minlie Huang, Yong Liu, Wei Chen, Xiaoyan Zhu
2021 J jnl
CoRR
Weitao Du, He Zhang, Yuanqi Du, Qi Meng, Wei Chen, Bin Shao, Tie-Yan Liu
2021 A* conf
AAAI
Da Yu, Huishuai Zhang, Wei Chen, Jian Yin, Tie-Yan Liu
2021 J jnl
CoRR
Shiqi Gong, Qi Meng, Yue Wang, Lijun Wu, Wei Chen, Zhi-Ming Ma, Tie-Yan Liu
2021 J jnl
CoRR
Da Yu, Huishuai Zhang, Wei Chen, Jian Yin, Tie-Yan Liu
2021 J jnl
J. Syst. Sci. Complex.
Juanping Zhu, Qi Meng, Wei Chen, Zhiming Ma
2021 A* conf
ICML
Da Yu, Huishuai Zhang, Wei Chen, Jian Yin, Tie-Yan Liu
2021 J jnl
CoRR
Da Yu, Huishuai Zhang, Wei Chen, Jian Yin, Tie-Yan Liu
2021 A* conf
NeurIPS
Chang Liu, Xinwei Sun, Jindong Wang, Haoyue Tang, Tao Li, Tao Qin, Wei Chen, Tie-Yan Liu
2021 J jnl
CoRR
Ziming Liu, Bohan Wang, Qi Meng, Wei Chen, Max Tegmark, Tie-Yan Liu
2021 J jnl
CoRR
Bohan Wang, Qi Meng, Huishuai Zhang, Ruoyu Sun, Wei Chen, Zhi-Ming Ma
2021 A* conf
NeurIPS
Bohan Wang, Huishuai Zhang, Jieyu Zhang, Qi Meng, Wei Chen, Tie-Yan Liu
2021 J jnl
CoRR
Bohan Wang, Huishuai Zhang, Jieyu Zhang, Qi Meng, Wei Chen, Tie-Yan Liu
2021 A conf
UAI
Xufang Luo, Qi Meng, Wei Chen, Yunhong Wang, Tie-Yan Liu
2021 J jnl
CoRR
Sang-gil Lee, Heeseung Kim, Chaehun Shin, Xu Tan, Chang Liu, Qi Meng, Tao Qin, Wei Chen, Sungroh Yoon, Tie-Yan Liu
2021 A* conf
NeurIPS
Xiaobo Liang, Lijun Wu, Juntao Li, Yue Wang, Qi Meng, Tao Qin, Wei Chen, Min Zhang, Tie-Yan Liu
2021 J jnl
CoRR
Xiaobo Liang, Lijun Wu, Juntao Li, Yue Wang, Qi Meng, Tao Qin, Wei Chen, Min Zhang, Tie-Yan Liu
2021 A* conf
NeurIPS
Xinwei Sun, Botong Wu, Xiangyu Zheng, Chang Liu, Wei Chen, Tao Qin, Tie-Yan Liu
2021 J jnl
CoRR
Yichi Zhou, Shihong Song, Huishuai Zhang, Jun Zhu, Wei Chen, Tie-Yan Liu
2021 A* conf
ICML
Bohan Wang, Qi Meng, Wei Chen, Tie-Yan Liu
2021 J jnl
CoRR
Mingyang Yi, Qi Meng, Wei Chen, Zhi-Ming Ma
2020 A* conf
ICML
Xiaoyu Chen, Kai Zheng, Zixin Zhou, Yunchang Yang, Wei Chen, Liwei Wang
2020 J jnl
CoRR
Xiaoyu Chen, Kai Zheng, Zixin Zhou, Yunchang Yang, Wei Chen, Liwei Wang
2020 A* conf
ICML
Wei Chen, Yihan Du, Longbo Huang, Haoyu Zhao
2020 J jnl
CoRR
Wei Chen, Yihan Du, Longbo Huang, Haoyu Zhao
2020 J jnl
CoRR
Wei Chen, Yihan Du, Yuko Kuroki
2020 J jnl
CoRR
Wei Chen, Liwei Wang, Haoyu Zhao, Kai Zheng
2020 J jnl
CoRR
Juanping Zhu, Qi Meng, Wei Chen, Yue Wang, Zhiming Ma
2020 J jnl
IEEE Trans. Signal Process.
Shicong Cen, Huishuai Zhang, Yuejie Chi, Wei Chen, Tie-Yan Liu
2020 J jnl
CoRR
Qi Meng, Shiqi Gong, Wei Chen, Zhi-Ming Ma, Tie-Yan Liu
2020 A* conf
IJCAI
Da Yu, Huishuai Zhang, Wei Chen, Jian Yin, Tie-Yan Liu
2020 A* conf
IJCAI
Xufang Luo, Qi Meng, Di He, Wei Chen, Yunhong Wang
2020 J jnl
CoRR
Xinwei Sun, Botong Wu, Wei Chen
2020 J jnl
CoRR
Xinwei Sun, Botong Wu, Chang Liu, Xiangyu Zheng, Wei Chen, Tao Qin, Tie-Yan Liu
2020 J jnl
CoRR
Chang Liu, Xinwei Sun, Jindong Wang, Tao Li, Tao Qin, Wei Chen, Tie-Yan Liu
2020 J jnl
CoRR
Da Yu, Huishuai Zhang, Wei Chen, Jian Yin, Tie-Yan Liu
2020 A* conf
IJCAI
Ling Pan, Qingpeng Cai, Qi Meng, Wei Chen, Longbo Huang
2020 J jnl
Neurocomputing
Yue Wang, Yuting Liu, Wei Chen, Zhi-Ming Ma, Tie-Yan Liu
2020 J jnl
CoRR
Bohan Wang, Qi Meng, Wei Chen, Tie-Yan Liu
2019 A* conf
IJCAI
Mingyang Yi, Huishuai Zhang, Wei Chen, Zhi-Ming Ma, Tie-Yan Liu
2019 A* conf
AAAI
Shuxin Zheng, Qi Meng, Huishuai Zhang, Wei Chen, Nenghai Yu, Tie-Yan Liu
2019 J jnl
Neurocomputing
Qi Meng, Wei Chen, Yue Wang, Zhi-Ming Ma, Tie-Yan Liu
2019 J jnl
CoRR
Shicong Cen, Huishuai Zhang, Yuejie Chi, Wei Chen, Tie-Yan Liu
2019 conf
ICLR (Poster)
Qi Meng, Shuxin Zheng, Huishuai Zhang, Wei Chen, Qiwei Ye, Zhi-Ming Ma, Nenghai Yu, Tie-Yan Liu
2019 J jnl
CoRR
Da Yu, Huishuai Zhang, Wei Chen, Tie-Yan Liu, Jian Yin
2019 J jnl
CoRR
Juanping Zhu, Qi Meng, Wei Chen, Zhiming Ma
2019 J jnl
Neurocomputing
Li He, Shuxin Zheng, Wei Chen, Zhiming Ma, Tie-Yan Liu
2019 J jnl
CoRR
Mingyang Yi, Qi Meng, Wei Chen, Zhi-Ming Ma, Tie-Yan Liu
2019 J jnl
CoRR
Ling Pan, Qingpeng Cai, Qi Meng, Wei Chen, Longbo Huang, Tie-Yan Liu
2019 J jnl
CoRR
Huishuai Zhang, Da Yu, Wei Chen, Tie-Yan Liu
2018 J jnl
CoRR
Shuxin Zheng, Qi Meng, Huishuai Zhang, Wei Chen, Nenghai Yu, Tie-Yan Liu
2018 A* conf
IJCAI
Li He, Qi Meng, Wei Chen, Zhiming Ma, Tie-Yan Liu
2018 J jnl
CoRR
Li He, Qi Meng, Wei Chen, Zhiming Ma, Tie-Yan Liu
2018 J jnl
CoRR
Yue Wang, Wei Chen, Yuting Liu, Zhi-Ming Ma, Tie-Yan Liu
2018 A* conf
NeurIPS
Huishuai Zhang, Wei Chen, Tie-Yan Liu
2018 J jnl
CoRR
Qi Meng, Wei Chen, Shuxin Zheng, Qiwei Ye, Tie-Yan Liu
2018 A conf
AAMAS
Shizhao Sun, Wei Chen, Jiang Bian, Xiaoguang Liu, Tie-Yan Liu
2018 J jnl
CoRR
Yue Wang, Qi Meng, Wei Chen, Yuting Liu, Zhiming Ma, Tie-Yan Liu
2018 A* conf
ICML
Zhuohan Li, Di He, Fei Tian, Wei Chen, Tao Qin, Liwei Wang, Tie-Yan Liu
2018 J jnl
CoRR
Zhuohan Li, Di He, Fei Tian, Wei Chen, Tao Qin, Liwei Wang, Tie-Yan Liu
2018 J jnl
CoRR
Huishuai Zhang, Wei Chen, Tie-Yan Liu
2018 J jnl
计算机科学
Wei Chen, Youzheng Wu, Wenliang Chen, Min Zhang
2017 A* conf
ICML
Shuxin Zheng, Qi Meng, Taifeng Wang, Wei Chen, Nenghai Yu, Zhiming Ma, Tie-Yan Liu
2017 A* conf
AAAI
Qi Meng, Wei Chen, Jingcheng Yu, Taifeng Wang, Zhiming Ma, Tie-Yan Liu
2017 J jnl
CoRR
Qi Meng, Wei Chen, Yue Wang, Zhiming Ma, Tie-Yan Liu
2017 conf
WWW (Companion Volume)
Tie-Yan Liu, Wei Chen, Taifeng Wang
2017 A* conf
ICML
Yingce Xia, Tao Qin, Wei Chen, Jiang Bian, Nenghai Yu, Tie-Yan Liu
2017 J jnl
CoRR
Yingce Xia, Tao Qin, Wei Chen, Jiang Bian, Nenghai Yu, Tie-Yan Liu
2017 conf
ChinaCom (2)
Yan Tong, Jian Zhang, Wei Chen, Mingdi Xu, Tao Qin
2017 A* conf
IJCAI
Quanming Yao, James T. Kwok, Fei Gao, Wei Chen, Tie-Yan Liu
2017 conf
ECML/PKDD (1)
Shizhao Sun, Wei Chen, Jiang Bian, Xiaoguang Liu, Tie-Yan Liu
2017 conf
NIPS
Yue Wang, Wei Chen, Yuting Liu, Zhiming Ma, Tie-Yan Liu
2017 A* conf
AAAI
Qi Meng, Yue Wang, Wei Chen, Taifeng Wang, Zhiming Ma, Tie-Yan Liu
2017 conf
NIPS
Guolin Ke, Qi Meng, Thomas Finley, Taifeng Wang, Wei Chen, Weidong Ma, Qiwei Ye, Tie-Yan Liu
2017 J jnl
CoRR
Shizhao Sun, Wei Chen, Jiang Bian, Xiaoguang Liu, Tie-Yan Liu
2016 conf
NIPS
Qi Meng, Guolin Ke, Taifeng Wang, Wei Chen, Qiwei Ye, Zhiming Ma, Tie-Yan Liu
2016 J jnl
CoRR
Qi Meng, Guolin Ke, Taifeng Wang, Wei Chen, Qiwei Ye, Zhiming Ma, Tie-Yan Liu
2016 A* conf
IJCAI
Qi Meng, Wei Chen, Jingcheng Yu, Taifeng Wang, Zhiming Ma, Tie-Yan Liu
2016 J jnl
CoRR
Shuxin Zheng, Qi Meng, Taifeng Wang, Wei Chen, Nenghai Yu, Zhiming Ma, Tie-Yan Liu
2016 J jnl
CoRR
Qi Meng, Wei Chen, Jingcheng Yu, Taifeng Wang, Zhiming Ma, Tie-Yan Liu
2016 J jnl
CoRR
Shizhao Sun, Wei Chen, Jiang Bian, Xiaoguang Liu, Tie-Yan Liu
2016 J jnl
CoRR
Qi Meng, Yue Wang, Wei Chen, Taifeng Wang, Zhiming Ma, Tie-Yan Liu
2016 A* conf
AAAI
Shizhao Sun, Wei Chen, Liwei Wang, Xiaoguang Liu, Tie-Yan Liu
2015 A* conf
AAAI
Haifang Li, Fei Tian, Wei Chen, Tao Qin, Zhiming Ma, Tie-Yan Liu
2015 J jnl
CoRR
Shizhao Sun, Wei Chen, Liwei Wang, Tie-Yan Liu
2015 A* conf
AAAI
Tie-Yan Liu, Wei Chen, Tao Qin
2014 J jnl
CoRR
Di He, Wei Chen, Liwei Wang, Tie-Yan Liu
2014 A* conf
AAAI
Fei Tian, Haifang Li, Wei Chen, Tao Qin, Enhong Chen, Tie-Yan Liu
2014 J jnl
CoRR
Fei Tian, Haifang Li, Wei Chen, Tao Qin, Enhong Chen, Tie-Yan Liu
2014 J jnl
CoRR
Haifang Li, Fei Tian, Wei Chen, Tao Qin, Tie-Yan Liu
2014 J jnl
CoRR
Wei Chen, Di He, Tie-Yan Liu, Tao Qin, Yixin Tao, Liwei Wang
2014 A* conf
EC
Wei Chen, Di He, Tie-Yan Liu, Tao Qin, Yixin Tao, Liwei Wang
2014 A conf
WSDM
Jun Feng, Jiang Bian, Taifeng Wang, Wei Chen, Xiaoyan Zhu, Tie-Yan Liu
2014 J jnl
ACM Trans. Intell. Syst. Technol.
Tao Qin, Wei Chen, Tie-Yan Liu
2013 A* conf
IJCAI
Di He, Wei Chen, Liwei Wang, Tie-Yan Liu
2013 J jnl
CoRR
Yining Wang, Liwei Wang, Yuanzhi Li, Di He, Tie-Yan Liu, Wei Chen
2013 J jnl
Decis. Support Syst.
Di He, Wei Chen, Liwei Wang, Tie-Yan Liu
2012 conf
WINE
Lei Yao, Wei Chen, Tie-Yan Liu
2010 conf
NIPS
Wei Chen, Tie-Yan Liu, Zhiming Ma
2009 conf
NIPS
Wei Chen, Tie-Yan Liu, Yanyan Lan, Zhiming Ma, Hang Li
redb/extractors/decompiler/bninja/decompiler.py
← Index redb/extractors/decompiler/bninja/decompiler.py python
import os
import time
import json

from .analysis.medium_level import MediumLevelAnalysis

# disable the plugins set by user for binary ninja
os.environ["BN_DISABLE_USER_PLUGINS"] = "True"
import traceback

# Binary Ninja imports (conditional)
try:
    import binaryninja
    from binaryninja import mainthread, Symbol
    from binaryninja.enums import SymbolType
    BINARYNINJA_AVAILABLE = True
except Exception:
    BINARYNINJA_AVAILABLE = False
    binaryninja = None
    mainthread = None
    Symbol = None
    SymbolType = None

# Support both package and standalone imports
try:
    # Package import (when imported from redb)
    from .utils.hashes import calculate_sha256, calculate_tlsh
    from .utils.license import set_license
    from .utils.logging import setup_default_logger
    from .analysis.strings import StringAnalysis

    # Only import modules that depend on Binary Ninja when available
    if BINARYNINJA_AVAILABLE:
        from .analysis.cfg import CFGAnalysis
        from .analysis.disassembly import DisassemblyAnalysis
        from .analysis.low_level import LowLevelAnalysis
        from .arch.creator import ArchitectureCreator
        from .custom_options import register_custom_analysis_options
        from .function_type import FunctionTypeAnalysis, FunctionType
        from .analysis.scores import ObfuscationScores

except ImportError:
    # Fallback to absolute imports (for multiprocessing spawned processes)
    from redb.extractors.decompiler.bninja.utils.hashes import calculate_sha256, calculate_tlsh
    from redb.extractors.decompiler.bninja.utils.license import set_license
    from redb.extractors.decompiler.bninja.utils.logging import setup_default_logger

    # Only import modules that depend on Binary Ninja when available
    if BINARYNINJA_AVAILABLE:
        from redb.extractors.decompiler.bninja.analysis.cfg import CFGAnalysis
        from redb.extractors.decompiler.bninja.analysis.disassembly import DisassemblyAnalysis
        from redb.extractors.decompiler.bninja.analysis.low_level import LowLevelAnalysis
        from redb.extractors.decompiler.bninja.arch.creator import ArchitectureCreator
        from redb.extractors.decompiler.bninja.custom_options import register_custom_analysis_options
        from redb.extractors.decompiler.bninja.function_type import FunctionTypeAnalysis


class BinaryNinjaDecompiler:
    """A Binary Ninja-based decompiler that replicates the functionality of GhidraDecompilerScript.
    This class extracts decompiled code, disassembly with multiple normalization levels,
    and control flow graph information from binary files.
    """

    MIN_FUNCTION_SIZE = 10  # instructions
    MIN_BLOCK_SIZE = 4  # instructions
    INVALID_STACK_SIZE = -1

    def __init__(
        self,
        filepath,
        timeout,
        log=None,
        exporters=None,
        index_prefix=None,
        filetype=None,
        goresym=None,
        decompile_modules=None,
    ):
        """Initialize the Binary Ninja decompiler.

        Args:
            filepath: Path to the binary file to analyze
            log: Logger object (optional)
            timeout: Maximum time in seconds for analysis (default: 1200)
            exporters: List of exporters for the results (optional)
            index_prefix: Prefix for elastic index (optional)
            filetype: Type of the file (optional)

        """
        self.filepath = filepath
        self.log = log if log else setup_default_logger("BninjaDecompiler")
        self.BNINJA_TIMEOUT = timeout
        self.bv = None
        self.analysis_results = None
        self.errors = []
        self.exporters = exporters
        self.index_prefix = index_prefix
        self.filetype = filetype
        self.goresym = goresym
        self.decompile_modules = decompile_modules or {"all"}

        set_license(binaryninja)

        # Map to track instruction categorization
        mainthread.set_worker_thread_count(3)
        register_custom_analysis_options(binaryninja)

    def log_error(
        self, message, function_name, address, exception=None, error_location="unknown"
    ):
        """Log an error during processing."""
        error_msg = f"Error in function {function_name} at {address}: {message}"
        if exception:
            error_msg += f" - {str(exception)}"

        self.log.error(error_msg)

        # Add to errors list
        error = {
            "function_name": function_name,
            "function_address": str(address),
            "error_location": error_location,
            "error_message": message,
            "error_details": str(exception) if exception else "",
            "error_type": type(exception).__name__ if exception else "Unknown",
            "timestamp": int(time.time() * 1000),
        }
        self.errors.append(error)

    def __enter__(self):
        """Context manager entry point."""
        self.log.info(f"Opening binary file: {self.filepath}")
        binaryninja.BinaryViewType.add_binaryview_initial_analysis_completion_event(
            self.on_analysis_complete
        )

        #self.bv = binaryninja.load(self.filepath, update_analysis=False)
        self.bv = binaryninja.load(self.filepath, update_analysis=True)
        if self.bv is None:
            raise ValueError(f"Failed to open file: {self.filepath}")

        self.log.info("Waiting for analysis to complete...")

        self.log.debug(f"Binja analysis complete: {len(list(self.bv.functions))} functions")

        # set the architecture
        # todo: personalize this for other architectures
        self.arch = ArchitectureCreator("x86").get()

        # apply goresym
        if self.goresym is not None:
            self.__apply_goresym()
        return self

    def on_analysis_complete(self, bv):
        # Request an additional update after analysis is complete to ensure IL generation
        self.bv = bv
        self.bv.update_analysis()

        return

    def __apply_goresym(self):
        file = self.goresym
        data = None
        try:
            data = json.loads(open(file, 'r').read())
        except Exception as e:
            self.log_error(
                "Failed to open file from goresym: ",
                file,
                e,
                "analyze_binary",
            )

        if data is None:
            return

        self.bv.begin_undo_actions()
        if data.get('UserFunctions') is not None:
            user_functions = data['UserFunctions']
            for func in user_functions:
                try:
                    start = int(func['Start'])
                    name = func['FullName']
                    if self.bv.get_function_at(start) is None:
                        self.bv.create_user_function(start)

                    sym = Symbol(SymbolType.FunctionSymbol, start, name, name, name)
                    self.bv.define_user_symbol(sym)
                except Exception as e:
                    self.log.warning(f"Failed to apply GoReSym symbol for UserFunction {func.get('FullName', 'unknown')} at {func.get('Start', 'unknown')}: {e}")

        if data.get('StdFunctions') is not None:
            standard_functions = data['StdFunctions']
            for func in standard_functions:
                try:
                    start = int(func['Start'])
                    name = func['FullName']
                    if self.bv.get_function_at(start) is None:
                        self.bv.create_user_function(start)

                    sym = Symbol(SymbolType.FunctionSymbol, start, name, name, name)
                    self.bv.define_user_symbol(sym)
                except Exception as e:
                    self.log.warning(f"Failed to apply GoReSym symbol for StdFunction {func.get('FullName', 'unknown')} at {func.get('Start', 'unknown')}: {e}")

        self.bv.commit_undo_actions()
        return

    def __exit__(self, exc_type, exc_val, exc_tb):
        """Context manager exit point - clean up resources."""
        if self.bv:
            # Make sure to cancel any pending analysis
            # (if we have no pending analysis, binary ninja will log an error)

            # todo(@nicolo): investigate
            # if hasattr(self.bv, "abort_analysis"):
            #    self.bv.abort_analysis()
            self.bv.file.close()

        self.log.info("Cleanup completed successfully")
        return

    def tag(self):
        """Return the tag for this extractor."""
        return "DECOMPILED"

    def _module_selected(self, module_name):
        """Check if a decompiler sub-module is selected."""
        return "all" in self.decompile_modules or module_name in self.decompile_modules

    def analyze_binary(self):
        """Run Binary Ninja analysis and return results.

        Respects self.decompile_modules to selectively run/skip sub-modules:
        - strings: independent, skipped if not selected
        - decompilation: leaf module, skipped if not selected
        - disassembly: always runs (backbone — provides hash linkage for all others)
        - llil: leaf module, skipped if not selected
        - cfg: leaf module, skipped if not selected

        Only selected modules' results are appended to the results dict for DB insertion.
        Disassembly is always computed for linkage but only inserted when selected.
        """
        try:
            results = {
                "decompiled": [],
                "disassembled": [],
                "cfg": [],
                "llil": [],
                "errors": [],
                "strings": [],
                "mlil": []
            }

            run_all = "all" in self.decompile_modules
            run_strings = run_all or "strings" in self.decompile_modules
            run_decompilation = run_all or "decompilation" in self.decompile_modules
            run_disassembly = run_all or "disassembly" in self.decompile_modules
            run_llil = run_all or "llil" in self.decompile_modules
            run_cfg = run_all or "cfg" in self.decompile_modules

            # Determine if we need the per-function loop at all
            need_per_function = run_decompilation or run_disassembly or run_llil or run_cfg

            #functions_list = list(filter(is_not_ext_lib_function, self.bv.functions))
            functions_list = list(filter(is_lib_or_thunk, self.bv.functions))
            functions_list = list(filter(self.is_too_few_blocks, functions_list))

            # Strings extraction — independent of per-function analysis
            if run_strings:
                results["strings"] = StringAnalysis(self.bv, functions_list).analyze()

            if not need_per_function:
                return results

            for function in functions_list:
                try:
                    # Decompilation (HLIL) — leaf module, skip if not selected
                    hlil_json = self.extract_hlil(function) if run_decompilation else None

                    # Disassembly — always compute (provides hash linkage for others)
                    disass_json = self.extract_disasm(function)

                    # CFG — leaf module, skip if not selected
                    cfg_json = self.extract_cfg(function) if run_cfg else None

                    # LLIL — leaf module, skip if not selected
                    lowlevel_json = self.extract_lowlevel(function) if run_llil else None

                    # we run mlil only if we have cfg
                    mlil_json = self.extract_mediumlevel(function) if run_llil else None

                    # Calculate fuzzy hashes for disassembly using utils.hashes
                    if disass_json:
                        disass_no_addr = disass_json.get("disassembled_function_no_addresses", "")
                        disass_json["tlsh_disassembly"] = calculate_tlsh(disass_no_addr)

                    if hlil_json and disass_json:
                        hlil_json["disassembled_function_hash"] = disass_json[
                            "disassembled_function_hash"
                        ]
                        disass_json["decompiled_function_hash"] = hlil_json[
                            "decompiled_function_hash"
                        ]

                        results["decompiled"].append(hlil_json)
                        if run_disassembly:
                            results["disassembled"].append(disass_json)

                    elif hlil_json:
                        hlil_json["disassembled_function_hash"] = None
                        results["decompiled"].append(hlil_json)
                    elif disass_json:
                        disass_json["decompiled_function_hash"] = None
                        if run_disassembly:
                            results["disassembled"].append(disass_json)

                    # Add bi-directional linkage between LLIL and disassembly with fuzzy hashes
                    # LLIL fuzzy hashes (tlsh_llil) are already calculated in lowlevel_json
                    if lowlevel_json and disass_json:
                        # Add disassembly info to LLIL
                        lowlevel_json["disassembled_function_hash"] = disass_json["disassembled_function_hash"]
                        lowlevel_json["tlsh_disassembly"] = disass_json.get("tlsh_disassembly")

                        # Add LLIL fuzzy hashes to disassembly for easy export access
                        disass_json["tlsh_llil"] = lowlevel_json.get("tlsh_llil")
                        disass_json["minhash"] = lowlevel_json.get("minhash")

                    elif lowlevel_json:
                        lowlevel_json["disassembled_function_hash"] = None
                        lowlevel_json["tlsh_disassembly"] = None
                    elif disass_json:
                        # No LLIL available for this disassembly
                        disass_json["tlsh_llil"] = None
                        disass_json["minhash"] = None

                    if lowlevel_json:
                        results["llil"].append(lowlevel_json)
                        results["mlil"].append(mlil_json)

                    # Add CFG linkage with disassembled_function_hash
                    # Also add cyclomatic_complexity to disass_json for similarity metrics export
                    if cfg_json and disass_json:
                        cfg_json["disassembled_function_hash"] = disass_json["disassembled_function_hash"]
                        disass_json["cyclomatic_complexity"] = cfg_json.get("cyclomatic_complexity")
                        results["cfg"].append(cfg_json)
                    elif cfg_json:
                        cfg_json["disassembled_function_hash"] = None
                        results["cfg"].append(cfg_json)

                    # Ensure cyclomatic_complexity is set even if no cfg_json
                    if disass_json and "cyclomatic_complexity" not in disass_json:
                        disass_json["cyclomatic_complexity"] = None

                except Exception as e:
                    self.log_error(
                        "Failed to process function: ",
                        function.name,
                        function.start,
                        e,
                        "analyze_binary",
                    )

            return results

        except Exception as e:
            self.log.error(f"Error in binary analysis: {str(e)}")
            return None

    def extract_mediumlevel(self, function):
        middle_level = MediumLevelAnalysis(function, self.bv, self.log)
        middle_level_result, errors = middle_level.analyze()

        for error in errors:
            self.errors.append(error)

        return middle_level_result


    def extract_lowlevel(self, function):
        low_level = LowLevelAnalysis(function, self.bv, self.log)
        disassembly_json, errors = low_level.analyze()

        for error in errors:
            self.errors.append(error)

        return disassembly_json

    def extract_cfg(self, function):
        try:
            llil = function.llil if hasattr(function, 'llil') else None
            cfg = CFGAnalysis(function, llil_function=llil).extract_function_cfg()
            return cfg
        except Exception as e:
            self.log_error(
                "Fatal error in CFG extraction",
                function.name,
                function.start,
                e,
                "extract_disassembly",
            )
            return None

    def extract_disasm(self, function):
        try:
            disass_analysis = DisassemblyAnalysis(
                self.arch, function, self.bv, self.log
            )

            # Create disassembly JSON
            disassembly_json, errors = disass_analysis.get_json()

            for error in errors:
                self.errors.append(error)

            return disassembly_json

        except Exception as e:
            self.log_error(
                "Fatal error in disassembly extraction",
                function.name,
                function.start,
                e,
                "extract_disassembly",
            )
            return None

    def extract_hlil(self, function):
        """Extract HLIL from a function."""
        try:
            # Access function.hlil directly - this will either return the HLIL or raise an exception
            # Removed hlil_if_available check as it was causing race conditions
            if function.hlil is None:
                return None

            if len(function.hlil.basic_blocks) == 0:
                return None

            # if function has one basic block, then compare the len of the instructions against minimum of our functions
            if len(function.hlil.basic_blocks) == 1:
                block = function.basic_blocks[0]
                if len(list(block.disassembly_text)) < self.MIN_FUNCTION_SIZE:
                    return None

            # Get decompiled code
            function_prototype = str(function)
            decompiled_code = str(function.hlil)
            if not decompiled_code or decompiled_code.strip() == "":
                self.log.warning(f"Empty decompilation result for {function.name}")
                return None

            callers = []
            for caller_site in function.caller_sites:
                if caller_site.hlil:
                    callers.append(str(caller_site.hlil))

            calls = []
            for call in function.call_sites:
                if call.hlil:
                    calls.append(str(call.hlil))

            analysis_score = ObfuscationScores(function.hlil)
            flattened_score = analysis_score.flattened_score()
            mba_score = analysis_score.MBA_score()

            if decompiled_code:
                # Create json object
                function_json = {
                    "decompiled_function_hash": calculate_sha256(decompiled_code),
                    "decompiled_function": decompiled_code,
                    "decompiled_function_name": function.name,
                    "decompiled_function_prototype": function_prototype,
                    "decompiled_function_address": function.start,
                    "function_type": FunctionTypeAnalysis(function)
                    .get_function_type()
                    .name,
                    "functions_caller": list(callers),
                    "functions_call": list(calls),
                    "flattened_score": flattened_score,
                    "mba_score": mba_score,
                }
                return function_json
            else:
                return None

        except Exception as e:
            self.log.warning(
                f"Failed to get HLIL for {function.name} at {function.start}: {str(e)}"
            )

        return None

    def extract(self) -> bool:
        """Extract and process all analysis results.

        Returns:
            bool: True if extraction was successful, False otherwise

        """
        self.log.info(f"Starting binary analysis on {self.filepath}")
        try:
            results = self.analyze_binary()
            if not results:
                self.log.error("Analysis failed to produce results")
                return False

            self.analysis_results = results
            self.log.info(
                f"Successfully analyzed binary: {len(results['decompiled'])} decompiled functions, "
                f"{len(results['disassembled'])} disassembled functions, "
                #f"{len(results['cfg'])} basic blocks, "
                f"{len(results['errors'])} errors"
            )
            return True

        except Exception as e:
            self.log.error(f"Error in extraction: {str(e)}")
            return False

    def is_too_few_blocks(self, function):
        if function is None:
            return False

        if function.basic_blocks is None:
            return False

        # when binary ninja does not wait for the analysis, it creates function stubs where basic blocks array
        # is not populated yet. Therefore, we disable this heuristic.
        #if len(function.basic_blocks) == 0:
        #    return False

        # if function has one basic block, then compare the len of the instructions against minimum of our functions
        if len(function.basic_blocks) == 1:
            block = function.basic_blocks[0]
            if len(list(block.disassembly_text)) < self.MIN_FUNCTION_SIZE:
                return False

        return True

def is_lib_or_thunk(function):
    function_type = FunctionTypeAnalysis(function).get_function_type()
    return not (function_type == FunctionType.THUNK or function_type == FunctionType.EXTERNAL or function_type == FunctionType.LIBRARY)