Hangguan Shan

168 papers A* 3A 1B 25C 4Misc 1Journal 88Unranked 46
YearRankTypeTitle / Venue / Authors
2026 J jnl
IEEE Trans. Wirel. Commun.
Yue Zhang, Hangguan Shan, Chongjun Ouyang, Yuanwei Liu, Zhiguo Shi, Dong Lin, Fen Hou
2026 J jnl
IEEE Trans. Wirel. Commun.
Yong Zhou, Qiaochu An, Zhibin Wang, Hangguan Shan, Yuanming Shi, Haibo Zhou
2026 J jnl
IEEE Commun. Lett.
Han Gao, Yue Zhang, Hangguan Shan, Dong Lin, Zhiguo Shi
2026 J jnl
IEEE Trans. Wirel. Commun.
Tianle Wang, Yong Zhou, Yuanming Shi, Nan Cheng, Haibo Zhou, Hangguan Shan
2025 J jnl
High Confid. Comput.
Na Li, Hangguan Shan, Meiyan Song, Yong Zhou, Zhongyuan Zhao, Howard H. Yang, Fen Hou
2025 J jnl
Neurocomputing
Wenwen Zhang, Zhenghua Chen, Yongyi Su, Zhiyu Xiang, Hangguan Shan, Eryun Liu
2025 J jnl
CoRR
Na Li, Hangguan Shan, Wei Ni, Wenjie Zhang, Xinyu Li
2025 conf
ICC
Yue Zhang, Chongjun Ouyang, Hangguan Shan, Yuanwei Liu, Zhiguo Shi, Dong Lin
2025 J jnl
IEEE Trans. Wirel. Commun.
Yue Zhang, Hangguan Shan, Yong Zhou, Zhiguo Shi, Li Sheng, Yuanwei Liu
2025 J jnl
IEEE Trans. Wirel. Commun.
Yue Zhang, Chongjun Ouyang, Hangguan Shan, Yuanwei Liu, Yong Zhou, Zhiguo Shi
2025 J jnl
IEEE Trans. Mob. Comput.
Shiyuan Zuo, Xingrun Yan, Rongfei Fan, Han Hu, Hangguan Shan, Tony Q. S. Quek, Puning Zhao
2025 J jnl
CoRR
Na Li, Hangguan Shan, Wei Ni, Wenjie Zhang, Xinyu Li, Yamin Wang
2025 A conf
ECAI
Yong Fang, Na Li, Hangguan Shan, Eryun Liu, Xinyu Li, Wei Ni, Er-Ping Li
2025 J jnl
CoRR
Yong Fang, Na Li, Hangguan Shan, Eryun Liu, Xinyu Li, Wei Ni, Er-Ping Li
2025 J jnl
IEEE Trans. Veh. Technol.
Fangtong Zhou, Zhibin Wang, Hangguan Shan, Liantao Wu, Xiaohua Tian, Yuanming Shi, Yong Zhou
2025 A* conf
AAAI
Bin Lu, Xinyu Xiao, Changzhou Zhang, Yang Zhou, Zhiyu Xiang, Hangguan Shan, Eryun Liu
2025 J jnl
CoRR
Na Li, Yuchen Jiao, Hangguan Shan, Shefeng Yan
2025 J jnl
CoRR
Shaohong Wang, Bin Lu, Xinyu Xiao, Hanzhi Zhong, Bowen Pang, Tong Wang, Zhiyu Xiang, Hangguan Shan, Eryun Liu
2025 J jnl
CoRR
Na Li, Zewu Zheng, Wei Ni, Hangguan Shan, Wenjie Zhang, Xinyu Li
2025 J jnl
IEEE Internet Things J.
Xiulan Song, Xueyang Liu, Hangguan Shan, Rongxing Lu
2025 J jnl
J. Cloud Comput.
Peng Liu, Xinglong Wu, Yanjun Peng, Hangguan Shan, Saïd Mahmoudi, Bong Jun Choi, Haksrun Lao
2024 J jnl
Expert Syst. Appl.
Wenwen Zhang, Yun Hu, Hangguan Shan, Eryun Liu
2024 J jnl
CoRR
Shiyuan Zuo, Xingrun Yan, Rongfei Fan, Han Hu, Hangguan Shan, Tony Q. S. Quek
2024 J jnl
IEEE Trans. Intell. Transp. Syst.
Haofei Li, Chen Chen, Hangguan Shan, Pu Li, Yoong Choon Chang, Houbing Song
2024 conf
ICC Workshops
Yunzhi Zhao, Fen Hou, Jianwei Huang, Bin Lin, Hangguan Shan
2024 A* conf
AAAI
Wenwen Zhang, Yun Hu, Hangguan Shan, Eryun Liu
2024 J jnl
IEEE Internet Things J.
Yuqing Tian, Zhongyu Wang, Zhaoyang Zhang, Richeng Jin, Hangguan Shan, Wei Wang, Tony Q. S. Quek
2024 conf
ECCV (87)
Shaohong Wang, Lu Bin, Xinyu Xiao, Zhiyu Xiang, Hangguan Shan, Eryun Liu
2024 J jnl
CoRR
Shaohong Wang, Lu Bin, Xinyu Xiao, Zhiyu Xiang, Hangguan Shan, Eryun Liu
2024 C conf
CSCWD
Chen Chen, Guorong Ye, Lixin Lan, Pu Li, Hao Wang, Jianqiao Li, Hangguan Shan, Huixu Xiao
2024 J jnl
IEEE Trans. Commun.
Nannan Zhang, Wei Wang, Xiaofeng Xin, Yuanwei Liu, Hangguan Shan, Aiping Huang
2024 J jnl
IEEE Trans. Wirel. Commun.
Meiyan Song, Hangguan Shan, Yu Cheng, Weihua Zhuang, Xinyu Li, Qi Zhang, Xianhua He
2024 J jnl
IEEE Trans. Wirel. Commun.
Qiaochu An, Yong Zhou, Zhibin Wang, Hangguan Shan, Yuanming Shi, Mehdi Bennis
2024 J jnl
CoRR
Zhiyue Bai, Fen Hou, Lin X. Cai, Hangguan Shan
2024 J jnl
IEEE Trans. Wirel. Commun.
Yue Zhang, Hangguan Shan, Hongbin Chen, Lin Cai, Zhiguo Shi, Tony Q. S. Quek, Li Sheng
2024 J jnl
IEEE Veh. Technol. Mag.
Yue Zhang, Hangguan Shan, Hongbin Chen, De Mi, Zhiguo Shi
2024 A* conf
ICLR
Na Li, Yuchen Jiao, Hangguan Shan, Shefeng Yan
2023 J jnl
CoRR
Wenwen Zhang, Xinyu Xiao, Hangguan Shan, Eryun Liu
2023 conf
VTC Fall
Fangtong Zhou, Xu Chen, Hangguan Shan, Yong Zhou
2023 J jnl
IEEE Trans. Mob. Comput.
Meiyan Song, Howard H. Yang, Hangguan Shan, Jemin Lee, Tony Q. S. Quek
2023 conf
WCSP
Yong Fang, Qiqi He, Dandan Ding, Hangguan Shan, Lu Yu, Zhaoyang Zhang
2023 conf
ICCC Workshops
Haoyi Liang, Like Wang, Yue Zhang, Hangguan Shan, Zhiguo Shi
2023 C conf
ICCC
Sifu Yan, Na Li, Hangguan Shan, Shibo He, Zhiguo Shi, Qi Zhang, Xianhua He
2023 J jnl
IEEE Trans. Wirel. Commun.
Meiyan Song, Hangguan Shan, Yaru Fu, Howard H. Yang, Fen Hou, Wei Wang, Tony Q. S. Quek
2023 J jnl
IEEE Commun. Lett.
Ping Xiang, Hangguan Shan, Zhou Su, Zhaoyang Zhang, Chen Chen, Er-Ping Li
2023 C conf
ICCC
Zhiyue Bai, Fen Hou, Hangguan Shan
2023 J jnl
IEEE Trans. Veh. Technol.
Yue Zhang, Hangguan Shan, Meiyan Song, Howard H. Yang, Xuemin Shen, Qi Zhang, Xianhua He
2023 conf
ICC
Yuchen Cao, Siming Fu, Xiaoxuan He, Haoji Hu, Hangguan Shan, Lu Yu
2023 J jnl
IEEE Trans. Mob. Comput.
Qi Cheng, Hangguan Shan, Weihua Zhuang, Tony Q. S. Quek, Zhaoyang Zhang, Fen Hou
2022 J jnl
Neurocomputing
Wenwen Zhang, Chengdong Dong, Jun Zhang, Hangguan Shan, Eryun Liu
2022 J jnl
IEEE Trans. Wirel. Commun.
Zhongyu Wang, Zhaoyang Zhang, Yuqing Tian, Qianqian Yang, Hangguan Shan, Wei Wang, Tony Q. S. Quek
2022 conf
SECON Workshops
Na Lee, Hangguan Shan, Meiyan Song, Yong Zhou, Zhongyuan Zhao, Xinyu Li, Zhaoyang Zhang
2022 J jnl
IEEE Trans. Multim.
Qi Cheng, Hangguan Shan, Weihua Zhuang, Lu Yu, Zhaoyang Zhang, Tony Q. S. Quek
2022 J jnl
IEEE Trans. Green Commun. Netw.
Qiming Zheng, Hangguan Shan, Fen Hou, Zhiguo Shi, Zhaoyang Zhang
2022 J jnl
IEEE Trans. Wirel. Commun.
Meiyan Song, Hangguan Shan, Howard H. Yang, Tony Q. S. Quek
2022 B conf
WCNC
Meiyan Song, Howard H. Yang, Hangguan Shan, Jemin Lee, Huaming Lin, Tony Q. S. Quek
2022 J jnl
IEEE Trans. Emerg. Top. Comput.
Kunpeng Yang, Hangguan Shan, Tengxu Sun, Haoji Hu, Yingxiao Wu, Lu Yu, Zhaoyang Zhang, Tony Q. S. Quek
2022 B conf
WCNC
Yue Zhang, Hangguan Shan, Meiyan Song, Howard H. Yang, Qi Zhang, Xianhua He
2022 conf
GLOBECOM (Workshops)
Jingze Che, Zhaoyang Zhang, Yingzhi Huang, Zhaohui Yang, Hangguan Shan, Zhiji Deng, Ming Liu
2021 conf
ISWCS
Meiyan Song, Howard H. Yang, Hangguan Shan, Jemin Lee, Huaming Lin, Tony Q. S. Quek
2021 J jnl
IEEE Commun. Lett.
Jing Pan, Hangguan Shan, Rongpeng Li, Yingxiao Wu, Weihua Wu, Tony Q. S. Quek
2021 conf
iThings/GreenCom/CPSCom/SmartData/Cybermatics
Jinkai Zheng, Phil K. Mu, Ziqian Man, Tom H. Luan, Lin X. Cai, Hangguan Shan
2021 B conf
GLOBECOM
Ziwei Zheng, Wei Wang, Hangguan Shan, Zhaoyang Zhang
2021 conf
WCSP
Yaru Fu, Quan Yu, Yue Zhang, Zheng Shi, Hong Wang, Hangguan Shan
2021 J jnl
Wirel. Networks
Xiaojian Zhen, Hangguan Shan, Guanding Yu, Yu Cheng, Lin X. Cai
2021 J jnl
IEEE Trans. Wirel. Commun.
Weihua Wu, Runzi Liu, Qinghai Yang, Hangguan Shan, Tony Q. S. Quek
2021 J jnl
IEEE Trans. Veh. Technol.
Ping Xiang, Hangguan Shan, Miao Wang, Zhiyu Xiang, Zhenguo Zhu
2021 conf
ICC
Qiming Zheng, Fen Hou, Hangguan Shan, Tom Hao Luan, Bin Lin
2021 J jnl
IEEE Commun. Lett.
Meiyan Song, Hangguan Shan, Howard H. Yang, Tony Q. S. Quek
2021 B conf
IWQoS
Qi Cheng, Hangguan Shan, Weihua Zhuang, Tony Q. S. Quek, Zhaoyang Zhang
2020 J jnl
IEEE Trans. Veh. Technol.
Chunhua Hong, Hangguan Shan, Meiyan Song, Weihua Zhuang, Zhiyu Xiang, Yingxiao Wu, Xiaoli Yu
2020 conf
VTC Fall
Zhongjie He, Hangguan Shan, Yuanguo Bi, Zhiyu Xiang, Zhou Su, Weihua Wu, Tom Hao Luan, Bin Wang
2020 J jnl
IEEE Trans. Wirel. Commun.
Hongli He, Hangguan Shan, Aiping Huang, Qiang Ye, Weihua Zhuang
2020 J jnl
IEEE Trans. Veh. Technol.
Shuai Zhang, Bo Yin, Yu Cheng, Lin X. Cai, Sheng Zhou, Zhisheng Niu, Hangguan Shan
2020 J jnl
IEEE Trans. Veh. Technol.
Ameer Ahmed, Hangguan Shan, Aiping Huang
2020 B conf
WCNC
Ping Xiang, Hangguan Shan, Zhaoyang Zhang, Lu Yu, Tony Q. S. Quek
2020 J jnl
CoRR
Meiyan Song, Hangguan Shan, Howard H. Yang, Tony Q. S. Quek
2020 J jnl
IEEE Trans. Veh. Technol.
Jiliang Li, Rui Xing, Zhou Su, Ning Zhang, Yilong Hui, Tom H. Luan, Hangguan Shan
2020 J jnl
IEEE Internet Things J.
Haoji Hu, Hangguan Shan, Chuankun Wang, Tengxu Sun, Xiaojian Zhen, Kunpeng Yang, Lu Yu, Zhaoyang Zhang, Tony Q. S. Quek
2019 J jnl
IEEE Access
Ameer Ahmed, Hangguan Shan, Aiping Huang
2019 J jnl
IEEE Wirel. Commun. Lett.
Hangguan Shan, Taojie Qin, Guanding Yu, Lin X. Cai, Yu Cheng, Tony Q. S. Quek
2019 B conf
GLOBECOM
Hongli He, Hangguan Shan, Aiping Huang, Qiang Ye, Weihua Zhuang
2019 B conf
ICIP
Jilin Tang, Haoji Hu, Qiang Zhou, Hangguan Shan, Chuan Tian, Tony Q. S. Quek
2019 J jnl
IEEE Access
Jiantao Yuan, Aiping Huang, Hangguan Shan
2019 conf
WCSP
Zhongjie He, Hangguan Shan, Yuanguo Bi, Zhiyu Xiang, Zhou Su, Tom Hao Luan
2019 B conf
ICIP
Yuxin Zhang, Huan Wang, Yang Luo, Lu Yu, Haoji Hu, Hangguan Shan, Tony Q. S. Quek
2018 J jnl
IEEE Trans. Wirel. Commun.
Jiamin Li, Aiping Huang, Hangguan Shan, Howard H. Yang, Tony Q. S. Quek
2018 conf
WCSP
Kunpeng Yang, Hangguan Shan
2018 B conf
GLOBECOM
Xiaojian Zhen, Hangguan Shan, Howard H. Yang, Tony Q. S. Quek, Aiping Huang
2018 J jnl
IEEE Trans. Wirel. Commun.
Qizhong Yao, Zhengchuan Chen, Tony Q. S. Quek, Aiping Huang, Hangguan Shan, Xijun Wang, Jianwu Zhang
2018 J jnl
IEEE Trans. Veh. Technol.
Jiantao Yuan, Aiping Huang, Hangguan Shan, Tony Q. S. Quek, Guanding Yu
2018 conf
WCSP
Qiming Zheng, Hangguan Shan
2018 J jnl
CoRR
Shuai Zhang, Lu Liu, Yu Cheng, Xianghui Cao, Sheng Zhou, Zhisheng Niu, Hangguan Shan
2018 Misc conf
ICCS
Haoji Hu, Hangguan Shan, Zhuolin Zheng, Zhuojun Huang, Chengfei Cai, Chuankun Wang, Xiaojian Zhen, Lu Yu, Zhaoyang Zhang, Tony Q. S. Quek
2018 conf
WCSP
Jiantao Yuan, Aiping Huang, Hangguan Shan
2018 B conf
GLOBECOM
Hongli He, Hangguan Shan, Aiping Huang, Qiang Ye, Weihua Zhuang
2018 J jnl
CoRR
Hangguan Shan, Taojie Qin, Guanding Yu, Lin X. Cai, Yu Cheng, Tony Q. S. Quek
2018 J jnl
IEEE Trans. Wirel. Commun.
Qizhong Yao, Aiping Huang, Hangguan Shan, Tony Q. S. Quek
2017 B conf
GLOBECOM
Sami Khairy, Lin X. Cai, Yu Cheng, Zhu Han, Hangguan Shan
2017 B conf
WCNC
Long Sun, Aiping Huang, Hangguan Shan, Lin Cai
2017 J jnl
J. Commun. Inf. Networks
Long Sun, Aiping Huang, Hangguan Shan, Lin Cai
2017 conf
GLOBECOM Workshops
Guoxiang Li, Hangguan Shan, Aiping Huang, Lin X. Cai, Fen Hou
2017 J jnl
IEEE Trans. Veh. Technol.
Long Sun, Hangguan Shan, Aiping Huang, Lin Cai, Hongli He
2017 J jnl
IEEE Access
Wei Wang, Ruining Lan, Jingxiong Gu, Aiping Huang, Hangguan Shan, Zhaoyang Zhang
2017 J jnl
IEEE Trans. Wirel. Commun.
Qizhong Yao, Tony Q. S. Quek, Aiping Huang, Hangguan Shan
2017 conf
VTC Fall
Xiaojian Zhen, Hangguan Shan, Guanding Yu, Yu Cheng, Lin X. Cai, Aiping Huang
2017 conf
VTC Fall
Danhui Yao, Lin Gui, Fen Hou, Fei Sun, Daihui Mo, Hangguan Shan
2017 J jnl
IEEE Access
Jiantao Yuan, Hangguan Shan, Aiping Huang, Tony Q. S. Quek, Yu-Dong Yao
2017 J jnl
IEEE Access
Hongli He, Hangguan Shan, Aiping Huang, Lin X. Cai, Tony Q. S. Quek
2017 conf
WCSP
Chaohui Zhao, Jiantao Yuan, Aiping Huang, Hangguan Shan
2017 J jnl
IEEE Trans. Wirel. Commun.
Zhao Chen, Lin X. Cai, Yu Cheng, Hangguan Shan
2017 J jnl
IEEE Trans. Veh. Technol.
Hangguan Shan, Yani Zhang, Weihua Zhuang, Aiping Huang, Zhaoyang Zhang
2016 J jnl
IEEE Trans. Intell. Transp. Syst.
Yuanguo Bi, Hangguan Shan, Xuemin Sherman Shen, Ning Wang, Hai Zhao
2016 conf
SPAWC
Qizhong Yao, Aiping Huang, Hangguan Shan, Tony Q. S. Quek, Wei Wang
2016 J jnl
IEEE Trans. Wirel. Commun.
Qimei Chen, Guanding Yu, Hangguan Shan, Amine Maaref, Geoffrey Ye Li, Aiping Huang
2016 J jnl
IEEE Trans. Wirel. Commun.
Gong-Zheng Zhang, Tony Q. S. Quek, Aiping Huang, Hangguan Shan
2016 J jnl
IEEE Trans. Wirel. Commun.
Qizhong Yao, Aiping Huang, Hangguan Shan, Tony Q. S. Quek, Wei Wang
2016 J jnl
IEEE Trans. Commun.
Gong-Zheng Zhang, Tony Q. S. Quek, Marios Kountouris, Aiping Huang, Hangguan Shan
2016 J jnl
IEEE Trans. Veh. Technol.
Hongli He, Hangguan Shan, Aiping Huang, Long Sun
2016 J jnl
CoRR
Hangguan Shan, Yani Zhang, Weihua Zhuang, Aiping Huang, Zhaoyang Zhang
2016 B conf
GLOBECOM
Jingyi Sun, Fen Hou, Shaodan Ma, Hangguan Shan
2015 B conf
GLOBECOM
Qimei Chen, Guanding Yu, Hangguan Shan, Amine Maaref, Geoffrey Ye Li, Aiping Huang
2015 J jnl
IEEE Trans. Veh. Technol.
Miao Wang, Hangguan Shan, Tom H. Luan, Ning Lu, Ran Zhang, Xuemin Shen, Fan Bai
2015 conf
SPAWC
Gong-Zheng Zhang, Tony Q. S. Quek, Aiping Huang, Marios Kountouris, Hangguan Shan
2015 J jnl
Ad Hoc Networks
Fei Wu, Cunqing Hua, Hangguan Shan, Aiping Huang
2015 conf
CCNC
Tingting He, Hangguan Shan, Aiping Huang
2015 conf
VTC Fall
Gong-Zheng Zhang, Tony Q. S. Quek, Aiping Huang, Marios Kountouris, Hangguan Shan
2015 conf
SPAWC
Gong-Zheng Zhang, Aiping Huang, Tony Q. S. Quek, Hangguan Shan
2015 B conf
GLOBECOM
Ruining Lan, Wei Wang, Aiping Huang, Hangguan Shan
2015 J jnl
KSII Trans. Internet Inf. Syst.
Hangguan Shan, Ziyun Ye, Yuanguo Bi, Aiping Huang
2015 conf
WCSP
Chaohui Zhao, Cheng Wang, Aiping Huang, Hangguan Shan
2015 J jnl
IEEE Trans. Veh. Technol.
Tianyi Chen, Hangguan Shan, Xin Wang
2015 J jnl
IEEE Trans. Veh. Technol.
Miao Wang, Hangguan Shan, Rongxing Lu, Ran Zhang, Xuemin Shen, Fan Bai
2015 C conf
ICCC
Hongli He, Hangguan Shan, Aiping Huang, Long Sun
2015 B conf
GLOBECOM
Yani Zhang, Hangguan Shan, Weihua Zhuang, Aiping Huang
2015 conf
ICC
Gong-Zheng Zhang, Aiping Huang, Tony Q. S. Quek, Hangguan Shan
2014 J jnl
IEEE J. Sel. Areas Commun.
Gong-Zheng Zhang, Aiping Huang, Hangguan Shan, Jian Wang, Tony Q. S. Quek, Yu-Dong Yao
2014 conf
ICC
Jingxiong Gu, Wei Wang, Aiping Huang, Hangguan Shan, Zhaoyang Zhang
2014 conf
WCSP
Xiaofeng Xin, Wei Wang, Aiping Huang, Hangguan Shan
2014 conf
VTC Fall
Long Sun, Aiping Huang, Hangguan Shan, Min Xing, Lin Cai
2014 B conf
PIMRC
Xiaofeng Xin, Wei Wang, Aiping Huang, Hangguan Shan
2014 B conf
PIMRC
Cheng Wang, Aiping Huang, Dongdong Fan, Hangguan Shan, Zhouyun Wu, Hongcheng Zhuang
2014 J jnl
IEEE Trans. Wirel. Commun.
Hangguan Shan, Zhifeng Ni, Weihua Zhuang, Aiping Huang, Wei Wang
2013 conf
WCSP
Yuanguo Bi, Hangguan Shan, Hai Zhao
2013 conf
WCSP
Zhifeng Ni, Hangguan Shan, Wei Shen, Jian Wang, Aiping Huang, Xin Wang
2013 conf
VTC Spring
Gong-Zheng Zhang, Aiping Huang, Jian Wang, Hangguan Shan, Tony Q. S. Quek
2013 conf
WCSP
Cheng Wang, Zhouyun Wu, Aiping Huang, Hangguan Shan, Liang Shen, Zhoushi Xiong
2013 conf
WCSP
Dongdong Fan, Zhouyun Wu, Aiping Huang, Hangguan Shan, Hongcheng Zhuang
2013 B conf
PIMRC
Jingxiong Gu, Wei Wang, Aiping Huang, Hangguan Shan
2013 conf
WONS
Miao Wang, Hangguan Shan, Rongxing Lu, Ran Zhang, Xuemin (Sherman) Shen, Fan Bai
2013 conf
WCSP
Ningkai Zhou, Hangguan Shan, Aiping Huang, Xin Wang
2013 J jnl
CoRR
Hangguan Shan, Zhifeng Ni, Weihua Zhuang, Aiping Huang, Wei Wang
2012 conf
WCSP
Liren Lai, Jian Wang, Aiping Huang, Hangguan Shan
2012 B conf
GLOBECOM
Fei Wu, Cunqing Hua, Hangguan Shan, Aiping Huang
2012 J jnl
CoRR
Fei Wu, Cunqing Hua, Hangguan Shan, Aiping Huang
2012 B conf
PIMRC
Fei Wu, Cunqing Hua, Hangguan Shan, Aiping Huang
2012 conf
GLOBECOM Workshops
Liren Lai, Jian Wang, Aiping Huang, Hangguan Shan
2012 conf
ICC
Miao Wang, Hangguan Shan, Lin X. Cai, Ning Lu, Xuemin (Sherman) Shen, Fan Bai
2011 J jnl
IEEE Trans. Wirel. Commun.
Hangguan Shan, Ho Ting Cheng, Weihua Zhuang
2011 conf
CHINACOM
Hangguan Shan, Weihua Zhuang
2011 B conf
WCNC
Xigang Huang, Hangguan Shan, Xuemin Shen
2011 conf
ICC
Ho Ting Cheng, Hangguan Shan, Weihua Zhuang
2010 conf
ICTC
Hongbin Liang, Lin X. Cai, Hangguan Shan, Xuemin Shen, Daiyuan Peng
2010 B conf
GLOBECOM
Hangguan Shan, Weihua Zhuang, Ho Ting Cheng
2009 conf
ICC
Hangguan Shan, Weihua Zhuang, Zongxin Wang
2009 J jnl
IEEE Commun. Mag.
Hangguan Shan, Weihua Zhuang, Zongxin Wang
2008 B conf
GLOBECOM
Lin X. Cai, Hangguan Shan, Weihua Zhuang, Xuemin Shen, Jon W. Mark, Zongxin Wang
2008 B conf
GLOBECOM
Hangguan Shan, Ping Wang, Weihua Zhuang, Zongxin Wang
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()