代码地址:GitHub - inoueke-n/optimization-detector: Optimization detection over compiled binaries [[Identifying Compiler and Optimization Level in Binary Code From Multiple Architectures]]

准备

  • 实验用到的数据集 following link.
  • 也可以自己按照 readme. md 文件中的 generation 节中的步骤来自己生成数据集。(因为文章中提到的担心被库文件污染,所以需要 docker 环境来生成)

文档结构

  • Resources 存储测试的二进制文件
  • Tests 和 src 文件存储源代码
  • generate_dataset.py 文件负责生成数据集(准确的说是交叉编译生成所需的二进制文件)
  • optimization-detector.py 文件负责文件的提取(可执行数据),预处理(平衡数据集),训练、评估、推断。

数据集文件结构

  • Dataset 文件夹下的是已经经过预处理的数据集,raw 后缀表示采用原始字节作为输入,func 表示按照函数边界进行了拆分

    • 但是没有优化等级是 O3 的数据啊
  • 突然懂了这个逻辑,process 的输入是 func 和 raw 文件,输出 train. bin、test. Bin、validate. Bin 文件,然后 train 用 train. Bin 、validate. Bin 文件训练,evaluate 用 test. Bin 看效果

  • Multi 表示将 gcc 和 clang 混合

复现

首先要安装依赖 因为直接用作者数据集,所以先跳过数据生成和处理的部分

评估

python3 optimization-detector. py evaluate -m <model> -o output. csv <dataset_dir>

  • Model 是. h5 文件
  • Dataset_dir 是 test. bin 文件,但是注意这里写路径就行,不用指明文件名(因为代码里面写死了文件名就是 test. bin)
    • 这里有个坑,代码里面会验证数据集的第一个字节是不是 27,但是作者给的数据集里面的数据文件第一个字节都是 26,需要手动改一下
    • 2.27,现在卡在了作者自定义的 generator 类与 TensorFlow 的 data_adapter 不协调上

训练

python3 optimization-detector.py train -n <network_type> <model_dir>

  • network_type 选择 lstm 或者 cnn
  • model_dir 是包含数据集(预处理后)的文件夹
  • 会在 model_dir 路径下生成 logs 文件夹

问题

  • 数据集里面怎么还有一个代码文件
  • 没有 O3 级别的数据集
  • 貌似也没有区分架构
  • 为什么多分了一个全连接层的模型
  • Mixed 未知