仿真路线:前端arm提取trace,后端x86
前端:arm-ubuntu,由板子提供,部署Snipersim和DynamoRIO,用于trace产生
后端:x86-pc,部署Snipersim和Capstone,用于分析
本文记录根据snipersim/README.arm64 at main · snipersim/snipersim (github.***)实验过程-前端trace提取
使用的板子是树莓派5-arrch64
1.Snipersim
1.1 snipersim部署
按照以下步骤进行
#snipersim源码
git clone https://github.***/snipersim/snipersim.git
#将snipersim源码路径记为SIM_ROOT_ARM,但个人直接笨方法,路径全部列出
#只编译libsift.a成功即可
cd $(SIM_ROOT_ARM)/sift
#snipersim的编译需要在python2的环境中,下面会进行python2环境搭建
snipersim的环境需要在python2的环境中进行搭建,下面进行python2环境搭建介绍
1.2 python版本管理工具-miniforge
最近发现一个个人认为比较好用的环境管理工具--miniforge
他和conda的用法是一样的,但是安装更为方便:
#以下是一些常用用法
#查看conda版本
conda -V
#新建conda环境
conda create --name 环境名 python=3.7
#查看已有环境
conda env list
#激活环境
conda activate 环境名
#退出当前环境,回到上一环境
conda deactivate
#删除环境
conda remove -n 环境名 --all
miniforge下载网址:conda-forge/miniforge: A conda-forge distribution. (github.***)
在网页的readme中找到相应架构所对应的压缩包,我选择的是第二个aarch64结构的:
#在arm板子上,以下链接是当时最新链接
wget https://github.***/conda-forge/miniforge/releases/latest/download/Miniforge3-Linux-aarch64.sh
# cd 进入刚才miniforge下载目录
bash Miniforge3-Linux-aarch64.sh -b
# 安装结束后,输入以下指令进行 conda初始化
~/miniforge3/bin/conda init
#记得最后要重启终端
#创建python2的环境,一路yes
conda create --name py2 python=2.7
#激活python2的环境
conda activate py2
1.3 snipersim编译
在snipersim的makefile.config文件中修改如下内容,使之能成功识别我们的板子即可
修改完成之后在snipersim/sift下执行make
#进入py2的环境下
make
这里不需要全部编译完成,只需要libsift.a编译完成即可;因为后续部分功能arm并不支持,因此报错。
2 DynamoRIO
按照如下步骤进行
tip:此时需要切换回python3的环境,可以另外创建(或deactivate 返回base ,一般为python3)
#dynamorio源码下载,记dynamorio根目录为DR_ROOT
git clone --recurse-submodules -j4 https://github.***/DynamoRIO/dynamorio.git
#创建连接
ln -s $(SIM_ROOT_ARM)/frontend/dr-frontend $(DR_ROOT)/clients/dr-frontend
#编译
cd dynamorio
mkdir build && cd build
cmake ..
#可能无法成功,按照之后提示修改
make -j4
make不一定会成功,需要进行如下修改:
2.1 SNIPER_HOME赋值
文件位于(DR_ROOT)\clients\dr-frontend\CMakeList.txt:
在文件42行加入SNIPER_HOME的复制路径,为snipersim的根目录
2.2 未定义droption_t报错
在文件$(DR_ROOT)/clients/dr-frontend/dr_fe__options.h
和$(DR_ROOT)/clients/dr-frontend/dr_fe_options.t***加入以下内容:
2.3 dyn_addresses
数组越界
在文件$(SIM_ROOT_ARM)/frontend/frontend_defs.h中进行修改,猜测,能跑就行
完成以上修改,在进行make
make
#创建连接
ln -s $(DR_ROOT)/build $(SIM_ROOT_ARM)/dynamorio
3 TRACE生成
随便写个代码:test.c
#include <stdio.h>
int main(){
printf("hello, world");
return 0;
}
g*** -o test test.c
不知为何readme所给指令是“-c $(SIM_ROOT_ARM)/dynamorio/clients/lib64/debug/libdr-frontend.so”,而$(SIM_ROOT_ARM)/dynamorio/clients/lib64文件夹下只有release文件夹,将其名字修改为debug;
同时,修改以下release文件夹名称为debug(或者复制文件夹):$(DR_ROOT)/build/client/lib64/release、$(DR_ROOT)/build/lib64/release、$(DR_ROOT)/build/ext/lib64/release
$(SIM_ROOT_ARM)/dynamorio/bin64/drrun -debug -loglevel 1 -c $(SIM_ROOT_ARM)/dynamorio/clients/lib64/debug/libdr-frontend.so -roi 0 -f 0 -d 0 -b 0 -o NAME_OF_TRACE -e 0 -s 0 -r 0 -stop 0 -verbose -- PROGRAM
#即可产生NAME_OF_TRACE.sift文件