OSUSecLab/vSim
GitHub: OSUSecLab/vSim
这是一个基于语义感知值提取技术的二进制代码相似性分析框架,通过定制的符号执行引擎解决跨编译器及优化级别下的高效函数匹配问题。
Stars: 10 | Forks: 0
# 安装说明
```
pip install -r requirements.txt
```
然后,在 `vSim` 目录中,运行
```
export PYTHONPATH=$(pwd)
export VSIM_HOME=$(pwd)
```
### Docker 镜像
您可以使用 docker 镜像尝试我们的构建产物
```
# 创建 image
docker build -t vsim:0.1 .
# 启动 container
docker run --name ndss26ae -it -d vsim:0.1
# 使用 bash
docker exec -it ndss26ae bash
cd /vSim && source source.sh
```
# 使用 IDA 进行预处理
脚本 `ida/ida_script.py` 已在 IDA v7.5 上进行测试。
```
-A -S"ida/ida_script.py " bin_path
```
`output_path` 用于存储提取的二进制函数条目。
对于剥离符号表(stripped)的二进制文件,vSim 依赖 IDA 来识别函数条目。
# 值提取
要运行我们定制的符号执行引擎,请运行以下命令。
请记住 `dump_dir` 和 `cache_dir`。
在 `dump_dir` 中,您将获得许多 `.pkl` 文件。
在 `cache_dir` 中,有一个 `*.pkl` 文件,它存储了预处理的二进制信息。
```
# 使用 ida 的 binary function entries
python ./src/bin_analyzer.py \
--bin \
--dump \
--cache \
--ida \
--loglevel 0 \
--workers
```
# 指纹生成
此过程结合了我们的值过滤、归一化和具体化。
请准备一个 CSV 文件,其中包含列 `binary,dump_dir,cache_dir,bin_id`。
`binary`、`dump_dir` 和 `cache_dir` 是值提取时使用的绝对路径。
`bin_id` 是该二进制文件的标识符。
从同一源代码编译的二进制文件应具有相同的 `bin_id`。
请修改 `csv_path` 和 `fingerprint_dir` 的路径。
- `csv_path` 是上述提到的 CSV 文件。
- `fingerprint_dir` 是用于存储所有生成指纹的目录
```
from utils import *
import logging
from src.pool.pool import BinaryPool
from src.bin_analyzer import BinAnalyzer
from src.sim.base import SimBase
csv_path = 'xxx'
fingerprint_dir = 'yyy'
func_pool_path = csv_path + '.pkl'
expr_timeout = 30
workers = 32
e_workers = 1
mode = 'refined'
if __name__ == '__main__':
expr_logger = get_logger_for_file(logging.ERROR, 'expr_sim')
get_logger_for_file(logging.ERROR, logname='binary_pool')
binary_pool = BinaryPool(csv_path, fingerprint_dir)
if os.path.exists(func_pool_path):
func_pool = load_pkl(func_pool_path)
else:
func_pool = binary_pool.build_function_pool(
workers=workers,
expr_vec_workers=e_workers,
mode=mode,
expr_timeout=expr_timeout)
dump_pkl(func_pool, csv_path + '.pkl')
```
# 函数池构建和相似性分析
上述步骤已构建了二进制文件池。
给定两个二进制池(例如,gcc-O0 池和 gcc-O3 池),我们可以对它们执行成对匹配。
运行以下代码将执行指纹传播,
构建 pandas Dataframe 作为函数池,
并成对计算它们的相似度。
```
from scripts.pool_pairwise_match import SETTINGS, get_ppw, run
csv1 = 'xxx'
csv2 = 'yyy'
fingerprints_dir = 'zzz'
pool_size = 10000
# 如果你第一次比较这两个 binary pools,它应该是 false
# 然后,你可以将其设置为 True 并始终比较相同的 function pairs
load_existing_key=False
setting='all_features'
top_k, mrr, cost = run(csv1, csv2,
fingerprints_dir, pool_size, setting,
load_existing_key=load_existing_key,
key_path=key_file_path,
with_weights=True, workers=64)
res.append({'db_csv': csv1,
'input_csv': csv2,
'setting': setting,
'top_k': top_k,
'K_list': [1, 3, 5, 10, 50, 100],
'mrr': mrr,
'MRR_K_list': [None, 10, 100],
'pool_size': pool_size,
'cost': cost})
print(csv1, csv2, top_k, mrr)
```
# 复现结果指南
假设解压后的 vSim 目录路径为 `$VSIM_HOME`。
首先,确保已设置两个环境变量
```
export PYTHONPATH=$(pwd)
export VSIM_HOME=$(pwd)
```
在 docker 镜像中,运行 `cd /vSim && source source.sh` 具有相同的效果。
## 准备工作
请先下载数据集和测试的 zip 文件。
请进入 `$VSIM_HOME/test` 文件夹并解压所有 zip 文件:
```
unzip cross-optimization.zip
unzip cross-compiler.zip
unzip GMN-dataset-2.zip
unzip GMN-vul.zip
```
在 `$VSIM_HOME` 目录中,请运行 `mkdir datasets`;
然后,请从以下链接下载数据集
+ [pem.zip](https://drive.google.com/file/d/1QLuUNay0o_HAFjfCWY4AwhinFX6P7c14/view?usp=sharing) (此数据集已包含在仓库中)
+ [GMN-D2.zip](https://drive.google.com/file/d/1Y1Umc9CV9xgE1Vwdevk9okOx1TFaWsY4/view?usp=sharing)
+ [binkit_xc.zip](https://drive.google.com/file/d/14J4tyShU3Oy2MPNAl8YQQrpU7dM_aHrB/view?usp=sharing)
请解压 `binkit_xc.zip`。\
请使用密码 `ndss26ae` 解压 `GMN-D2.zip`。
这些二进制文件也可以从 [PEM](https://dl.acm.org/do/10.5281/zenodo.8271984/full),
[GMN](https://github.com/Cisco-Talos/binary_function_similarity),
和 [BinKit](https://github.com/SoftSec-KAIST/BinKit) 的发布产物中获取(我们使用 [ver. 2.0 数据集](https://drive.google.com/file/d/1TrjFnv6BMpVEXYukVxrhlQ78S0NPKEXa/view?usp=share_link))。
下载所有文件后,将其解压到 `$VSIM_HOME/datasets` 中。
如果您尝试复现我们论文中的结果,请还下载以下 zip 文件并将它们放入 `test` 文件夹。
+ [cross-compiler.zip](https://drive.google.com/file/d/1EoQWEJ1t6IOZjz7B_te0VzcG5dK-5Yi0/view?usp=sharing)
+ [cross-optimization.zip](https://drive.google.com/file/d/1kBx_ANUkHrGHjnkKFlRrf2IwF86-xsxF/view?usp=sharing)
+ [GMN-dataset-2.zip](https://drive.google.com/file/d/1jZsl80LuXNkR7GBZb6svdPpFdCXkAur9/view?usp=sharing)
+ [GMN-vul.zip](https://drive.google.com/file/d/13mZFz30p_6RRGfj2JEJyvEFmWDcvhdZJ/view?usp=sharing)
准备步骤完成后,我们的文件夹结构如下
```
vSim # $VSIM_HOME
├─ ida
│ └─ ida_script.py # the IDA Python script for preprocessing
├─ src # source code of vSim
├─ scripts # some useful scripts
├─ datasets # directory for storing raw binaries
│ ├─ pem-trex # binaries for cross-optimization
│ ├─ binkit_xc # binaries for cross-compiler
│ └─ Dataset-2 # GMN-dataset-2 for cross-architecture
│
├─ test
│ ├─ cross-optimization # directory for test cross-optimization
│ │ ├─ se_cmds.txt # command lines for value extraction
│ │ ├─ fp-gen.py # script for fingerprint generation
│ │ ├─ fp-no-refine-gen.py #script for fingerprint generation without filtering
│ │ ├─ test_pool_pairwise_match.py # script for running comparison
│ │ ├─ fp-refined # fingerprints with value filtering
│ │ ├─ fp-no-refined # fingerprints without value filtering
│ │ ├─ table_1 # directory for running comparison
│ │ │ ├─ O0_pool.csv
│ │ │ ├─ O2_pool.csv
│ │ │ └─ O3_pool.csv
│ │
│ ├─ cross-compiler # directory for test cross-compiler
│ │ ├─ ... # similar to cross-optimization folder
│ ├─ GMN-dataset-2
│ ├─ GMN-vul
│ │ └─Dataset-Vulnerability # GMN vulnerability dataset
```
## 快速运行
```
bash AE_fast_run.sh
```
这些命令将打印我们论文中 vSim 的结果表。
表 III、IV、V 是不言自明的。
表 V 中的检索时间是打印的时间成本之和。
对于表 VI,您将看到
```
x86:NETGEAR_R7000
0 0.875
x86:NETGEAR_R7000
0 2;1;1;1
```
`x86:NETGEAR_R7000` 表示结果是 x86 和 NETGEAR\_R7000 之间的比较
`0.875` 是 MRR@10,`2;1;1;1` 是比较用例的排名。请参阅 GMN [论文](https://www.usenix.org/system/files/sec22-marcelli.pdf) 中的表 6。
## 玩具示例
这是一个用于演示的玩具示例。请运行
```
bash AE_toy.sh
```
## 复现比较结果
使用我们提供的指纹执行比较。
注意:重新运行比较将需要尽可能多的 CPU 核心。
```
# 在 Table III 中显示 vSim 的结果
bash AE_rerun_cross-optimization.sh
# 在 Table IV 中显示 vSim 的结果
bash AE_rerun_cross-compiler.sh
# 在 Table V 中显示 vSim 的结果
bash AE_rerun_GMN-D2.sh
# 在 Table VI 中显示 vSim 的结果
bash AE_rerun_GMN-vul.sh
```
## 完整复现所有结果,包括指纹生成
删除缓存的指纹并重新生成指纹
注意:此过程极其耗时,可能需要几天时间
```
# 在 Table III 中显示 vSim 的结果
bash AE_rerun_cross-optimization.sh full
# 在 Table IV 中显示 vSim 的结果
bash AE_rerun_cross-compiler.sh full
# 在 Table V 中显示 vSim 的结果
bash AE_rerun_GMN-D2.sh full
# 在 Table VI 中显示 vSim 的结果
bash AE_rerun_GMN-vul.sh full
```
# Bibtex
如果这项工作对您的研究有帮助,请考虑引用以下 bibtex 条目。
```
@inproceedings{wang2026vsim,
title={{vSim}: Semantics-aware value extraction for efficient binary code similarity analysis},
author={Wang, Huaijin and Lin, Zhiqiang},
year={2026},
booktitle={Network and Distributed Systems Security (NDSS) Symposium}
}
```
标签:Docker, IDA Pro, NDSS 2026, Python, vSim, 二进制代码相似性分析, 二进制分析, 云安全运维, 云资产清单, 代码比对, 值提取, 可配置连接, 安全防御评估, 指纹生成, 无后门, 程序分析, 符号执行, 网络安全, 语义感知, 请求拦截, 逆向工具, 逆向工程, 隐私保护