Haifeng Shen

172 papers A* 6A 7B 10C 12Misc 5Journal 74Unranked 54
YearRankTypeTitle / Venue / Authors
2026 J jnl
CoRR
Lei Zhang, Yongda Yu, Minghui Yu, Xinxin Guo, Zhengqi Zhuang, Guoping Rong, Dong Shao, Haifeng Shen, Hongyu Kuang, Zhengfeng Li, Boge Wang, Guoan Zhang, Bangyu Xiang, Xiaobin Xu
2026 J jnl
CoRR
Yongda Yu, Lei Zhang, Xinxin Guo, Minghui Yu, Zhengqi Zhuang, Guoping Rong, Haifeng Shen, Zhengfeng Li, Boge Wang, Guoan Zhang, Bangyu Xiang, Xiaobin Xu
2026 J jnl
CoRR
Ning Jiang, Dingheng Zeng, Yanhong Liu, Haiyang Yi, Shijie Yu, Minghe Weng, Haifeng Shen, Ying Li
2025 conf
Internetware
Hao Zhang, Dongjun Yu, Lei Zhang, Guoping Rong, Yongda Yu, Haifeng Shen, He Zhang, Dong Shao, Hongyu Kuang
2025 J jnl
Autom. Softw. Eng.
Jinwei Xu, He Zhang, Xin Zhou, Yanjing Yang, Runfeng Mao, Xiaokang Li, Lanxin Yang, Haifeng Shen
2025 A* conf
ICSE
Guoping Rong, Yongda Yu, Song Liu, Xin Tan, Tianyi Zhang, Haifeng Shen, Jidong Hu
2025 J jnl
J. Syst. Softw.
Yanjing Yang, Xin Zhou, Runfeng Mao, Jinwei Xu, Lanxin Yang, Yu Zhang, Haifeng Shen, He Zhang
2025 J jnl
IEEE Internet Things J.
Muhammad Sakib Khan Inan, Kewen Liao, Haifeng Shen, Prem Prakash Jayaraman, Federico Montori, Dimitrios Georgakopoulos
2025 J jnl
CoRR
Yongda Yu, Guohao Shi, Xianwei Wu, Haochuan He, XueMing Gu, Qianqian Zhao, Kui Liu, Qiushi Wang, Zhao Tian, Haifeng Shen, Guoping Rong
2025 J jnl
ACM Trans. Softw. Eng. Methodol.
Yongda Yu, Guoping Rong, Haifeng Shen, He Zhang, Dong Shao, Min Wang, Zhao Wei, Yong Xu, Juhong Wang
2025 J jnl
CoRR
Zeru Cheng, Yanjing Yang, He Zhang, Lanxin Yang, Jinghao Hu, Jinwei Xu, Bohan Liu, Haifeng Shen
2025 J jnl
CoRR
Zhiling Ye, Cong Zhou, Xiubao Zhang, Haifeng Shen, Weihong Deng, Quan Lu
2024 J jnl
CoRR
Yanjing Yang, Xin Zhou, Runfeng Mao, Jinwei Xu, Lanxin Yang, Yu Zhangm, Haifeng Shen, He Zhang
2024 J jnl
CoRR
Muhammad Sakib Khan Inan, Kewen Liao, Haifeng Shen, Prem Prakash Jayaraman, Dimitrios Georgakopoulos, Ming Jian Tang
2024 J jnl
IEEE Trans. Intell. Veh.
Sheng Luo, Wei Chen, Wanxin Tian, Rui Liu, Luanxuan Hou, Xiubao Zhang, Haifeng Shen, Ruiqi Wu, Shuyi Geng, Yi Zhou, Ling Shao, Yi Yang, Bojun Gao, Qun Li, Guobin Wu
2024 J jnl
CoRR
Sheng Luo, Wei Chen, Wanxin Tian, Rui Liu, Luanxuan Hou, Xiubao Zhang, Haifeng Shen, Ruiqi Wu, Shuyi Geng, Yi Zhou, Ling Shao, Yi Yang, Bojun Gao, Qun Li, Guobin Wu
2024 J jnl
CoRR
Yongda Yu, Lei Zhang, Guoping Rong, Haifeng Shen, Jiahao Zhang, Haoxiang Yan, Guohao Shi, Dong Shao, Ruiqi Pan, Yuan Li, Qiushi Wang, Zhao Tian
2024 J jnl
IEEE Trans. Software Eng.
Guoping Rong, Yongda Yu, Yifan Zhang, He Zhang, Haifeng Shen, Dong Shao, Hongyu Kuang, Min Wang, Zhao Wei, Yong Xu, Juhong Wang
2024 J jnl
Future Gener. Comput. Syst.
Muhammad Aufeef Chauhan, Muhammad Ali Babar, Haifeng Shen
2024 J jnl
CoRR
Hao Zhang, Dongjun Yu, Lei Zhang, Guoping Rong, Yongda Yu, Haifeng Shen, He Zhang, Dong Shao, Hongyu Kuang
2024 J jnl
ACM Trans. Multim. Comput. Commun. Appl.
Bo Peng, Lin Sun, Jianjun Lei, Bingzheng Liu, Haifeng Shen, Wanqing Li, Qingming Huang
2023 conf
MobiQuitous (1)
Muhammad Sakib Khan Inan, Kewen Liao, Haifeng Shen, Prem Prakash Jayaraman, Dimitrios Georgakopoulos, Ming Jian Tang
2023 J jnl
Int. J. Hum. Comput. Stud.
Haifeng Shen, Othman Asiry, Muhammad Ali Babar, Tomasz Bednarz
2023 A* conf
ICDE
Songjie Xie, Youlong Wu, Kewen Liao, Lu Chen, Chengfei Liu, Haifeng Shen, MingJian Tang, Lu Sun
2023 A* conf
ICSE
Guoping Rong, Shenghui Gu, Haifeng Shen, He Zhang, Hongyu Kuang
2023 J jnl
IEEE Trans. Software Eng.
Shenghui Gu, Guoping Rong, He Zhang, Haifeng Shen
2023 J jnl
ACM Trans. Multim. Comput. Commun. Appl.
Jie Zhu, Bo Peng, Wanqing Li, Haifeng Shen, Qingming Huang, Jianjun Lei
2023 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Bo Peng, Mingliang Zhang, Jianjun Lei, Huazhu Fu, Haifeng Shen, Qingming Huang
2023 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Zhe Zhang, Bo Peng, Jianjun Lei, Haifeng Shen, Qingming Huang
2023 J jnl
IEEE Trans. Ind. Informatics
Jianjun Lei, Tianyi Qin, Bo Peng, Wanqing Li, Zhaoqing Pan, Haifeng Shen, Sam Kwong
2023 J jnl
IET Softw.
Xin Zhou, Runfeng Mao, He Zhang, Qiming Dai, Huang Huang, Haifeng Shen, Jingyue Li, Guoping Rong
2023 J jnl
IEEE Trans. Software Eng.
Bohan Liu, He Zhang, Weigang Ma, Gongyuan Li, Shanshan Li, Haifeng Shen
2023 J jnl
IEEE Trans. Software Eng.
Shenghui Gu, Guoping Rong, Tian Ren, He Zhang, Haifeng Shen, Yongda Yu, Xian Li, Jian Ouyang, Chunan Chen
2023 J jnl
IEEE Trans. Ind. Informatics
Bo Peng, Lin Chen, Jiahui Song, Haifeng Shen, Qingming Huang, Jianjun Lei
2022 J jnl
CoRR
Zhibin Liao, Kewen Liao, Haifeng Shen, Marouska F. van Boxel, Jasper Prijs, Ruurd L. Jaarsma, Job N. Doornberg, Anton van den Hengel, Johan W. Verjans
2022 J jnl
IEEE J. Biomed. Health Informatics
Zhibin Liao, Kewen Liao, Haifeng Shen, Marouska F. van Boxel, Jasper Prijs, Ruurd L. Jaarsma, Job N. Doornberg, Anton van den Hengel, Johan W. Verjans
2022 J jnl
Inf. Softw. Technol.
Roshan Namal Rajapakse, Mansooreh Zahedi, Muhammad Ali Babar, Haifeng Shen
2022 J jnl
IEEE Trans. Geosci. Remote. Sens.
Chuanbo Yu, Jianjun Lei, Bo Peng, Haifeng Shen, Qingming Huang
2021 J jnl
CoRR
Roshan Namal Rajapakse, Mansooreh Zahedi, Muhammad Ali Babar, Haifeng Shen
2021 J jnl
CoRR
Omid Tarkhaneh, Neda Alipour, Amirahmad Chapnevis, Haifeng Shen
2021 conf
CHI Extended Abstracts
Haifeng Shen, Kewen Liao, Zhibin Liao, Job N. Doornberg, Maoying Qiao, Anton van den Hengel, Johan W. Verjans
2021 conf
ICCPR
Chenyu Liu, Jia Li, Junxian Duan, Haifeng Shen, Huaibo Huang
2021 J jnl
CoRR
Jie Zhu, Bo Peng, Wanqing Li, Haifeng Shen, Zhe Zhang, Jianjun Lei
2021 J jnl
Inf. Softw. Technol.
He Zhang, Runfeng Mao, Huang Huang, Qiming Dai, Xin Zhou, Haifeng Shen, Guoping Rong
2021 J jnl
Inf. Softw. Technol.
Lanxin Yang, He Zhang, Haifeng Shen, Xin Huang, Xin Zhou, Guoping Rong, Dong Shao
2021 J jnl
IEEE Trans. Image Process.
Yanyang Yan, Wenqi Ren, Xiaobin Hu, Kun Li, Haifeng Shen, Xiaochun Cao
2021 J jnl
Int. J. Hum. Comput. Stud.
Theodor Wyeld, Peerumporn Jiranantanagorn, Haifeng Shen, Kewen Liao, Tomasz Bednarz
2020 B conf
ICPR
Luanxuan Hou, Jie Cao, Yuan Zhao, Haifeng Shen, Jian Tang, Ran He
2020 B conf
ICMI
Zehui Yu, Xiehe Huang, Xiubao Zhang, Haifeng Shen, Qun (Tracy) Li, Weihong Deng, Jian Tang, Yi Yang, Jieping Ye
2020 conf
SCC
Huaming Chen, Fucun Li, Geng Sun, Xuyun Zhang, Xianjun Dong, Lei Wang, Kewen Liao, Haifeng Shen, Jun Shen
2020 J jnl
CoRR
Zhen Zhao, Yuhong Guo, Haifeng Shen, Jieping Ye
2020 conf
ECCV (28)
Zhen Zhao, Yuhong Guo, Haifeng Shen, Jieping Ye
2020 A conf
EASE
Bohan Liu, He Zhang, Lanxin Yang, Liming Dong, Haifeng Shen, Kaiwen Song
2020 J jnl
CoRR
Luanxuan Hou, Jie Cao, Yuan Zhao, Haifeng Shen, Yiping Meng, Ran He, Jieping Ye
2020 conf
IEEE BigData
Zixiang Pei, Rongheng Lin, Xiubao Zhang, Haifeng Shen, Jian Tang, Yi Yang
2020 J jnl
IEEE Access
Tarique Anwar, Kewen Liao, Angelic Goyal, Timos Sellis, A. S. M. Kayes, Haifeng Shen
2020 B conf
ICMI
Mo Sun, Jian Li, Hui Feng, Wei Gou, Haifeng Shen, Jian Tang, Yi Yang, Jieping Ye
2020 J jnl
CoRR
Zhenpeng Li, Zhen Zhao, Yuhong Guo, Haifeng Shen, Jieping Ye
2020 J jnl
CoRR
Luanxuan Hou, Jie Cao, Yuan Zhao, Haifeng Shen, Jian Tang, Ran He
2020 C conf
QRS
Runfeng Mao, He Zhang, Qiming Dai, Huang Huang, Guoping Rong, Haifeng Shen, Lianping Chen, Kaixiang Lu
2020 A* conf
CVPR
Xiehe Huang, Weihong Deng, Haifeng Shen, Xiubao Zhang, Jieping Ye
2020 J jnl
CoRR
Xiehe Huang, Weihong Deng, Haifeng Shen, Xiubao Zhang, Jieping Ye
2020 conf
ICME Workshops
Yuan Zhao, Lyuwei Wang, Luanxuan Hou, Chunsheng Gan, Zhipeng Huang, Xu Hu, Haifeng Shen, Jieping Ye
2020 conf
ECCV (12)
Ben Niu, Weilei Wen, Wenqi Ren, Xiangde Zhang, Lianping Yang, Shuzhen Wang, Kaihao Zhang, Xiaochun Cao, Haifeng Shen
2020 J jnl
CoRR
Ben Niu, Weilei Wen, Wenqi Ren, Xiangde Zhang, Lianping Yang, Shuzhen Wang, Kaihao Zhang, Xiaochun Cao, Haifeng Shen
2019 J jnl
IEEE Access
Muhammad Ali Babar, Haifeng Shen, Stefan Biffl, Dietmar Winkler
2019 J jnl
Expert Syst. Appl.
Omid Tarkhaneh, Haifeng Shen
2019 J jnl
CoRR
Yiwei Zhang, Chunbiao Zhu, Ge Li, Yuan Zhao, Haifeng Shen
2019 conf
IRICT
Abdulwahab Ali Almazroi, Haifeng Shen, Fathey Mohammed, Nabil Hasan Al-Kumaim
2019 conf
VRCAI
Theodor Wyeld, Haifeng Shen, Tomasz Bednarz
2019 J jnl
J. Ind. Inf. Integr.
Haifeng Shen, Tomasz Bednarz, Huyen Nguyen, Frank Feng, Theodor Wyeld, Peter J. Hoek, Edward H. S. Lo
2019 J jnl
CoRR
Jian Li, Yan Wang, Xiubao Zhang, Weihong Deng, Haifeng Shen
2019 conf
ASCC
Haifeng Shen, Xin-Jian Zhu, Hongfei Cao, Binqiang Xue
2018 J jnl
J. Netw. Comput. Appl.
Shaymaa Akraa, Anh Pham Tran Tam, Haifeng Shen, Youhong Tang, Ben Zhong Tang, Jimmy Li, Sandy Walker
2018 B conf
FG
Weilong Chai, Weihong Deng, Haifeng Shen
2018 B conf
FG
Zimeng Luo, Jiani Hu, Weihong Deng, Haifeng Shen
2018 conf
ASWEC
Jameel Almalki, Haifeng Shen
2018 C conf
IV
Othman Asiry, Haifeng Shen, Theodor Wyeld, Soher Balkhy
2018 J jnl
Mob. Networks Appl.
Kun Hao, Haifeng Shen, Yonglei Liu, Beibei Wang, Xiujuan Du
2018 J jnl
CoRR
Wanxin Tian, Zixuan Wang, Haifeng Shen, Weihong Deng, Binghui Chen, Xiubao Zhang
2018 conf
ICSOC Workshops
Jameel Almalki, Haifeng Shen
2018 A* conf
NeurIPS
Binghui Chen, Weihong Deng, Haifeng Shen
2018 J jnl
CoRR
Binghui Chen, Weihong Deng, Haifeng Shen
2017 conf
WICON
Kun Hao, Haifeng Shen, Yonglei Liu, Beibei Wang
2017 J jnl
Adv. Eng. Informatics
Chen Gao, Kaiqi Jin, Haifeng Shen, Muhammad Ali Babar
2017 conf
ACALCI
Mahfouth Alghamdi, Haifeng Shen
2017 C conf
MobiQuitous
Shaymaa Akraa, Feng Guo, Haifeng Shen, Youhong Tang, Jimmy Li, Gobert N. Lee, Ben Zhong Tang
2017 C conf
APSEC
Sahan Serasinghe, Haifeng Shen, David Chen
2016 conf
ICEBE
Abdulwahab Ali Almazroi, Haifeng Shen, Kung-Keat Teoh, Muhammad Ali Babar
2016 C conf
CSCWD
Chen Gao, Haifeng Shen, Muhammad Ali Babar
2016 C conf
CSCWD
Mehdi Gheisari, Ali Akbar Movassagh, Yongrui Qin, Jianming Yong, Xiaohui Tao, Ji Zhang, Haifeng Shen
2016 Misc conf
OZCHI
Peerumporn Jiranantanagorn, Haifeng Shen
2016 Misc conf
OZCHI
Ritu Sharma, Haifeng Shen, Robert Goodwin
2016 J jnl
IEEE Trans. Comput. Soc. Syst.
Yuqing Mao, Haifeng Shen
2015 conf
ASWEC (2)
Jameel Almalki, Haifeng Shen
2015 J jnl
Sensors
Kun Hao, Zhigang Jin, Haifeng Shen, Ying Wang
2015 ed.
OZCHI (LNCS Selection)
Theodor G. Wyeld, Paul R. Calder, Haifeng Shen
2015 conf
ASWEC (2)
Peerumporn Jiranantanagorn, Parveen Bhardwaj, Ruilun Li, Haifeng Shen, Robert Goodwin, Kung-Keat Teoh
2015 conf
ASWEC (2)
Othman Asiry, Haifeng Shen, Paul R. Calder
2015 ed.
ASWEC (2)
Fei-Ching Diana Kuo, Stuart Marshall, Haifeng Shen, Markus Stumptner, Muhammad Ali Babar
2014 conf
UIC/ATC/ScalCom
Jameel Almalki, Haifeng Shen
2014 conf
SocialCom
Qijin Ji, Haifeng Shen, Yuqing Mao, Yanqin Zhu
2014 C conf
CSCWD
Ahmad Sholehin Bin Sarib, Haifeng Shen
2014 conf
SocialCom
Qijin Ji, Haifeng Shen, Yuqing Mao, Yanqin Zhu
2014 conf
CSCW Companion
Michael S. MacFadden, Agustina, Ning Gu, Claudia-Lavinia Ignat, Haifeng Shen, David Sun, Chengzheng Sun
2014 conf
BCS HCI
Mark D. Reilly, Haifeng Shen, Paul R. Calder, Henry Been-Lirn Duh
2013 C conf
CSCWD
Haifeng Shen, Suiping Zhou
2013 Misc ed.
OZCHI
Haifeng Shen, Ross T. Smith, Jeni Paay, Paul R. Calder, Theodor G. Wyeld
2013 Misc conf
ICMLC
Guilin Wang, Haojun Zhang, Yanqin Zhu, Qijin Ji, Haifeng Shen
2013 J jnl
J. Appl. Math.
Haifeng Shen, Xin-Jian Zhu, Meng Shao, Hongfei Cao
2013 A conf
CSCW
Yuqing Mao, Haifeng Shen, Chengzheng Sun
2013 conf
OZCHI (LNCS Selection)
Mark D. Reilly, Haifeng Shen, Paul R. Calder, Henry Been-Lirn Duh
2013 conf
CSCW Companion
Agustina, Ning Gu, Claudia-Lavinia Ignat, Michael S. MacFadden, Haifeng Shen, David Sun, Chengzheng Sun
2013 Misc conf
OZCHI
Mark D. Reilly, Haifeng Shen, Paul R. Calder, Henry Been-Lirn Duh
2012 B conf
GROUP
Hongfei Fan, Chengzheng Sun, Haifeng Shen
2012 A conf
CSCW
David Sun, Chengzheng Sun, Steven Xia, Haifeng Shen
2012 conf
HICSS
Yuqing Mao, Haifeng Shen, Chengzheng Sun
2012 B conf
GROUP
Yuqing Mao, Haifeng Shen, Chengzheng Sun
2012 J jnl
J. Comput. Syst. Sci.
Haifeng Shen, Mark D. Reilly
2012 conf
CSCW (Companion)
Agustina, Ning Gu, Claudia-Lavinia Ignat, Pascal Molli, Haifeng Shen, David Sun, Chengzheng Sun
2012 ed.
AUIC
Haifeng Shen, Ross T. Smith
2012 J jnl
Computing
Haifeng Shen, Gang Liu, Jun Guo
2011 conf
ADMA (1)
Yuqing Mao, Haifeng Shen, Chengzheng Sun
2011 conf
CyberC
Yuqing Mao, Haifeng Shen, Chengzheng Sun
2011 J jnl
ACM Trans. Internet Techn.
Haifeng Shen, Chengzheng Sun
2011 J jnl
Expert Syst. Appl.
Yang Zheng, Haifeng Shen, Chengzheng Sun
2011 conf
CSCL
Mark D. Reilly, Haifeng Shen
2011 conf
BCS HCI
Yuqing Mao, Haifeng Shen, Chengzheng Sun
2011 conf
ACSC
Haifeng Shen, Yongyao Yan
2011 conf
HCI (17)
Haifeng Shen, Xiugan Yuan
2011 ed.
AUIC
Christof Lutteroth, Haifeng Shen
2010 conf
HCIS
Yuqing Mao, Haifeng Shen, Chengzheng Sun
2010 J jnl
IEEE Trans. Ind. Informatics
Yang Zheng, Haifeng Shen, Chengzheng Sun
2010 conf
ICEBE
Haifeng Shen
2010 A conf
IUI
Yuqing Mao, Haifeng Shen, Chengzheng Sun
2009 conf
CTS
Yang Zheng, Haifeng Shen, Chengzheng Sun
2009 C conf
CSCWD
Yang Zheng, Haifeng Shen, Chengzheng Sun
2009 J jnl
J. Syst. Archit.
Haifeng Shen
2009 J jnl
Artif. Intell. Rev.
Haifeng Shen, Gang Liu, Jun Guo
2008 conf
Web Intelligence
Rong Zhou, Ren Wei, Gang Chen, Zhonghua Yang, Haifeng Shen, Jing-Bing Zhang, Ming Luo
2008 A conf
CSCW
Agustina, Fei Liu, Steven Xia, Haifeng Shen, Chengzheng Sun
2008 A* conf
ASE
Haifeng Shen, Siyuan Liu, Steven Xia, Chengzheng Sun
2008 conf
Web Intelligence
Wei Ren, Gang Chen, Haifeng Shen, Zhonghua Yang, Jing-Bing Zhang, Chor Ping Low, David Chen, Chengzheng Sun
2008 J jnl
Simul.
Ta Nguyen Binh Duong, Suiping Zhou, Haifeng Shen
2008 J jnl
Int. J. High Perform. Comput. Netw.
Haifeng Shen, Suiping Zhou
2007 conf
Annual Simulation Symposium
Suiping Zhou, Haifeng Shen
2007 J jnl
IEEE Distributed Syst. Online
Haifeng Shen, Zhonghua Yang, Chengzheng Sun
2007 conf
OTM Conferences (1)
Yang Zheng, Haifeng Shen, Steven Xia, Chengzheng Sun
2007 C conf
CDVE
Haifeng Shen, Steven Xia, Chengzheng Sun
2007 conf
SNPD (1)
Haifeng Shen, Suiping Zhou, Chengzheng Sun
2006 conf
Web Intelligence
Haifeng Shen, Chengzheng Sun, Suiping Zhou, Zaw Wai Phyo
2006 conf
IIH-MSP
Jianjun Lei, Jian Wang, Jun Guo, Gang Liu, Haifeng Shen
2006 J jnl
IEEE Distributed Syst. Online
Haifeng Shen, Chengzheng Sun
2006 B conf
PADS
Ta Nguyen Binh Duong, Suiping Zhou, Haifeng Shen
2006 J jnl
Fundam. Informaticae
Haifeng Shen, Qunxia Li, Jun Guo, Gang Liu
2006 C conf
CollaborateCom
Siyuan Liu, Yang Zheng, Haifeng Shen, Steven Xia, Chengzheng Sun
2006 J jnl
ACM Trans. Comput. Hum. Interact.
Chengzheng Sun, Steven Xia, David Sun, David Chen, Haifeng Shen, Wentong Cai
2005 conf
Parallel and Distributed Computing and Networks
Ta Nguyen Binh Duong, Suiping Zhou, Haifeng Shen
2005 conf
ICPADS (1)
Haifeng Shen, Suiping Zhou
2005 conf
MICAI
Haifeng Shen, Jun Guo, Gang Liu, Pingmu Huang, Qunxia Li
2005 conf
ICITA (2)
Haifeng Shen, Suiping Zhou, Chengzheng Sun
2005 conf
CIS (1)
Haifeng Shen, Qunxia Li, Jun Guo, Gang Liu
2005 conf
PKDD
Haifeng Shen, Jun Guo, Gang Liu, Qunxia Li
2005 C conf
CollaborateCom
Haifeng Shen, Chengzheng Sun
2005 conf
ISNN (2)
Haifeng Shen, Gang Liu, Jun Guo, Qunxia Li
2004 B conf
COMPSAC
Haifeng Shen, Chengzheng Sun
2004 J jnl
Future Gener. Comput. Syst.
Haifeng Shen, Chengzheng Sun
2004 A conf
CSCW
Steven Xia, David Sun, Chengzheng Sun, David Chen, Haifeng Shen
2002 B conf
COMPSAC
Haifeng Shen, Chengzheng Sun
2002 conf
IICS
Haifeng Shen, Chengzheng Sun
2002 conf
OTM
Haifeng Shen, Chengzheng Sun
2002 A conf
CSCW
Haifeng Shen, Chengzheng Sun
start.py
← Index start.py python
"""
# By repository (existing behavior, now uses repository_upload_sessions)
python start.py --s3 --repo bazaar --index_prefix redb

# By repository with notes filter
python start.py --s3 --repo vx-itw --s3-notes "ITW.0138" --index_prefix redb

# By single date (all repo samples first seen on Jan 15, 2025)
python start.py --date 2025-01-15 --index_prefix redb

# By date with repository filter
python start.py --date 2025-01-15 --repo bazaar --index_prefix redb

# By date range (inclusive)
python start.py --range 2025-01-01 2025-01-31 --index_prefix redb

# By date range with repository and notes filters
python start.py --range 2025-01-01 2025-01-31 --repo malshare --s3-notes "batch1" --index_prefix redb

# By filetype (magika) standalone - process all ELF samples across all repos
python start.py --s3 --magika elf --index_prefix redb

# By filetype with repository filter
python start.py --s3 --repo bazaar --magika elf --index_prefix redb

# By filetype with date range - process only PE samples in date range
python start.py --range 2025-01-01 2025-01-31 --magika pebin --index_prefix redb
"""

import argparse
import os
import sys
from datetime import datetime, timedelta
from redb.ingestor import *

"""
        # General modules
        'BasicPropertiesExtractor': BasicPropertiesExtractor,
        'HashExtractor': HashExtractor,
        'DIEExtractor': DIEExtractor,
        'CAPAExtractor': CAPAExtractor,
        'StringsExtractor': StringsExtractor,
        # PE modules
        'PEFeaturesExtractor': PEFeaturesExtractor,
        'PEImportExtractor': PEImportExtractor,
        'PEResourceExtractor': PEResourceExtractor,
        'PEOverlayExtractor': PEOverlayExtractor,
        'PESectionExtractor': PESectionExtractor,
        'PESignatureExtractor': PESignatureExtractor,
        'PEExtraFindings': PEExtraFindings,
        'PEInconstistencyTestsExtractor': PEInconstistencyTestsExtractor,
        'PEDotNetExtractor': PEDotNetExtractor,
"""


def main():
    # # path = "/mnt/samples/consilience/malware/test/test-unzipped/0242d90dc48a8931bad72ddbdba34bdd568fd30610dfe049c84968d425088c71/"
    # path = "/Users/p4c0/_samples/test-unzipped/0242d90dc48a8931bad72ddbdba34bdd568fd30610dfe049c84968d425088c71" #Stuxnet
    # # path = "/Volumes/backup/consilience/malware/test/test-unzipped/rhpv-673f91a2085358e3266f466845366f30cf741060edeb31e9a93e2c92033bba28"
    # # path = "/mnt/samples/consilience/malware/test/test-redb/"
    # # path = "/mnt/samples/consilience/malware/malpedia-pe/9bc81280113473de9ebfe54f689b4440287c37fff562e070d3a28f5269cadcf0_dump7_0x00400000"
    # # path = "/mnt/samples/consilience/malware/test/test-unzipped/379251974ebcd5c397f92ca45bb9620d"
    # path = "0242d90dc48a8931bad72ddbdba34bdd568fd30610dfe049c84968d425088c71" # rich header, UPX packer
    # # #path = "d8637bdbcfc9112fcb1f0167b398e771" #dotnet
    # path = "/Users/p4c0/_samples/test-unzipped/sig-8e035beb02a411f8a9e92d4cf184ad34f52bbd0a81a50c222cdd4706e4e45104" #code signed, protector use case for sections
    # path = "/Users/p4c0/_samples/test-unzipped/vsinfo-39d8ad95b0323c37bd3134ab93ac4af44c66a1a8443a41c1ac02cec19bb2816a"
    # # path = "/Volumes/backup/consilience/malware/_sorted_samples/vx-apt/pebin/69e679daaaff3832c39671bf2b813b5530a70fb763d381f9a6e22e3bc493c8a9.7z"
    # # path = "test_files/hello"
    # path = "/Volumes/backup/consilience/malware/test/test-re2db/"
    # # path = "/Users/p4c0/_samples/HEUR-Trojan-PSW.MSIL.Maslog.gen-0c9ae5cd740c1da7060b92ddb33f3a3893e361aad45a2accc64d43bd9a1a4106"
    # # path = "/Users/p4c0/_samples/test-unzipped/"
    # # # path = "/Volumes/backup/consilience/malware/_sorted_samples/vx-apt/pebin/7156bd8056c4b6b4e179a64370067d3f7a7cce0044f1352d41f3c2c73038d273.7z"
    # decompile = False
    # repo = "test-fixing"
    # index_prefix = "test4"
    # selected_modules = "all"
    # exporter_types = ['ClickHouse']

    # parser = argparse.ArgumentParser(
    #     description="Process binary files in a given path."
    # )
    # parser.add_argument("path", 
    #     help="File path, directory path, or path to a .txt file containing a list of files to process (one per line)")
    # parser.add_argument(
    #     "--repo", help="Repository name for sample source, used for loggfile name"
    # )
    # parser.add_argument("--index_prefix", help="Index prefix for ElasticSearch")
    # parser.add_argument(
    #     "-d",
    #     "--decompile",
    #     action="store_true",
    #     help="Optional flag, if set it will run ONLY the decompiler on the binary files",
    # )
    # parser.add_argument(
    #     "-m",
    #     "--modules",
    #     help="Comma-separated list of modules to run (e.g., 'BasicPropertiesExtractor,HashExtractor') or 'all' for all modules",
    #     default="all",
    # )
    # args = parser.parse_args()
    # path = args.path
    # index_prefix = args.index_prefix
    # decompile = args.decompile
    # repo = args.repo
    # selected_modules = args.modules

    # print(f"Decompile flag: {decompile}")
    # print(f"Repo: {repo}")
    # print(f"Selected modules: {selected_modules}")
    
    # if path.endswith('.txt'):
    #     print(f"Reading file list from: {path}")

    # Ingestor(path, decompile, repo, index_prefix, selected_modules).ingest()

    parser = argparse.ArgumentParser(
        description="Process binary files from local paths or S3 storage."
    )
    
    # Create a mutually exclusive group for input sources
    # Not required because --analyzed can be used standalone
    input_group = parser.add_mutually_exclusive_group(required=False)
    input_group.add_argument(
        "--path", 
        help="File path, directory path, or path to a .txt file containing a list of files to process (one per line)")
    input_group.add_argument(
        "--s3",
        action="store_true",
        help="Use S3 mode to fetch files from repository specified by --repo")
    input_group.add_argument(
        "--s3-solo",
        metavar="S3_KEY",
        help="Process a single S3 file by providing the S3 key (e.g., 09/f7/09f7d02a....zip)")
    input_group.add_argument(
        "--nomad-job",
        action="store_true",
        help="Run as Nomad job using environment variables for job parameters")
    input_group.add_argument(
        "--date",
        metavar="YYYY-MM-DD",
        help="Process samples first seen on a specific date (from repository_upload_sessions only)")
    input_group.add_argument(
        "--range",
        nargs=2,
        metavar=("START_DATE", "END_DATE"),
        help="Process samples first seen in a date range (inclusive, from repository_upload_sessions only). Format: YYYY-MM-DD YYYY-MM-DD")
    parser.add_argument(
        "--analyzed",
        action="store_true",
        help="Filter to samples already in the database (from basic_properties). "
             "Can be used standalone or combined with --range/--date to partition large runs")

    parser.add_argument(
        "--repo",
        required=False,
        help="Repository name for sample source, used for logging and S3 filtering (optional for --date/--range modes)")
    
    parser.add_argument(
        "--s3-notes",
        help="Optional filter for S3 files based on notes field (S3 mode only)")

    parser.add_argument(
        "--magika",
        help="Filter by filetype_magika (e.g., 'elf', 'pebin'). Overrides SUPPORTED_FORMATS env var. Can combine with --repo, --date, --range")

    parser.add_argument(
        "--index_prefix", default="redb",
        help="Index prefix for database (default: redb)")
    
    parser.add_argument(
        "-d",
        "--decompile",
        action="store_true",
        help="Optional flag, if set it will run ONLY the decompiler on the binary files",
    )

    parser.add_argument(
        "-y",
        "--yara",
        action="store_true",
        help="Optional flag, if set it will run ONLY the YARA scanner on the binary files",
    )

    parser.add_argument(
        "--with-yara",
        action="store_true",
        help="Add YARA scanning to feature extraction (runs both features and YARA)",
    )

    parser.add_argument(
        "-m",
        "--modules",
        help="Comma-separated list of modules to run (e.g., 'BasicPropertiesExtractor,HashExtractor') or 'all' for all modules",
        default="all",
    )

    parser.add_argument(
        "--decompile-modules",
        help="Comma-separated list of decompiler sub-modules to run when using -d/--decompile. "
             "Available: decompilation, disassembly, cfg, llil, strings, or 'all' (default: all)",
        default="all",
    )
    
    parser.add_argument(
        "--force",
        action="store_true",
        help="Force reprocessing of samples already in the database (bypasses deduplication check)",
    )

    parser.add_argument(
        "--rerun",
        action="store_true",
        help="Re-run decompiler modules on already-disassembled samples only. "
             "Queries code_binja_disassembled_functions_references instead of basic_properties. "
             "Requires --analyzed and --decompile.",
    )

    parser.add_argument(
        "--dry-run",
        action="store_true",
        help="Print results instead of uploading to database (useful for testing)",
    )
    
    args = parser.parse_args()

    # Extract arguments
    path = args.path
    index_prefix = args.index_prefix
    decompile = args.decompile
    yara_scan = args.yara
    with_yara = args.with_yara
    repo = args.repo
    selected_modules = args.modules
    decompile_modules = args.decompile_modules
    s3_mode = args.s3
    s3_notes = args.s3_notes
    magika_filter = args.magika
    dry_run = args.dry_run
    force = args.force
    rerun = args.rerun
    s3_solo = args.s3_solo
    s3_key = args.s3_solo if args.s3_solo else None
    nomad_job = args.nomad_job
    analyzed = args.analyzed
    date_filter = args.date
    date_range = args.range

    # Validate that at least one input source is provided
    has_input = any([path, s3_mode, s3_solo, nomad_job, date_filter, date_range, analyzed])
    if not has_input:
        print("ERROR: Must specify an input source: --path, --s3, --s3-solo, --nomad-job, --date, --range, or --analyzed")
        sys.exit(1)

    # Validate --analyzed combinations
    if analyzed and any([path, s3_mode, s3_solo, nomad_job]):
        print("ERROR: --analyzed cannot be combined with --path, --s3, --s3-solo, or --nomad-job")
        sys.exit(1)

    # Validate flag combinations
    if yara_scan and with_yara:
        print("ERROR: Cannot use both --yara and --with-yara")
        sys.exit(1)
    if decompile and with_yara:
        print("ERROR: --with-yara only works with feature extraction, not decompile")
        sys.exit(1)

    # Parse and validate --decompile-modules
    VALID_DECOMPILE_MODULES = {"all", "decompilation", "disassembly", "cfg", "llil", "strings"}
    if decompile_modules == "all":
        decompile_modules_set = {"all"}
    else:
        decompile_modules_set = {m.strip() for m in decompile_modules.split(",")}
        invalid = decompile_modules_set - VALID_DECOMPILE_MODULES
        if invalid:
            print(f"ERROR: Invalid decompile module(s): {', '.join(sorted(invalid))}")
            print(f"Available: {', '.join(sorted(VALID_DECOMPILE_MODULES - {'all'}))}")
            sys.exit(1)

    if not decompile and decompile_modules != "all":
        print("ERROR: --decompile-modules requires -d/--decompile flag")
        sys.exit(1)

    if rerun and not analyzed:
        print("ERROR: --rerun requires --analyzed flag")
        sys.exit(1)
    if rerun and not decompile:
        print("ERROR: --rerun requires -d/--decompile flag")
        sys.exit(1)

    if rerun and force:
        print("ERROR: --rerun and --force are mutually exclusive. "
              "--rerun targets already-disassembled samples, --force targets all analyzed samples.")
        sys.exit(1)

    # Validate and parse date arguments
    start_date = None
    end_date = None

    if date_filter:
        # Single date mode: process samples from that day
        try:
            parsed_date = datetime.strptime(date_filter, "%Y-%m-%d")
            start_date = date_filter
            # End date is the next day (exclusive)
            end_date = (parsed_date + timedelta(days=1)).strftime("%Y-%m-%d")
        except ValueError:
            print(f"ERROR: Invalid date format '{date_filter}'. Use YYYY-MM-DD")
            sys.exit(1)

    if date_range:
        # Date range mode: process samples between start and end dates
        try:
            start_date = date_range[0]
            datetime.strptime(start_date, "%Y-%m-%d")  # Validate format
            parsed_end = datetime.strptime(date_range[1], "%Y-%m-%d")
            # End date is the day after the provided end date (to make it inclusive)
            end_date = (parsed_end + timedelta(days=1)).strftime("%Y-%m-%d")
        except ValueError:
            print(f"ERROR: Invalid date format in range '{date_range}'. Use YYYY-MM-DD YYYY-MM-DD")
            sys.exit(1)

    # Validate required parameters based on mode
    if nomad_job or s3_solo:
        # For nomad job and s3-solo modes, set default repo if not provided (used for log filename)
        if not repo:
            repo = "s3-solo" if s3_solo else "nomad-worker"
    elif analyzed:
        # For analyzed mode, repo is optional (used for logging only)
        if not repo:
            repo = "analyzed"
    elif date_filter or date_range:
        # For date/range modes, repo is optional (used for filtering within date range)
        # Set a default repo name for logging if not provided
        if not repo:
            repo = "date-range"
    elif s3_mode and magika_filter and not repo:
        # For S3 mode with magika filter, repo is optional (query all repos for that filetype)
        repo = "all-repos"
    elif not s3_mode and path:
        # For local mode, repo is required
        if not repo:
            print("ERROR: --repo is required for local mode")
            sys.exit(1)
    elif s3_mode and not repo:
        # For S3 mode without magika filter, repo is required
        print("ERROR: --repo is required for S3 catalog mode (or use --magika to query all repos)")
        sys.exit(1)

    print(f"Decompile flag: {decompile}")
    if decompile and decompile_modules != "all":
        print(f"Decompile modules: {', '.join(sorted(decompile_modules_set))}")
    print(f"YARA scan flag: {yara_scan}")
    print(f"With YARA flag: {with_yara}")
    print(f"Repo: {repo}")
    print(f"Selected modules: {selected_modules}")
    print(f"Dry run mode: {dry_run}")
    print(f"Force reprocessing: {force}")
    print(f"S3 solo mode: {s3_solo}")
    print(f"Nomad job mode: {nomad_job}")
    if magika_filter:
        print(f"Magika filter: {magika_filter}")
    if start_date:
        print(f"Date filter: {start_date} to {end_date}")
    if rerun:
        print(f"Rerun mode: targeting already-disassembled samples from code_binja_disassembled_functions_references")
    if analyzed:
        print(f"Analyzed mode: processing already-analyzed samples from basic_properties")

    if analyzed and not (date_filter or date_range):
        # Analyzed mode (standalone): process samples already in basic_properties via S3
        print(f"Processing already-analyzed samples from {index_prefix}_basic_properties")
        if magika_filter:
            print(f"Filetype filter: {magika_filter}")
        Ingestor(
            path=None,
            decompile=decompile,
            yara_scan=yara_scan,
            with_yara=with_yara,
            repository=repo or "analyzed",
            index_prefix=index_prefix,
            selected_modules=selected_modules,
            s3_mode=True,
            magika_filter=magika_filter,
            dry_run=dry_run,
            force=force,
            analyzed=True,
            decompile_modules=decompile_modules_set,
            rerun=rerun,
        ).ingest()

    elif date_filter or date_range:
        # Date-based S3 mode
        print(f"Date-based S3 mode enabled")
        if analyzed:
            print(f"Filtered to already-analyzed samples in {index_prefix}_basic_properties")
        if repo and repo != "date-range":
            print(f"Repository filter: {repo}")
        if s3_notes:
            print(f"Notes filter: {s3_notes}")
        Ingestor(
            path=None,
            decompile=decompile,
            yara_scan=yara_scan,
            with_yara=with_yara,
            repository=repo,
            index_prefix=index_prefix,
            selected_modules=selected_modules,
            s3_mode=True,
            s3_notes=s3_notes,
            magika_filter=magika_filter,
            dry_run=dry_run,
            force=force,
            start_date=start_date,
            end_date=end_date,
            analyzed=analyzed,
            decompile_modules=decompile_modules_set,
        ).ingest()

    elif s3_solo:
        # Process a single S3 file using S3 key provided as argument
        print(f"Starting S3 solo mode with S3 key: {s3_key}")

        # Override with environment variables if not provided via command line
        if not index_prefix:
            index_prefix = os.getenv('INDEX_PREFIX', 'redb')
        if not repo:
            repo = os.getenv('REPO', 's3-solo')

        # Validate required parameters
        if not s3_key:
            print("ERROR: S3 key is required for S3-solo mode")
            sys.exit(1)

        # Extract hash from S3 key by splitting and taking the last chunk
        # S3 key format examples:
        # - 09/f7/09f7d02a3c2382199458c98a62b045145ee54ab6aba86166aecf3d10c3c1444c.zip
        # - private/ab/cd/abcd1234567890abcdef1234567890abcdef1234567890abcdef123456.zip
        try:
            # Remove .zip extension and split by '/'
            sample_hash = s3_key.replace('.zip', '').split('/')[-1]
        except Exception as e:
            print(f"ERROR: Failed to extract hash from S3 key {s3_key}: {e}")
            sys.exit(1)

        print(f"S3 Key: {s3_key}")
        print(f"Extracted hash: {sample_hash}")
        print(f"Using index_prefix: {index_prefix}")
        print(f"Using repo: {repo}")
        print(f"Dry run mode: {dry_run}")
        print(f"Selected modules: {selected_modules}")

        # Use ingestor with S3-solo mode
        Ingestor(
            path=None,
            decompile=decompile,
            yara_scan=yara_scan,
            with_yara=with_yara,
            repository=repo,
            index_prefix=index_prefix or "s3_solo",
            selected_modules=selected_modules,
            s3_mode=True,
            s3_solo=True,
            s3_solo_hash=sample_hash,
            s3_solo_key=s3_key,
            dry_run=dry_run,
            force=force,
            decompile_modules=decompile_modules_set,
        ).ingest()

    elif nomad_job:
        # Run as Nomad job using environment variables - convert to S3-solo mode
        print("Starting Nomad job processor...")
        
        # Process Nomad environment variables
        job_id = os.getenv('JOB_ID')
        s3_key = os.getenv('S3_KEY')
        worker_type = os.getenv('WORKER_TYPE')
        callback_url = os.getenv('CALLBACK_URL')
        modules = os.getenv('ANALYSIS_MODULES', 'all')
        
        # Validate required parameters
        if not all([job_id, s3_key, worker_type, callback_url]):
            print("ERROR: Missing required Nomad job parameters")
            print("Required: JOB_ID, S3_KEY, WORKER_TYPE, CALLBACK_URL")
            sys.exit(1)
        
        print(f"Job ID: {job_id}")
        print(f"S3 Key: {s3_key}")
        print(f"Worker Type: {worker_type}")
        print(f"Callback URL: {callback_url}")
        print(f"Analysis Modules: {modules}")
        
        # Extract hash from S3 key (remove sharding structure and .zip extension)
        # S3 key format: 09/f7/09f7d02a3c2382199458c98a62b045145ee54ab6aba86166aecf3d10c3c1444c.zip
        # Extract: 09f7d02a3c2382199458c98a62b045145ee54ab6aba86166aecf3d10c3c1444c
        try:
            parts = s3_key.split('/')
            if len(parts) == 3:
                sample_hash = parts[2].replace('.zip', '')
            else:
                # Fallback for non-sharded keys
                sample_hash = s3_key.replace('.zip', '')
        except Exception as e:
            print(f"ERROR: Failed to extract hash from S3 key {s3_key}: {e}")
            sys.exit(1)
        
        print(f"Extracted hash: {sample_hash}")
        
        # Set decompile flag based on worker type
        decompile = worker_type == 'decompilation'
        
        # Override modules if specified
        if modules != 'all':
            selected_modules = modules
        
        # Use S3-solo mode with extracted hash
        Ingestor(
            path=None,
            decompile=decompile,
            yara_scan=yara_scan,
            with_yara=with_yara,
            repository=repo,
            index_prefix=index_prefix or "nomad",
            selected_modules=selected_modules,
            s3_mode=False,  # Not bulk S3 mode
            s3_solo=True,   # Use S3-solo mode
            s3_solo_hash=sample_hash,
            dry_run=dry_run,
            force=force,
            decompile_modules=decompile_modules_set,
        ).ingest()

        # TODO: Add callback to send results to callback_url
        print(f"[INFO] Nomad job {job_id} completed. Callback URL: {callback_url}")
    
    elif s3_mode:
        print(f"S3 mode enabled")
        if s3_notes:
            print(f"S3 notes filter: {s3_notes}")
        Ingestor(
            path=None,
            decompile=decompile,
            yara_scan=yara_scan,
            with_yara=with_yara,
            repository=repo,
            index_prefix=index_prefix,
            selected_modules=selected_modules,
            s3_mode=True,
            s3_notes=s3_notes,
            magika_filter=magika_filter,
            dry_run=dry_run,
            force=force,
            decompile_modules=decompile_modules_set,
        ).ingest()
    else:
        print(f"Local mode with path: {path}")
        if path.endswith('.txt'):
            print(f"Reading file list from: {path}")

        Ingestor(
            path=path,
            decompile=decompile,
            yara_scan=yara_scan,
            with_yara=with_yara,
            repository=repo,
            index_prefix=index_prefix,
            selected_modules=selected_modules,
            dry_run=dry_run,
            force=force,
            decompile_modules=decompile_modules_set,
        ).ingest()

if __name__ == "__main__":
    main()