Han Wu

257 papers A* 13A 5B 3C 7Misc 2Journal 171Unranked 55
YearRankTypeTitle / Venue / Authors
2026 J jnl
IEEE Internet Things J.
Lei Shi, Han Wu, Xu Ding, Hao Xu, Sinan Pan
2026 J jnl
Comput. Electron. Agric.
Han Wu, Liqun Liu
2026 J jnl
Neurocomputing
Guoqing Teng, Han Wu, Ao He, Yu Chen, Meng Zhao
2026 J jnl
IEEE Access
Han Wu, Ke Xu, Yuzhu Hu, Dechun Liu
2026 J jnl
Multim. Tools Appl.
Han Wu, Jiawei Li
2026 J jnl
IEEE Trans. Aerosp. Electron. Syst.
Yueyang Liu, Qinglei Hu, Qingyun Wang, Han Wu, Xiaodong Shao
2026 J jnl
Appl. Soft Comput.
Han Wu, Xiao-Zhi Gao, Zhong Li, Jia-Ni Heng, Pei Du
2026 J jnl
IEEE Internet Things J.
Han Wu, Haidong Shao, Xiao-Zhi Gao, Maode Yan, Jiani Heng, Zhong Li
2026 J jnl
CoRR
Qinxin Wu, Fucheng Niu, Hengchuan Zhu, Yifan Sun, Ye Shen, Xu Li, Han Wu, Leqi Liu, Zhiwen Pan, Zuozhu Liu, Fudong Zhu, Bin Feng
2026 J jnl
Pervasive Mob. Comput.
Guofan Sun, Jing Guo, Han Wu, Fei Qi
2026 J jnl
IEEE Internet Things J.
Yinan Zhao, Han Wu, Yingchun Li, Zhongqing Zhao, Wugang Meng, Zhaolin Zhang
2026 A conf
WSDM
Linus Aronsson, Han Wu, Morteza Haghir Chehreghani
2026 A* conf
AAAI
Yanming Sun, Runzhe Zhan, Chi Seng Cheang, Han Wu, Xuebo Liu, Yuyao Niu, Fengying Ye, Kaixin Lan, Lidia S. Chao, Derek F. Wong
2026 A* conf
AAAI
Haoning Jiang, Han Wu, Zhuoli Ouyang, Ziheng Wang, Tinghuan Chen, Junmin Jiang
2026 J jnl
J. Syst. Softw.
Haining Meng, Han Wu, Xiaoqing Li, Xinhong Hei
2026 J jnl
Neurocomputing
Yongcai Tao, Xuan Xie, Yucheng Shi, Lei Shi, Lin Wei, Yufei Gao, Han Wu
2026 conf
EuroMLSys@EuroSys
Jiawei Wang, Zilong Zhao, Leonardo Aniello, Han Wu
2026 J jnl
IEEE Trans. Ind. Electron.
Han Wu, Qinglei Hu, Jianying Zheng, Xiaodong Shao, Yueyang Liu, Dongyu Li
2026 J jnl
Comput. Mater. Continua
Qun Song, Chao Gao, Han Wu, Zhiheng Rao, Huafeng Qin, Simon Fong
2026 J jnl
CoRR
Jize Wang, Han Wu, Zhiyuan You, Yiming Song, Yijun Wang, Zifei Shan, Yining Li, Songyang Zhang, Xinyi Le, Cailian Chen, Xinping Guan, Dacheng Tao
2026 J jnl
IEEE Trans. Circuits Syst. II Express Briefs
Han Wu, Zheyu Yu, Zhihao Liu, Hui Chen, Cheng Ma, Shaobo Qu, Yanzheng Bai, Zebing Zhou
2026 J jnl
Inf. Fusion
Han Wu, Hao Sun, Kui Liu, Kefeng Ji, Gangyao Kuang
2026 J jnl
CoRR
Hefei Xu, Le Wu, Yu Wang, Min Hou, Han Wu, Zhen Zhang, Meng Wang
2025 J jnl
IEEE Trans. Instrum. Meas.
Han Wu, Yunhan Lin
2025 J jnl
J. Web Eng.
Han Wu, Shugong Zhou
2025 J jnl
IEEE Trans. Ind. Electron.
Tao Wang, Han Wu, Lijian Wu
2025 conf
ICPCSEE
Han Wu
2025 conf
ICPCSEE
Han Wu
2025 J jnl
Comput. Oper. Res.
Caiyun Yang, Yu Zhang, Junjie Wang, Lijun He, Han Wu
2025 J jnl
Expert Syst. J. Knowl. Eng.
Lei Shi, Han Wu, Xu Ding, Hao Xu, Sinan Pan
2025 J jnl
CoRR
Valter Schütz, Han Wu, Reza Rezvan, Linus Aronsson, Morteza Haghir Chehreghani
2025 J jnl
Expert Syst. Appl.
Han Wu, Yan Liang, Xiao Zhi Gao, Jia-Ni Heng, Pei Du
2025 J jnl
CoRR
Hao Liu, Le Wu, Min Hou, Han Wu, Kun Zhang, Xin Li, Si Wei
2025 J jnl
Knowl. Based Syst.
Han Wu, Xiao-Zhi Gao, Kang Li, Jia-Ni Heng
2025 J jnl
CoRR
Chenguang Xiao, Abhirup Ghosh, Han Wu, Shuo Wang, Diederick van Thiel
2025 J jnl
CoRR
Han Wu, Yanming Sun, Yunhe Yang, Derek F. Wong
2025 A* conf
USENIX Security Symposium
Shaowei Wang, Changyu Dong, Xiangfu Song, Jin Li, Zhili Zhou, Di Wang, Han Wu
2025 J jnl
Sci. China Inf. Sci.
Anchi Wan, Yingqing Wu, Shibo Zhang, Zhenyu Ye, Yongxin Liang, Siyuan Peng, Ke Liu, Ziwen Deng, Han Wu, ZiNan Wang
2025 J jnl
CoRR
Linus Aronsson, Han Wu, Morteza Haghir Chehreghani
2025 J jnl
CoRR
Lidi Zhang, Han Wu, Liyu Zhang, Ruofeng Liu, Haotian Wang, Chao Li, Desheng Zhang, Yunhuai Liu, Tian He
2025 C conf
CSCWD
Han Wu, Yunhan Lin, Yaojie Chen, Jianbo Li
2025 J jnl
IEEE Trans. Cybern.
Han Wu, Qinglei Hu, Jianying Zheng, Fei Dong, Zhenchao Ouyang, Dongyu Li
2025 J jnl
CoRR
Han Wu, Chong Wang, Zhiming Cui
2025 conf
ICIRA (3)
Donghan Liu, Haoran Zheng, Han Wu, Guochao Xu, Honghai Liu
2025 J jnl
CoRR
Han Wu, Hamdi Joudeh
2025 J jnl
CoRR
Yanming Sun, Runzhe Zhan, Chi Seng Cheang, Han Wu, Xuebo Liu, Yuyao Niu, Fengying Ye, Kaixin Lan, Lidia S. Chao, Derek F. Wong
2025 A* conf
ICLR
Han Wu, Sareh Rowlands, Johan Wahlström
2025 J jnl
IEEE Trans. Instrum. Meas.
Cheng Ma, Bin Mei, Yanzheng Bai, Shaobo Qu, Zhihao Liu, Han Wu, Ming Hu, Li Liu, Shuchao Wu, Jianbo Yu, Zebing Zhou
2025 conf
PRCV (18)
Rongbin Xiao, Changyu Dong, Jie Zhang, Yan Pang, Zihan Xie, Han Wu
2025 J jnl
Int. J. Digit. Earth
Shan He, Jilong Li, Han Wu, Tianjiao Cui
2025 J jnl
CoRR
Xianglai Yuan, Yichao Yao, Han Wu, Minyu Feng
2025 J jnl
IEEE Commun. Lett.
Qin Zhang, Han Wu, Hai Li, Zhengyu Song, Shujuan Hou
2025 J jnl
Secur. Saf.
Wentao Huang, Han Wu, Zeyu Li, Xiaqing Xie, Qingfeng Zhang, Xuebin Wang, Jiapeng Zhao, Jinqiao Shi
2025 J jnl
Appl. Math. Lett.
Han Wu, Dongke Sun, Wei Chen, Qingguo Fei
2025 J jnl
CoRR
Jiaxiu Jiang, Wenbo Li, Jingjing Ren, Yuping Qiu, Yong Guo, Xiaogang Xu, Han Wu, Wangmeng Zuo
2025 J jnl
Comput. Intell.
Jingyu Liu, Honghua Wang, Jialing Wang, Han Wu, Yifei Xu, Tao Zhang, Guangfeng Zhou
2025 J jnl
IEEE Trans. Instrum. Meas.
Han Wu, Yinan Zhao, Yuying Zhu, Zhaoting Liu
2025 J jnl
CoRR
Timo Sprekeler, Han Wu, Zhiwen Zhang
2025 J jnl
CoRR
Han Wu, Junyao Li, Kangbo Zhao, Sen Zhang, Yukai Shi, Liang Lin
2025 J jnl
Interact. Learn. Environ.
Lishan Zhang, Shuwen Wang, Han Wu, Sixv Zhang, Min Xv, Lili Liu, Yan Shu
2025 A conf
IROS
Rui Yang, Han Wu, Jianying Zheng, Xinyu Wang, Qinglei Hu
2025 J jnl
J. Comput. Graph. Stat.
Erik Sverdrup, Han Wu, Susan Athey, Stefan Wager
2025 J jnl
Comput. Geosci.
Kaili Liu, Jianmeng Sun, Han Wu, Xin Luo, Fujing Sun
2025 J jnl
IEEE Trans. Syst. Man Cybern. Syst.
Jinhuan Wang, Han Wu
2025 J jnl
Expert Syst. Appl.
Pei Du, Yuxin Ye, Han Wu, Jianzhou Wang
2025 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Han Wu, Hao Sun, Kefeng Ji, Gangyao Kuang
2025 J jnl
Sci. China Inf. Sci.
Longqun Ni, Yifei Qi, Xingyu Bao, Jing Zhang, Pan Wang, Han Wu, ZiNan Wang
2025 J jnl
IEEE Trans Autom. Sci. Eng.
Jinhuan Wang, Min Liu, Han Wu
2025 J jnl
CoRR
Jie Yin, Ke Sun, Han Wu
2025 J jnl
Biomed. Signal Process. Control.
Yugen Yi, Xuan Wu, Yi He, Han Wu, Bin Zhou, Siwei Luo, Jiangyan Dai, Yingkui Du, Wei Zhou
2024 conf
CICC
Wei He, Puvi Bai, Hongyang Luo, Zhenghao Jin, Han Wu, Junyi Zhang, Xingchen Chao, Haiqi Liu, Yajuan He, Qiang Li
2024 conf
ISSCC
Gang Liu, Han Wu, Chen Hu, Cheng Huang, Xun Liu, Junmin Jiang
2024 conf
EMBC
Jeremiasz Dados, Rylee Faherty, Gabrielle Summers, Han Wu, Kaitlyn Burstiner, Adam Khalifa
2024 J jnl
Sensors
Haoyan Xu, Guangyao Zhang, Wensheng Wang, Chenrui Sun, Hanyu Wang, Han Wu, Zhuangzhi Sun
2024 J jnl
IEEE Trans. Artif. Intell.
Han Wu, Sareh Rowlands, Johan Wahlström
2024 J jnl
IEEE Access
Changzhong Chen, Dahai Shu, Xie Leng, Haijun Long, Han Wu
2024 J jnl
CoRR
Chaoxiong Ma, Yan Liang, Xinyu Yang, Han Wu, Huixia Zhang
2024 J jnl
Comput. Electron. Agric.
Yunting Liang, Huifen Li, Han Wu, Yinwei Zhao, Zhijie Liu, Dong Liu, Zongru Liu, Gangao Fan, Zhaoyang Pan, Zhuo Shen, Jia Lv, Jiyu Li
2024 conf
M2VIP
Boran Wang, Han Wu
2024 conf
EMBC
Han Wu, Yufei Cai, Haolun Wu, Sultan Mahmud, Ali Nezaratizadeh, Adam Khalifa
2024 J jnl
IEEE Trans. Ind. Informatics
Sitong Lu, Jian Jiao, Xin Li, Haibo Wang, Han Wu, Qiang Li
2024 J jnl
CoRR
Lishan Zhang, Han Wu, Xiaoshan Huang, Tengfei Duan, Hanxiang Du
2024 J jnl
Expert Syst. Appl.
Han Wu, Yan Liang, Xiao Zhi Gao, Jia-Ni Heng
2024 J jnl
Comput. Commun.
Xu Jia, Han Wu, Ruochen Zhang, Min Peng
2024 J jnl
CoRR
Jiahui Gao, Renjie Pi, Tianyang Han, Han Wu, Lanqing Hong, Lingpeng Kong, Xin Jiang, Zhenguo Li
2024 J jnl
IEEE Trans. Geosci. Remote. Sens.
Shukui Zhang, Shaoping Lu, Mauricio D. Sacchi, Xintong Dong, Han Wu, Tie Zhong
2024 J jnl
IEEE Access
Xinghua Huang, Yuanliang Fan, Han Wu, Gonglin Zhang, Zili Yin, Muhammad Yasir Ali Khan, Haoming Liu, Jingjing Zhai
2024 J jnl
Intell. Decis. Technol.
Qin Zhang, Han Wu, Chi Ma, Yuebin Wang, Xiangyang Zheng
2024 J jnl
Comput. Ind. Eng.
Danlu Zhang, Han Wu, Feng Li, Yi Song
2024 J jnl
Cybersecur.
Chao An, Yuting Xiao, HaiHang Liu, Han Wu, Rui Zhang
2024 conf
ICCCV
Chunxiao Han, Boyang Chen, Han Wu
2024 A* conf
CVPR
Han Wu, Guanyan Ou, Weibin Wu, Zibin Zheng
2024 J jnl
IEEE Trans. Geosci. Remote. Sens.
Han Wu, Shukui Zhang, Xintong Dong, Hejun Zhu, Shaoping Lu
2024 J jnl
Microelectron. J.
Xiaolin Li, Jianguo Xie, Liwei Xu, Han Wu, Rui Shi, Huamin Feng
2024 A* conf
EMNLP
Shun Wang, Ge Zhang, Han Wu, Tyler Loakman, Wenhao Huang, Chenghua Lin
2024 J jnl
CoRR
Shun Wang, Ge Zhang, Han Wu, Tyler Loakman, Wenhao Huang, Chenghua Lin
2024 J jnl
Eng. Appl. Artif. Intell.
Yaqing Bo, Han Wu, Weifan Che, Zeyu Zhang, Xiangrong Li, Leonid Myagkov
2024 J jnl
CoRR
Rui Xiao, Jiong Wang, Lu Han, Na Zong, Han Wu
2024 J jnl
IEEE Trans. Multim.
Cidan Shi, Lihuang Fang, Han Wu, Xiaoyu Xian, Yukai Shi, Liang Lin
2024 J jnl
CoRR
Cidan Shi, Lihuang Fang, Han Wu, Xiaoyu Xian, Yukai Shi, Liang Lin
2024 J jnl
Sci. China Inf. Sci.
Han Wu, Jinhuan Wang
2024 J jnl
Sci. China Inf. Sci.
Shengtao Lin, ZiNan Wang, Jiaojiao Zhang, Pan Wang, Han Wu, Yifei Qi
2024 J jnl
Neural Comput. Appl.
Han Wu, Bo Zhao, Guizhong Liu
2024 J jnl
IEEE Trans. Geosci. Remote. Sens.
Yahao Lu, Yupei Lin, Han Wu, Xiaoyu Xian, Yukai Shi, Liang Lin
2024 J jnl
CoRR
Yahao Lu, Yupei Lin, Han Wu, Xiaoyu Xian, Yukai Shi, Liang Lin
2024 J jnl
IEEE Trans. Instrum. Meas.
Bing Han, Yuxi Ma, Yong Zhao, Han Wu
2024 conf
WASA (1)
Han Wu, Lei Shi, Junyu Ye, Yuqi Fan, Zengwei Lv
2024 B conf
IJCNN
Han Wu, Haotian Feng, Lida Shi, Hongda Zhang, Hao Xu
2024 J jnl
IEEE Trans. Mob. Comput.
Jie Ying, Tiantian Zhu, Qiang Liu, Chunlin Xiong, Zhengqiu Weng, Tieming Chen, Lei Fu, Mingqi Lv, Han Wu, Ting Wang, Yan Chen
2024 A* conf
ICDE
Jiexi Zhan, Han Wu, Peng Cheng, Libin Zheng, Lei Chen, Chen Jason Zhang, Xuemin Lin, Wenjie Zhang
2023 J jnl
IEEE Trans. Circuits Syst. II Express Briefs
Yifan Jiang, Chen Hu, Han Wu, Yan Lu, Xun Liu, Junmin Jiang
2023 J jnl
IEEE Access
Yishan Chen, Jianhua Luo, Xinhua Zhu, Han Wu, Shangbo Yuan
2023 C conf
IECON
Xiangzheng Sima, Fanqiang Gao, Zixin Li, Cong Zhao, Fei Xu, Yaohua Li, Han Wu
2023 conf
ICPCSEE (2)
Han Wu
2023 conf
ICEME
Han Wu, Ying Zhan
2023 C conf
IV
Han Wu, Syed Yunas, Sareh Rowlands, Wenjie Ruan, Johan Wahlström
2023 C conf
IV
Han Wu, Syed Yunas, Sareh Rowlands, Wenjie Ruan, Johan Wahlström
2023 J jnl
Entropy
Liwei Xu, Han Wu, Jianguo Xie, Qiong Yuan, Ying Sun, Guozhen Shi, Shoushan Luo
2023 J jnl
Sci. China Inf. Sci.
Bo Hu, Han Wu, Kan Tian, Houkun Liang
2023 A* conf
KDD
Kevin Han, Shuangning Li, Jialiang Mao, Han Wu
2023 conf
CHI Extended Abstracts
Lili Liu, Lishan Zhang, Yan Shu, Shuwen Wang, Han Wu, Min Xv
2023 J jnl
Inf. Sci.
Jiahao Nie, Zhekang Dong, Zhiwei He, Han Wu, Mingyu Gao
2023 C conf
SEKE
Junfeng Zhao, Wenhui Gai, Han Wu
2023 J jnl
IEEE Geosci. Remote. Sens. Lett.
Han Wu, Zhiwei He, Mingyu Gao
2023 J jnl
Expert Syst. Appl.
Han Wu, Yan Liang, Xiaozhi Gao, Pei Du, Shu-Pan Li
2023 conf
ICANN (7)
Jing Zhou, Han Wu
2023 J jnl
IEEE Trans. Artif. Intell.
Han Wu, Wenjie Ruan, Jiangtao Wang, Dingchang Zheng, Bei Liu, Yayuan Geng, Xiangfei Chai, Jian Chen, Kunwei Li, Shaolin Li, Sumi Helal
2023 J jnl
Neural Comput. Appl.
Han Wu, Jiahao Nie, Ziming Zhu, Zhiwei He, Mingyu Gao
2023 J jnl
IEEE Trans. Geosci. Remote. Sens.
Han Wu, Shaoping Lu, Xintong Dong, XiaoFan Deng, Rui Gao
2023 J jnl
IEEE Trans. Geosci. Remote. Sens.
Han Wu, Xintong Dong, Tie Zhong, Shukui Zhang, Shaoping Lu
2023 J jnl
J. Supercomput.
Han Wu, Jiahao Nie, Ziming Zhu, Zhiwei He, Mingyu Gao
2023 J jnl
Sensors
Qian Zhao, Chang Liu, Yanjiao Chang, Han Wu, Yihao Hou, Siyang Wu, Mingzhuo Guo
2023 A conf
WSDM
Senrong Xu, Liangyue Li, Yuan Yao, Zulong Chen, Han Wu, Quan Lu, Hanghang Tong
2023 C conf
IECON
Xu Wu, Fei Xu, Zixin Li, Liming Shi, Yaohua Li, Chengtang Deng, Han Wu
2023 J jnl
Neurocomputing
Chaofeng Ji, Han Wu, Guizhong Liu
2023 conf
ICISCAE
Yuyu Sun, Han Wu, Ding Yao
2023 J jnl
Remote. Sens.
Ling Huang, Han Wu, Yidong Lou, Hongping Zhang, Lilong Liu, Liangke Huang
2022 J jnl
Symmetry
Han Wu, Zhendong Wu
2022 J jnl
Entropy
Yongsheng Hu, Han Wu, Luoyu Zhou
2022 conf
ICPCSEE (2)
Han Wu
2022 J jnl
Vis. Comput.
Chenjie Du, Zhongping Ji, Zhekang Dong, Han Wu, Mingyu Gao, Zhiwei He
2022 J jnl
CoRR
Han Wu, Syed Yunas, Sareh Rowlands, Wenjie Ruan, Johan Wahlström
2022 J jnl
IEEE Trans. Learn. Technol.
Xinhua Zhu, Han Wu, Lanfang Zhang
2022 J jnl
Microelectron. J.
Liwei Xu, Han Wu, Jianguo Xie, Jing Liu, Qiong Yuan, Shengwei Xu, Xiaoming Chen, Shoushan Luo, Huamin Feng
2022 A* conf
ICDE
Han Wu, Hongzhe Zhang, Liangyue Li, Zulong Chen, Fanwei Zhu, Xiao Fang
2022 J jnl
IEEE Geosci. Remote. Sens. Lett.
Huina Song, Han Wu, Mengyuan Wang, Jiayi Cao, Junliang Xie, Yingcheng Ding, Hua Zhong
2022 J jnl
CoRR
Han Wu, Sareh Rowlands, Johan Wahlström
2022 J jnl
Neurocomputing
Han Wu, Chunfeng Song, Shaolong Yue, Zhenyu Wang, Jun Xiao, Yanyang Liu
2022 J jnl
IEEE Access
Han Wu, Yu Chen, Liping Wang, Guojie Ma
2022 J jnl
CoRR
Kevin Wu Han, Han Wu
2022 J jnl
Remote. Sens.
Han Wu, Huina Song, Jianhua Huang, Hua Zhong, Ronghui Zhan, Xuyang Teng, Zhaoyang Qiu, Meilin He, Jiayi Cao
2022 J jnl
IEEE Access
Hua Zhong, Jianhua Huang, Mengyuan Wang, Han Wu, Yingcheng Ding, Hao Nai, Jiunan Dong, Shenghao Zhang
2022 J jnl
IEEE J. Emerg. Sel. Topics Circuits Syst.
Hailiang Xu, Han Wu, Zhi Li, Qingzeng Yan, Frede Blaabjerg
2022 J jnl
Expert Syst. Appl.
Han Wu, Yan Liang, Junyi Zuo
2022 A* conf
KDD
Han Wu, Sarah Tan, Weiwei Li, Mia Garrard, Adam Obeng, Drew Dimmery, Shaun Singh, Hanson Wang, Daniel R. Jiang, Eytan Bakshy
2022 J jnl
CoRR
Jiahao Nie, Han Wu, Zhiwei He, Yuxiang Yang, Mingyu Gao, Zhekang Dong
2022 J jnl
Sensors
Ziming Zhu, Jiahao Nie, Han Wu, Zhiwei He, Mingyu Gao
2022 J jnl
CoRR
Han Wu, Sareh Rowlands, Johan Wahlström
2022 J jnl
Remote. Sens.
Han Wu, Jiahao Nie, Zhiwei He, Ziming Zhu, Mingyu Gao
2022 J jnl
CoRR
Han Wu, Stefan Wager
2022 A conf
UAI
Han Wu, Stefan Wager
2022 J jnl
Appl. Intell.
Jiayu Liang, Ludi Zheng, Han Wu, Yu Xue
2022 conf
CSAI
Han Wu, Jian Jia, Rui Zhang
2022 J jnl
Multim. Tools Appl.
Han Wu, Guizhong Liu
2022 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Jiahao Nie, Han Wu, Zhiwei He, Mingyu Gao, Zhekang Dong
2022 A* conf
EC
Han Wu, Stefan Wager
2022 J jnl
CoRR
Han Wu, Stefan Wager
2021 J jnl
IEEE Access
Guanghe Wang, Xiang Lei, Han Wu, Kai Sun, Lijun Wang, Yi Ding, Che Wang
2021 conf
ICONIP (4)
Han Wu, Xiaowang Zhang, Jiachen Tian, Shaojuan Wu, Chunliu Dou, Yue Sun, Zhiyong Feng
2021 J jnl
IEEE Trans. Ind. Electron.
Lingxiang Zheng, Han Wu, Lin Yang, Yonghua Lao, Qinyong Lin, Rongqian Yang
2021 J jnl
IEEE Access
Yuanliang Fan, Luebin Fang, Mengran Xu, Han Wu, Zheng Zhou, Bingqian Liu, Shuang Lin, Yu Wang
2021 J jnl
CoRR
Han Wu, Wenjie Ruan
2021 conf
AIAM (ACM)
Cuiping Wu, Liaokun Ye, Han Wu
2021 J jnl
IEICE Electron. Express
Hanxiang Wang, Changchun Chai, Yuqian Liu, Han Wu, Wei Zhang, Fuxing Li, Yintang Yang
2021 J jnl
Ann. Oper. Res.
Feng Li, Han Wu, Qingyuan Zhu, Liang Liang, Gang Kou
2021 J jnl
IEEE Trans. Intell. Transp. Syst.
Yougang Sun, Junqi Xu, Han Wu, Guobin Lin, Shahid Mumtaz
2021 J jnl
Microelectron. J.
Han Wu, Zhizhen Yin, Jianguo Xie, Peng Ding, Peihua Liu, Helun Song, Xiaoming Chen, Shu Xu, Wei Liu, Yaohui Zhang
2021 conf
EITCE
Han Wu, Juan Yan, Huibin Yang
2021 J jnl
CoRR
Han Wu, Sarah Tan, Weiwei Li, Mia Garrard, Adam Obeng, Drew Dimmery, Shaun Singh, Hanson Wang, Daniel R. Jiang, Eytan Bakshy
2021 J jnl
IEEE Access
Xu Wei, Jiyu Li, Bo Long, Xiaodan Hu, Han Wu, Huifen Li
2021 J jnl
Manag. Sci.
Ole-Kristian Hope, Yi Li, Qiliang Liu, Han Wu
2021 J jnl
Eng. Comput.
Han Wu, Hu Liu
2021
Han Wu
2021 conf
ICNSC
Xuefei Wu, Han Wu, Bo Xin, Chunlin Chen
2021 A conf
CIKM
Maocheng Li, Jiachuan Wang, Libin Zheng, Han Wu, Peng Cheng, Lei Chen, Xuemin Lin
2021 J jnl
CoRR
Maocheng Li, Jiachuan Wang, Libin Zheng, Han Wu, Peng Cheng, Lei Chen, Xuemin Lin
2021 conf
EEET
Bingyao Zheng, Fang Guo, An Wen, Tianliu Wei, Han Wu, Miaoxian Zhou, Ruiyang Wang, Gunagshan Huang
2021 conf
AIAM (ACM)
Han Wu, Cheng He, Yunfeng Zhang
2021 J jnl
J. Comput. Civ. Eng.
Zhenghua Zhang, Guoliang Chen, Xuan Wang, Han Wu
2021 J jnl
Complex.
Shengmin Wang, Jun Fang, Lanjun Liu, Han Wu
2021 conf
BIC
Yuyang Miao, Xinyu Lou, Han Wu
2020 conf
CVPR Workshops
Han Wu, Weiqiang Li, Wanqi Li, Guizhong Liu
2020 J jnl
J. Netw. Comput. Appl.
Zhendong Wu, Jingjing Wang, Liqin Hu, Zhang Zhang, Han Wu
2020 conf
WISE (2)
Han Wu, Xiaoling Wang, Xingjian Lu
2020 conf
ICSPCC
Han Wu, Yujun Wang, Peng Chen, Haoqiu Shi, Tao Wu
2020 J jnl
Database J. Biol. Databases Curation
Kelie Chen, Dexin Yang, Fan Zhao, Shengchao Wang, Yao Ye, Wenjie Sun, Haohua Lu, Zhi Ruan, Jinming Xu, Tianru Wang, Guang Lu, Liming Wang, Yu Shi, Honghe Zhang, Han Wu, Weiguo Lu, Han-Ming Shen, Dajing Xia, Yihua Wu
2020 J jnl
IEEE Access
Haijun Yu, Hongliang Dai, Guangdong Tian, Yinghao Xie, Benben Wu, Ying Zhu, Hongliang Li, Han Wu
2020 J jnl
CoRR
Wangze Ni, Han Wu, Peng Cheng, Lei Chen, Xuemin Lin, Lei Chen, Xin Lai, Xiao Zhang
2020 J jnl
IEEE Access
Han Wu, Honglei An, Qing Wei, Hongxu Ma
2020 J jnl
Int. J. Perform. Eng.
Rui Yang, Yanzhou Sun, Han Wu, Xiaolin Zhang
2020 J jnl
CoRR
Han Wu, Wenjie Ruan, Jiangtao Wang, Dingchang Zheng, Shaolin Li, Jian Chen, Kunwei Li, Xiangfei Chai, Sumi Helal
2020 J jnl
J. Intell. Fuzzy Syst.
Xiangtian Nie, Tianyu Fan, Bo Wang, Han Wu
2020 J jnl
Appl. Intell.
Wenjie Zhu, Bo Peng, Han Wu, Binhao Wang
2020 conf
ICIT
Qing Liu, Qinqian Li, Zhigang Li, Han Wu
2020 J jnl
Int. J. Mechatronics Autom.
Han Wu, Zhengping Wang, Zhou Zhou, Jieyu Jia, Rui Wang
2020 J jnl
CoRR
Han Wu, Zhi Yan
2019 A* conf
ICDM
Han Wu, Guanjun Liu
2019 J jnl
J. Medical Syst.
Han Wu, Qinyong Lin, Rongqian Yang, Yuan Zhou, Lingxiang Zheng, Yueshan Huang, Zhigang Wang, Yonghua Lao, Jinhua Huang
2019 J jnl
J. Frankl. Inst.
Changfan Zhang, Zhenzhen Lin, Jianhua Liu, Jing He, Han Wu, Peng Li
2019 conf
ICCV Workshops
Han Wu, Xueyuan Yang, Yong Yang, Guizhong Liu
2019 J jnl
CoRR
Han Wu, Xueyuan Yang, Yong Yang, Guizhong Liu
2019 J jnl
IEEE Access
Manyuan Ye, Le Chen, Lixuan Kang, Song Li, Junfei Zhang, Han Wu
2019 conf
ROBIO
Fei Wang, Lignzhou Yu, Han Wu, Ketao Shi
2019 J jnl
IEEE Access
Manyuan Ye, Junfei Zhang, Le Chen, Lixuan Kang, Han Wu, Song Li
2019 conf
ISSRE Workshops
Han Wu
2019 J jnl
IEEE Access
Wanjun Lin, Junpeng Zhu, Yue Yuan, Han Wu
2019 J jnl
IEEE Trans. Ind. Electron.
Jun Yang, Han Wu, Liang Hu, Shihua Li
2019 J jnl
Sensors
Jiyong Li, Hai Huang, Yang Xu, Han Wu, Lei Wan
2019 J jnl
IEICE Electron. Express
Yang Li, Changchun Chai, Yuqian Liu, Yun Li, Han Wu, Wei Zhang, Fuxing Li, Yintang Yang
2019 conf
ICCV Workshops
Dawei Du, Yue Zhang, Liefeng Bo, Hailin Shi, Rui Zhu, Bo Han, Chunhui Zhang, Guizhong Liu, Han Wu, Hao Wen, Haoran Wang, Pengfei Zhu, Jiaqing Fan, Jie Chen, Jie Gao, Jie Zhang, Jinghao Zhou, Jinliu Zhou, Jinwang Wang, Jiuqing Wan, Josef Kittler, Kaihua Zhang, Longyin Wen, Kaiqi Huang, Kang Yang, Kangkai Zhang, Lianghua Huang, Lijun Zhou, Lingling Shi, Lu Ding, Ning Wang, Peng Wang, Qintao Hu, Xiao Bian, Robert Laganière, Ruiyan Ma, Ruohan Zhang, Shanrong Zou, Shengwei Zhao, Shengyang Li, Shengyin Zhu, Shikun Li, Shiming Ge, Shiyu Xuan, Haibin Ling, Tianyang Xu, Ting He, Wei Shi, Wei Song, Weiming Hu, Wenhua Zhang, Wenjun Zhu, Xi Yu, Xianhai Wang, Xiaojun Wu, Qinghua Hu, Xiaotong Li, Xiaoxue Li, Xiaoyue Yin, Xin Zhang, Xin Zhao, Xizhe Xue, Xu Lei, Xueyuan Yang, Yanjie Gao, Yanyun Zhao, Jiayu Zheng, Yinda Xu, Ying Li, Yong Wang, Yong Yang, Yuting Yang, Yuxuan Li, Zeyu Wang, Zhenhua Feng, Zhipeng Zhang, Zhiyong Yu, Tao Peng, Zhizhao Duan, Zhuojin Sun, Xinyao Wang
2018 J jnl
Comput. Aided Civ. Infrastructure Eng.
Yichi Zhang, Denghua Zhong, Binping Wu, Tao Guan, Pan Yue, Han Wu
2018 J jnl
IEEE Trans. Robotics
Xian Wang, Mengxi Luo, Han Wu, Zhuoran Zhang, Jun Liu, Zhensong Xu, Wesley Johnson, Yu Sun
2018 J jnl
J. Inf. Hiding Multim. Signal Process.
Zhengquan Cai, Shujuan Zhu, Huihuang Xie, Rongjin Zheng, Jianye Huang, Han Wu
2018 J jnl
IEEE Access
Han Wu, Qingyang Meng, Jiaqi Li, Bing Han, ZiNan Wang, Yunjiang Rao
2018 conf
APCCAS
Yang Chen, Xu Yan, Han Wu, Liguo Sun
2017 B conf
ICPADS
Wenliang Liu, Han Wu, ZhenMing Li, Guoyue Zhang, Donglian Qi
2017 conf
EIDWT
Weiwei Shen, Han Wu, He Xu, Peng Li
2017 conf
SmartCloud
Han Wu, Yongxin Zhu, Chang Wang, Junjie Hou, Mengjun Li, Qixuan Xue, Kedun Mao
2017 conf
SmartCloud
Qixuan Xue, Yongxin Zhu, Yajie Wang, Kedun Mao, Han Wu, Mengjun Li, Yishu Mao, Junjie Hou
2017 conf
SmartCloud
Kedun Mao, Yongxin Zhu, Zhixiong Chen, Xiang Tao, Qixuan Xue, Han Wu, Yishu Mao, Junjie Hou
2017 conf
ICONIP (1)
Yunxiao Shi, Xiangnan He, Han Wu, Zhong-Xiao Jin, Wenlian Lu
2017 conf
SmartCloud
Junjie Hou, Yongxin Zhu, Yulan Shen, Mengjun Li, Han Wu, Han Song
2017 conf
ICSPCC
Zuofu Wang, Han Wu, Shengxing Liu
2017 conf
CSCloud
Junjie Hou, Yongxin Zhu, Yulan Shen, Mengjun Li, Qian Wu, Han Wu
2017 conf
HPCC/SmartCity/DSS
Han Song, Yongxin Zhu, Junjie Hou, Han Wu, Long Li, Qian Wang, Meikang Qiu
2017 J jnl
IEEE Access
Changfan Zhang, Mangang Niu, Jing He, Kai-Hui Zhao, Han Wu, Miaoying Zhang
2017 conf
HPCC/SmartCity/DSS
Junjie Hou, Yongxin Zhu, Yulan Shen, Mengjun Li, Han Wu, Han Song
2017 A* conf
ICRA
Xian Wang, Mengxi Luo, Han Wu, Zhuoran Zhang, Jun Liu, Zhensong Xu, Wesley Johnson, Yu Sun
2016 conf
ChinaCom (2)
Feng Liu, Han Wu, Xiaoshen Xu
2016 conf
ICIC (1)
Han Wu, Bingqing Luo, Zhixin Sun
2016 conf
IEEE SENSORS
Hua Yu, Han Wu
2016 C conf
ISM
Han Wu, Xiangwei Kong, Hongxue Yang, Ying Li
2016 conf
IGSC
Songxi Liu, Qinghua Wang, Han Wu, Yuanliang Fan, Hui Peng, Gonglin Zhang, Haibo Pen
2016 conf
ICLS
Qijie Cai, Han Wu, Bodong Chen
2015 conf
ChinaSIP
Han Wu, Xiangwei Kong, Shize Shang
2015 J jnl
J. Frankl. Inst.
Changfan Zhang, Han Wu, Jing He, Chengjie Xu
2015 J jnl
Signal Process.
Han Wu, Chunping Hou, Hua Chen, Wei Liu, Qing Wang
2015 conf
ROBIO
Xianpeng Zhang, Honglei An, Han Wu, Hongxu Ma
2014 conf
OFC
Fei Peng, Zheng-Pu Peng, Xin-Hong Jia, Yunjiang Rao, ZiNan Wang, Han Wu
2014 J jnl
Ann. Oper. Res.
Jun Zhuang, Gregory D. Saxton, Han Wu
2013 J jnl
Comput. Geosci.
Jun-Ting Qiu, Wan-Jiao Song, Cheng-Xin Jiang, Han Wu, Raymond M. Dong
2013 Misc conf
ICIG
Hui Zeng, Baoqing Zhang, Zhichun Mu, Han Wu, Xiuqing Wang
2013 Misc conf
WSC
Han Wu, Gerald W. Evans, Sunderesh S. Heragu, Keith Rhinehart
2012 B conf
SMC
Yingbing Yu, Han Wu
2011 conf
CCTA (2)
Hanming He, Lei Yang, Liming Fan, Lihua Zhao, Han Wu, Jing Yang, Chengyun Li
2009 conf
IFIP CAI
Cunyou Zhao, Dongyan Shi, Han Wu
2007 J jnl
Int. J. Manuf. Res.
Dewi Rahardja, Yan D. Zhao, Han Wu
redb/extractors/decompiler/DecompileBinja.py
← Index redb/extractors/decompiler/DecompileBinja.py python
import hashlib
import inspect
import json
import logging
import os
import signal
import time
from datetime import datetime, timezone
from typing import Dict, Any, Optional
from pathlib import Path
import subprocess
import sys

from redb.extractors.enum import Tag
from redb.extractors.extractor import Extractor
import magic
import pefile
from elftools.elf.elffile import ELFFile

# Import our BinjaDecompiler (conditional)
from redb.extractors.decompiler.bninja.decompiler import BinaryNinjaDecompiler

class DecompileBinja(Extractor):
    def __init__(
        self,
        filepath,
        log,
        exporters=None,
        index_prefix=None,
        elastic_index=None,
        known_benign=False,
        known_malicious=False,
        filetype=None,
        decompile_modules=None,
    ):
        super().__init__(
            filepath,
            log,
            exporters,
            index_prefix,
            elastic_index,
            known_benign,
            known_malicious,
        )
        self.log.debug(inspect.currentframe().f_code.co_name)

        # Check if Binary Ninja is available
       # if not BINARYNINJA_AVAILABLE:
        #     self.log.error("Binary Ninja is not available in this container")
        #    raise ImportError(
        #        "Binary Ninja module not found - not available in feature extraction container"
        #    )
        self.analysis_results = None
        self.binja_decompiler = None
        self.filetype = filetype
        self.decompile_modules = decompile_modules or {"all"}
        self.goresym_data = None
        self.goresym_output_path = None

        # Convert TIMEOUT to integer with a default of 1200 seconds (20 minutes)
        try:
            self.BINJA_TIMEOUT = int(os.getenv("BINJA_TIMEOUT", "1200"))
        except ValueError:
            self.log.warning(
                "Invalid BINJA_TIMEOUT value, using default of 1200 seconds"
            )
            self.BINJA_TIMEOUT = 1200

        # Convert TIMEOUT to integer with a default of 1200 seconds (20 minutes)
        try:
            self.DECOMPILE_EXTRACTOR_TIMEOUT = int(
                os.getenv("DECOMPILE_EXTRACTOR_TIMEOUT", "2580")
            )
        except ValueError:
            self.log.warning(
                "Invalid DECOMPILE_EXTRACTOR_TIMEOUT value, using default of 2580 seconds"
            )
            self.DECOMPILE_EXTRACTOR_TIMEOUT = 2580

    def __enter__(self):
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.cleanup_run()

    def calculate_md5(self, input_str):
        """Calculate MD5 hash of a string."""
        return hashlib.md5(input_str.encode("utf-8")).hexdigest()

    def is_dotnet(self):
        """Check if the binary is a .NET assembly.

        Returns:
            bool: True if the file is a .NET assembly, False otherwise
        """
        try:
            if self.filetype == "pebin":
                file_type = magic.from_buffer(self.binary)
                if ".Net" in file_type:
                    return True
                pe = pefile.PE(self.filepath)
                for entry in pe.OPTIONAL_HEADER.DATA_DIRECTORY:
                    # IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR is typically 14
                    if (
                        entry.name == "IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR"
                        and entry.Size > 0
                    ):
                        return True
                return False
            return False
        except AttributeError as e:
            self.log.error(
                f"AttributeError error dotnet file {self.hash.sha256} Full error : {e}"
            )
            return False

    def is_golang(self):
        """Check if the binary is a Go-compiled binary (heuristic).

        Supports PE and ELF binaries.
        """
        try:
            if self.filetype == "pebin":
                pe = pefile.PE(self.filepath)
                signatures = [b"Go build ID:", b"runtime.main", b"main.main"]

                for section in pe.sections:
                    data = section.get_data()
                    if any(sig in data for sig in signatures):
                        return True

                return False

            elif self.filetype == "elf":
                with open(self.filepath, "rb") as f:
                    elf = ELFFile(f)

                    # 1. Section-based checks
                    section_names = [sec.name for sec in elf.iter_sections()]
                    if any(
                        s in section_names
                        for s in (".note.go.buildid", ".gopclntab")
                    ):
                        return True

                    # 2. String scan in loadable sections
                    signatures = [
                        b"Go build ID:",
                        b"runtime.main",
                        b"runtime.goexit",
                        b"runtime.morestack",
                        b"main.main",
                    ]

                    for sec in elf.iter_sections():
                        if sec["sh_flags"] & 0x2:  # SHF_ALLOC
                            data = sec.data()
                            if any(sig in data for sig in signatures):
                                return True

                return False

            return False

        except Exception as e:
            self.log.error(
                f"Golang detection error {self.hash.sha256}: {e}"
            )
            return False

    def cleanup_run(self):
        """Clean up after analysis."""
        try:
            # BinaryNinjaDecompiler uses context manager pattern (__enter__/__exit__)
            # Cleanup happens automatically when exiting the 'with' block
            self.binja_decompiler = None

            # Clean up goresym temp file if it exists (keep in debug mode)
            if self.goresym_output_path and os.path.exists(self.goresym_output_path):
                if self.log.isEnabledFor(logging.DEBUG):
                    self.log.debug(f"Debug mode: keeping goresym output at {self.goresym_output_path}")
                else:
                    os.remove(self.goresym_output_path)
                    self.goresym_output_path = None

            # Force garbage collection
            import gc

            gc.collect()

        except Exception as e:
            self.log.error(f"Error in cleanup: {e}")

    def run_goresym(self, binary_path, output_json_path):
        """
            Run goresym on a Go binary and export its JSON output to a file.
            binary_path: path to the Go binary to analyze
            output_json_path: path where the JSON output will be saved
            """
        binary_path = str(Path(binary_path).resolve())
        output_json_path = str(Path(output_json_path).resolve())
        goresym_path = os.getenv("GORESYM_PATH", "GoReSym")

        try:
            # Example: goresym -t json /path/to/binary
            self.log.info("DEBUG: starting GoReSym")
            result = subprocess.run(
                [goresym_path, binary_path],
                stdout=subprocess.PIPE,
                stderr=subprocess.PIPE,
                text=True,
            )
        except FileNotFoundError:
            self.log.error("Error: 'goresym' not found in PATH. Make sure it is installed.")
            raise
        except subprocess.CalledProcessError as e:
            self.log.error("Error during goresym execution:")
            self.log.error(e.stderr)


        # Assuming goresym emits valid JSON to stdout.
        try:
            parsed = json.loads(result.stdout)
            # Store parsed JSON for later export to ClickHouse
            self.goresym_data = parsed
        except json.JSONDecodeError:
            # If it's not valid JSON, save the raw output instead.
            self.log.error("Warning: goresym output is not valid JSON; saving raw.")
            with open(output_json_path, "w", encoding="utf-8") as f:
                f.write(result.stdout)
            return

        # Save pretty-printed JSON for readability and debugging (used by BinaryNinja)
        with open(output_json_path, "w", encoding="utf-8") as f:
            json.dump(parsed, f, ensure_ascii=False, indent=2)
        self.goresym_output_path = output_json_path

        self.log.debug(f"goresym output saved to: {output_json_path}")

    def analyze_binary(self) -> Optional[Dict[str, Any]]:
        """Run Binary Ninja analysis and return results."""
        self.log.debug("Starting binary analysis")
        # if the binary is dotnet (only PE)
        if self.is_dotnet():
            self.log.debug("Skipping .NET binary - decompilation not supported")
            return None

        output_json_path = None
        ## if golang: run goresym
        try:
            if self.is_golang():
                output_json_path = "./goResym.json"
                self.run_goresym(self.filepath, output_json_path)
        except Exception as e:
            self.log.error(f"Error on GoReSym extraction: {e}")

        try:
            # Use BinaryNinjaDecompiler as a context manager to ensure proper setup/cleanup
            with BinaryNinjaDecompiler(
                filepath=self.filepath,
                timeout=self.BINJA_TIMEOUT,
                log=self.log,
                exporters=self.exporters,
                index_prefix=self.index_prefix,
                filetype=self.filetype,
                goresym=output_json_path,
                decompile_modules=self.decompile_modules,
            ) as decompiler:
                self.binja_decompiler = decompiler

                if decompiler.extract():
                    # Store results before context manager exits
                    results = decompiler.analysis_results
                    return results
                else:
                    self.log.error("BinaryNinjaDecompiler extraction failed")
                    return None

        except Exception as e:
            self.log.error(f"Error in Binary Ninja analysis: {e}")
            import traceback
            self.log.error(f"Traceback: {traceback.format_exc()}")
            return None

        finally:
            self.cleanup_run()

    def extract(self):
        """Extract and process all analysis results."""
        self.log.debug(inspect.currentframe().f_code.co_name)

        # Create a flag to track if extraction completed
        extraction_completed = False
        extraction_result = False
        extraction_error = None

        # Define the extraction process as a separate function
        def do_extraction():
            nonlocal extraction_completed, extraction_result, extraction_error
            try:
                results = self.analyze_binary()
                if not results:
                    extraction_result = False
                else:
                    self.analysis_results = results
                    # Add file hashes from parent Extractor class to analysis results
                    self.analysis_results["sha256"] = self.sha256
                    self.analysis_results["sha1"] = self.sha1
                    self.analysis_results["md5"] = self.md5
                    extraction_result = True
            except Exception as e:
                extraction_error = e
                extraction_result = False
            finally:
                extraction_completed = True

        # Run extraction directly with signal-based timeout (no thread overhead).
        # SIGALRM is delivered by the OS, so there's no GIL contention or polling.
        old_handler = signal.getsignal(signal.SIGALRM)
        def _timeout_handler(signum, frame):
            raise TimeoutError("Extraction timed out")

        signal.signal(signal.SIGALRM, _timeout_handler)
        signal.alarm(self.DECOMPILE_EXTRACTOR_TIMEOUT)
        try:
            do_extraction()
        except TimeoutError:
            self.log.error(
                f"Extraction timed out after {self.DECOMPILE_EXTRACTOR_TIMEOUT} seconds"
            )
            self.cleanup_run()
            return None
        finally:
            signal.alarm(0)
            signal.signal(signal.SIGALRM, old_handler)

        if extraction_error:
            self.log.error(f"Error in extraction: {extraction_error}")
            return None

        # Return the actual analysis results, not just a boolean
        return self.analysis_results if extraction_result else None

    def prepare_export_data(self, exporter_type: str) -> Any:
        """Prepare data for database export."""
        self.log.debug(inspect.currentframe().f_code.co_name)
        if not self.analysis_results:
            return None

        # # Delegate to the BinjaDecompiler for consistent export formatting
        # if self.binja_decompiler:
        #     return self.binja_decompiler.prepare_export_data(exporter_type)
        # else:
        #     self.log.error("BinjaDecompiler not available for export preparation")
        #     return None

        if exporter_type == "ClickHouseExporter":
            now = datetime.now(timezone.utc)

            def prepare_array_field(value, array_type):
                """Helper to prepare array fields with proper null handling"""
                if value is None:
                    return []
                return value

            # Add a helper function to handle empty strings
            def ensure_not_empty(value, default="UNKNOWN"):
                """Ensure a string value is not empty"""
                if value is None or value == "":
                    return default
                return value

            def prepare_register_usage_map(register_dict):
                """Convert register usage dict to Map format with tuples
                Input: {"rbx": {"reads": 3, "writes": 1}, ...}
                Output: {"rbx": (3, 1), ...}
                """
                if not register_dict:
                    return {}
                return {
                    reg: (info.get("reads", 0), info.get("writes", 0))
                    for reg, info in register_dict.items()
                }


            decompile_modules = getattr(self, "decompile_modules", {"all"})
            run_all = "all" in decompile_modules
            run_decompilation = run_all or "decompilation" in decompile_modules
            run_disassembly = run_all or "disassembly" in decompile_modules
            run_llil = run_all or "llil" in decompile_modules
            run_cfg = run_all or "cfg" in decompile_modules
            run_strings = run_all or "strings" in decompile_modules

            export = {"multi_table": True}

            # Decompilation tables
            if run_decompilation:
                export["decompiled_content"] = {
                    "table": "code_binja_decompiled_functions_content",
                    "data": [
                        [
                            f["decompiled_function_hash"],
                            f["decompiled_function"],
                            f["function_type"],
                            f.get("flattened_score"),
                            f.get("mba_score"),
                            now,
                        ]
                        for f in self.analysis_results["decompiled"]
                    ],
                    "column_names": [
                        "decompiled_function_hash",
                        "decompiled_function",
                        "function_type",
                        "flattened_score",
                        "mba_score",
                        "analysis_date",
                    ],
                    "column_type_names": [
                        "FixedString(64)",
                        "String",
                        "Enum8('USER'=1, 'LIBRARY'=2, 'THUNK'=3, 'EXTERNAL'=4, 'UNKNOWN'=5)",
                        "Nullable(Float64)",
                        "Nullable(Float64)",
                        "DateTime64(3, 'UTC')",
                    ],
                }
                export["decompiled_refs"] = {
                    "table": "code_binja_decompiled_functions_references",
                    "data": [
                        [
                            self.analysis_results["sha256"],
                            self.analysis_results["sha1"],
                            self.analysis_results["md5"],
                            f["decompiled_function_hash"],
                            f.get("disassembled_function_hash"),
                            f["decompiled_function_name"],
                            f["decompiled_function_prototype"],
                            f["decompiled_function_address"],
                            prepare_array_field(f.get("functions_caller"), "Array(String)"),
                            prepare_array_field(f.get("functions_call"), "Array(String)"),
                            now,
                        ]
                        for f in self.analysis_results["decompiled"]
                    ],
                    "column_names": [
                        "sha256",
                        "sha1",
                        "md5",
                        "decompiled_function_hash",
                        "disassembled_function_hash",
                        "decompiled_function_name",
                        "decompiled_function_prototype",
                        "decompiled_function_address",
                        "functions_caller",
                        "functions_call",
                        "analysis_date",
                    ],
                    "column_type_names": [
                        "FixedString(64)",
                        "FixedString(40)",
                        "FixedString(32)",
                        "FixedString(64)",
                        "Nullable(FixedString(64))",
                        "LowCardinality(String)",
                        "LowCardinality(String)",
                        "UInt64",
                        "Array(String)",
                        "Array(String)",
                        "DateTime64(3, 'UTC')",
                    ],
                }

            # Disassembly tables
            if run_disassembly:
                export["disassembled_content"] = {
                    "table": "code_binja_disassembled_functions_content",
                    "data": [
                        [
                            f["disassembled_function_hash"],
                            f.get("disassembled_function", ""),
                            f.get("disassembled_function_no_addresses", ""),
                            f.get("function_type", "UNKNOWN"),
                            f.get("instructions_count", 0),
                            prepare_array_field(
                                f.get("instructions_types"), "LowCardinality(String)"
                            ),
                            f.get("control_flow_count", 0),
                            prepare_array_field(
                                f.get("memory_access_pattern"), "LowCardinality(String)"
                            ),
                            prepare_array_field(
                                f.get("register_usage"), "LowCardinality(String)"
                            ),
                            f.get("data_references_count", 0),
                            f.get("max_block_size"),
                            f.get("num_calls"),
                            f.get("stack_size"),
                            now,
                        ]
                        for f in self.analysis_results["disassembled"]
                    ],
                    "column_names": [
                        "disassembled_function_hash",
                        "disassembled_function",
                        "disassembled_function_no_addresses",
                        "function_type",
                        "instructions_count",
                        "instructions_types",
                        "control_flow_count",
                        "memory_access_pattern",
                        "register_usage",
                        "data_references_count",
                        "max_block_size",
                        "num_calls",
                        "stack_size",
                        "analysis_date",
                    ],
                    "column_type_names": [
                        "FixedString(64)",
                        "String",
                        "String",
                        "Enum8('USER'=1, 'LIBRARY'=2, 'THUNK'=3, 'EXTERNAL'=4, 'UNKNOWN'=5)",
                        "UInt32",
                        "Array(LowCardinality(String))",
                        "UInt32",
                        "Array(LowCardinality(String))",
                        "Array(LowCardinality(String))",
                        "UInt32",
                        "Nullable(UInt32)",
                        "Nullable(UInt32)",
                        "Nullable(Int32)",
                        "DateTime64(3, 'UTC')",
                    ],
                }
                export["disassembled_refs"] = {
                    "table": "code_binja_disassembled_functions_references",
                    "data": [
                        [
                            self.analysis_results["sha256"],
                            self.analysis_results["sha1"],
                            self.analysis_results["md5"],
                            f["disassembled_function_hash"],
                            f.get("decompiled_function_hash"),
                            f["disassembled_function_name"],
                            f["disassembled_function_address"],
                            f.get("tlsh_disassembly"),
                            f.get("tlsh_llil"),
                            now,
                        ]
                        for f in self.analysis_results["disassembled"]
                    ],
                    "column_names": [
                        "sha256",
                        "sha1",
                        "md5",
                        "disassembled_function_hash",
                        "decompiled_function_hash",
                        "disassembled_function_name",
                        "disassembled_function_address",
                        "tlsh_disassembly",
                        "tlsh_llil",
                        "analysis_date",
                    ],
                    "column_type_names": [
                        "FixedString(64)",
                        "FixedString(40)",
                        "FixedString(32)",
                        "FixedString(64)",
                        "Nullable(FixedString(64))",
                        "LowCardinality(String)",
                        "UInt64",
                        "Nullable(FixedString(72))",
                        "Nullable(FixedString(72))",
                        "DateTime64(3, 'UTC')",
                    ],
                }
                # Function similarity metrics table (derived from disassembly data)
                # Lookup maps to join LLIL/MLIL features by disassembled_function_hash
                llil_by_hash = {
                    l.get("disassembled_function_hash"): l
                    for l in self.analysis_results.get("llil", [])
                    if l and l.get("disassembled_function_hash")
                }
                mlil_by_hash = {
                    m.get("disassembled_function_hash"): m
                    for m in self.analysis_results.get("mlil", [])
                    if m and m.get("disassembled_function_hash")
                }

                export["function_similarity_metrics"] = {
                    "table": "code_binja_function_similarity_metrics",
                    "data": [
                        [
                            f["disassembled_function_hash"],
                            f.get("cyclomatic_complexity"),
                            f.get("tlsh_disassembly"),
                            f.get("tlsh_llil"),
                            prepare_array_field(f.get("minhash"), "Array(UInt8)"),
                            (llil_by_hash.get(f["disassembled_function_hash"]) or {}).get("tlsh_llil"),
                            (llil_by_hash.get(f["disassembled_function_hash"]) or {}).get(
                                "tlsh_instruction_typed_llil"),
                            prepare_array_field(
                                (llil_by_hash.get(f["disassembled_function_hash"]) or {}).get("minhash_llil_skeleton"),
                                "Array(UInt8)",
                            ),
                            prepare_array_field(
                                (llil_by_hash.get(f["disassembled_function_hash"]) or {}).get("minhash_llil_typed"),
                                "Array(UInt8)",
                            ),
                            (mlil_by_hash.get(f["disassembled_function_hash"]) or {}).get("tlsh_mlil_skeleton"),
                            (mlil_by_hash.get(f["disassembled_function_hash"]) or {}).get("tlsh_mlil_typed"),
                            prepare_array_field(
                                (mlil_by_hash.get(f["disassembled_function_hash"]) or {}).get("minhash_mlil_skeleton"),
                                "Array(UInt8)",
                            ),
                            prepare_array_field(
                                (mlil_by_hash.get(f["disassembled_function_hash"]) or {}).get("minhash_mlil_typed"),
                                "Array(UInt8)",
                            ),
                            now,
                        ]
                        for f in self.analysis_results.get("disassembled", [])
                    ],
                    "column_names": [
                        "disassembled_function_hash",
                        "cyclomatic_complexity",
                        "tlsh_disassembly",
                        "tlsh_llil",
                        "minhash",
                        "tlsh_llil_new",
                        "tlsh_instruction_typed_llil",
                        "minhash_llil_skeleton",
                        "minhash_llil_typed",
                        "tlsh_mlil_skeleton",
                        "tlsh_mlil_typed",
                        "minhash_mlil_skeleton",
                        "minhash_mlil_typed",
                        "analysis_date",
                    ],
                    "column_type_names": [
                        "FixedString(64)",
                        "Nullable(UInt16)",
                        "Nullable(FixedString(72))",
                        "Nullable(FixedString(72))",
                        "Array(UInt8)",
                        # new
                        "Nullable(FixedString(72))",
                        "Nullable(FixedString(72))",
                        "Array(UInt8)",
                        "Array(UInt8)",
                        "Nullable(FixedString(72))",
                        "Nullable(FixedString(72))",
                        "Array(UInt8)",
                        "Array(UInt8)",
                        "DateTime64(3, 'UTC')",
                    ],
                }


            # LLIL tables
            if run_llil:
                export["llil_content"] = {
                    "table": "code_binja_llil_functions_content",
                    "data": [
                        [
                            f["sha256_llil"],
                            f["function_type"],
                            prepare_array_field(
                                f.get("instructions_types_llil"), "LowCardinality(String)"
                            ),
                            f.get("control_flow_count_llil", 0),
                            prepare_array_field(
                                f.get("memory_access_pattern_llil"), "LowCardinality(String)"
                            ),
                            prepare_register_usage_map(f.get("register_usage", {})),
                            f.get("total_reg_reads", 0),
                            f.get("total_reg_written", 0),
                            f.get("data_references_count", 0),
                            f.get("max_block_size"),
                            f.get("num_calls"),
                            f.get("stack_size"),
                            prepare_array_field(f.get("body_llil_vector"), "Array(Tuple(UInt32, Array(UInt16)))"),
                            now,
                        ]
                        for f in self.analysis_results.get("llil", [])
                    ],
                    "column_names": [
                        "llil_function_hash",
                        "function_type",
                        "instructions_types_llil",
                        "control_flow_count_llil",
                        "memory_access_pattern_llil",
                        "register_usage_llil",
                        "total_reg_reads",
                        "total_reg_written",
                        "data_references_count",
                        "max_block_size",
                        "num_calls",
                        "stack_size",
                        "body_llil_vector",
                        "analysis_date",
                    ],
                    "column_type_names": [
                        "FixedString(64)",
                        "Enum8('USER'=1, 'LIBRARY'=2, 'THUNK'=3, 'EXTERNAL'=4, 'UNKNOWN'=5)",
                        "Array(LowCardinality(String))",
                        "UInt32",
                        "Array(LowCardinality(String))",
                        "Map(LowCardinality(String), Tuple(UInt32, UInt32))",
                        "UInt32",
                        "UInt32",
                        "UInt32",
                        "Nullable(UInt32)",
                        "Nullable(UInt32)",
                        "Nullable(Int32)",
                        "Array(Tuple(UInt32, Array(UInt16)))",
                        "DateTime64(3, 'UTC')",
                    ],
                }
                export["llil_refs"] = {
                    "table": "code_binja_llil_functions_references",
                    "data": [
                        [
                            self.analysis_results["sha256"],
                            self.analysis_results["sha1"],
                            self.analysis_results["md5"],
                            f.get("sha256_llil"),
                            f.get("disassembled_function_hash"),
                            f.get("function_address"),
                            f.get("tlsh_disassembly"),
                            f.get("tlsh_llil"),
                            now,
                        ]
                        for f in self.analysis_results.get("llil", [])
                    ],
                    "column_names": [
                        "sha256",
                        "sha1",
                        "md5",
                        "llil_function_hash",
                        "disassembled_function_hash",
                        "function_address",
                        "tlsh_disassembly",
                        "tlsh_llil",
                        "analysis_date",
                    ],
                    "column_type_names": [
                        "FixedString(64)",
                        "FixedString(40)",
                        "FixedString(32)",
                        "Nullable(FixedString(64))",
                        "FixedString(64)",
                        "UInt64",
                        "Nullable(FixedString(72))",
                        "Nullable(FixedString(72))",
                        "DateTime64(3, 'UTC')",
                    ],
                }

            # Errors table (always include if per-function loop ran)
            if run_decompilation or run_disassembly or run_llil or run_cfg:
                export["function_analysis_errors"] = {
                    "table": "new_function_analysis_errors_binja",
                    "data": [
                        [
                            self.analysis_results["sha256"],
                            f["function_name"],
                            f["function_address"],
                            f.get("error_location", "unknown"),
                            f.get("error_message", ""),
                            f.get("error_details", ""),
                            f.get("error_type", "unknown"),
                            self.calculate_md5(
                                f"{f.get('error_message', '')}{f['function_name']}{f['function_address']}{f.get('error_location', 'unknown')}"
                            ),
                            "new",
                            now,
                        ]
                        for f in self.analysis_results.get("errors", [])
                    ],
                    "column_names": [
                        "sha256",
                        "function_name",
                        "function_address",
                        "error_location",
                        "error_message",
                        "error_details",
                        "error_type",
                        "error_hash",
                        "status",
                        "analysis_date",
                    ],
                    "column_type_names": [
                        "FixedString(64)",
                        "Nullable(String)",
                        "UInt64",
                        "LowCardinality(String)",
                        "Nullable(String)",
                        "Nullable(String)",
                        "Nullable(String)",
                        "FixedString(32)",
                        "Enum8('new'=1, 'investigating'=2, 'fixed'=3, 'wontfix'=4)",
                        "DateTime64(3, 'UTC')",
                    ],
                }

            # Strings table
            if run_strings:
                export["strings_raw"] = {
                    "table": "code_binja_strings_raw",
                    "data": [
                        [
                            self.analysis_results["sha256"],
                            s["string"],
                            s["string_raw"],
                            s["string_encoding"],
                            s["string_offset"],
                            s["string_length"],
                            s["string_raw_length"],
                            s["string_entropy"],
                        ]
                        for s in self.analysis_results.get("strings", [])
                    ],
                    "column_names": [
                        "sha256",
                        "string",
                        "string_raw",
                        "string_encoding",
                        "string_offset",
                        "string_length",
                        "string_raw_length",
                        "string_entropy",
                    ],
                    "column_type_names": [
                        "FixedString(64)",
                        "String",
                        "String",
                        "LowCardinality(String)",
                        "UInt64",
                        "UInt32",
                        "UInt32",
                        "Float32",
                    ],
                }

            # CFG function-level features table
            if run_cfg:
                export["cfg_functions"] = {
                    "table": "code_binja_cfg_functions",
                    "data": [
                        [
                            cfg.get("disassembled_function_hash"),
                            cfg["cfg_topology_hash"],
                            cfg["block_count"],
                            cfg["edge_count"],
                            cfg.get("llil_total_operations", 0),
                            cfg.get("call_count", 0),
                            cfg["cyclomatic_complexity"],
                            cfg.get("loop_count", 0),
                            cfg.get("max_depth", 0),
                            cfg.get("max_fan_out", 0),
                            cfg.get("md_index_topdown", 0),
                            cfg.get("md_index_bottomup", 0),
                            cfg.get("prime_product_llil", 0),
                            cfg.get("cfg_feature_tlsh"),
                            cfg.get("wl_minhash", []),
                            cfg.get("bb_features", []),
                            cfg.get("cfg_adjacency", []),
                            now,
                        ]
                        for cfg in self.analysis_results.get("cfg", [])
                        if cfg is not None
                    ],
                    "column_names": [
                        "disassembled_function_hash",
                        "cfg_topology_hash",
                        "block_count",
                        "edge_count",
                        "llil_total_operations",
                        "call_count",
                        "cyclomatic_complexity",
                        "loop_count",
                        "max_depth",
                        "max_fan_out",
                        "md_index_topdown",
                        "md_index_bottomup",
                        "prime_product_llil",
                        "cfg_feature_tlsh",
                        "wl_minhash",
                        "bb_features",
                        "cfg_adjacency",
                        "analysis_date",
                    ],
                    "column_type_names": [
                        "FixedString(64)",
                        "FixedString(16)",
                        "UInt16",
                        "UInt16",
                        "UInt32",
                        "UInt16",
                        "UInt16",
                        "UInt8",
                        "UInt16",
                        "UInt8",
                        "UInt64",
                        "UInt64",
                        "UInt64",
                        "Nullable(FixedString(72))",
                        "Array(UInt8)",
                        "Array(Array(UInt16))",
                        "Array(UInt32)",
                        "DateTime64(3, 'UTC')",
                    ],
                }

            # GoReSym metadata table (only if goresym data exists)
            if self.goresym_data:
                export["golang_metadata"] = {
                    "table": "redb_golang_metadata",
                    "data": [
                        [
                            self.analysis_results["sha256"],
                            json.dumps(self.goresym_data),
                            now,
                        ]
                    ],
                    "column_names": [
                        "sha256",
                        "goresym",
                        "analysis_date",
                    ],
                    "column_type_names": [
                        "FixedString(64)",
                        "JSON",
                        "DateTime64(3, 'UTC')",
                    ],
                }

            return export

    def tag(self) -> str:
        """Return the tag for this extractor."""
        return Tag.DECOMPILED.value

    def get_clickhouse_table(self) -> str:
        """Not used directly as we're handling multiple tables."""
        pass


if __name__ == "__main__":
    # Setup basic logging
    import logging
    import time

    logging.basicConfig(level=logging.INFO)
    logger = logging.getLogger("DecompileBinja")

    # Parse command line arguments
    import argparse

    parser = argparse.ArgumentParser(description="Binary Ninja Decompiler Wrapper")
    parser.add_argument("filepath", help="Path to the binary file to analyze")
    parser.add_argument(
        "--output", "-o", help="Output JSON file path (default: stdout)"
    )
    parser.add_argument(
        "--timeout",
        "-t",
        type=int,
        default=1200,
        help="Analysis timeout in seconds (default: 1200)",
    )
    args = parser.parse_args()
    start = time.perf_counter()
    # Create and run the extractor
    with DecompileBinja(args.filepath, logger) as extractor:
        success = extractor.extract()
        end = time.perf_counter()
        if not success:
            logger.error("Analysis failed")
            exit(1)

        # Output results
        if args.output:
            with open(args.output, "w") as f:
                json.dump(extractor.analysis_results, f)
            logger.info(f"Results written to {args.output}")
        else:
            print((extractor.analysis_results))
            with open("diff", "w") as f:
                f.write(str(f"{end - start:.3f} seconds"))