QBDI全名为QuarkslaB Dynamicbinary Instrumentation,它是一个模块化的跨平台以及跨架构的DBI框架。该工具目前支持Linux、macOS、Android、iOS和Windows操作系统,支持的架构有x86、x86-64、ARM和AArch64架构。QBDI的模块化特征意味着它不需要包含任何首选的注入方法,并且可以结合外部注入工具一起使用。QBDI包含了一个基于LD_PRELOAD的小型Linux以及一个动态可执行的macOS注入器(QBDIPreload),它们是QBDI的Python绑定基础,即pyQBDI。QBDI还整合了Frida,一个动态指令工具集。
QBDI针对x86-64架构的支持已经非常成熟了,虽然该工具目前仍针对ARM架构在进行开发,但已经足够执行类似ls或cat这样简单的CLI程序了。工具计划增加对x86和AArch64的支持。
但是,QBDI目前无法处理信号、多线程和C++异常机制。
在构建该项目时,系统需要满足下列依赖:cmake、make(针对Linux和macOS)、ninja(针对Android)、Visual Studio(针对Windows)和C++ 11工具集。
1.构建本地代码以及依赖; 2.使用代码库构建QBDI;
当前的依赖组件需要用户构建LLVM和Google Test,我们需要本地构建 LLVM,因为QBDI需要使用常规LLVM没有对外提供的私有API,而且QBDI也只能匹配指定版本的API。第一步的操作会进行缓存,并且只用执行一次,后续的构建操作只需要重复第二步骤即可。
QBDI需要使用cmake构建,并要求传递构建配置标识。为了简化操作,我们提供了一个Shell脚本来完场常规配置的构建,大家也可以根据自己的需要来修改脚本,完成QBDI的自定义编译。
在项目结构的根路径创建一个新的目录,并执行Linux配置脚本:
mkdir buildcd build../cmake/config-linux-X86_64.sh
如果构建脚本时提醒你缺失平台依赖的话,你需要重新构建依赖并执行下列命令:
make llvm
make gtest
该命令会重构平台上的依赖组件,接下来你可以重新运行配置脚本并完成项目编译:
../cmake/config-linux-X86_64.sh
make -j4
针对ARM架构,用户可以使用config-linux-ARM.sh配置脚本来完成环境配置,不过这个脚本需要大家针对自己的跨架构编译工具链来进行定制修改:
1.正确的代码必须导出至AS、CC、CXX和STRIP环境变量。 2.「-DCMAKE_C_FLAGS」和「-DCMAKE_CXX_FLAGS」需要包含正确的默认标识(取决于使用的工具链),至少要修改ARM_ARCH、ARM_C_INCLUDE和ARM_CXX_INCLUDE。
在macOS上编译QBDI需要满足下列条件:
1.Sierra以上版本的macOS; 2.XCode; 3.命令行工具(xcode-select—install); 4.包管理器,例如MacPorts或HomeBrew; 5、 某些工具包(port install cmakewget);
满足上述条件后,在项目目录的根节点新建一个目录,然后执行 macOS 配置脚本:
mkdir build
cd build
../cmake/config-macOS-X86_64.sh
如果构建脚本时提醒你缺失平台依赖的话,你需要重新构建依赖并执行下列命令:
make llvm
make gtest
该命令会重构平台上的依赖组件,接下来你可以重新运行配置脚本并完成项目编译:
../cmake/config-linux-X86_64.shmake -j4
在Windows上构建项目需要安装Python 3,以及最新版本的CMake。
首先,需要修改config-win-X86_64.py来匹配安装好的Visual Studio,然后运行下列代码:
mkdir buildcd buildpython../cmake/config-win-X86_64.py
如果构建脚本时提醒你缺失平台依赖的话,你需要重新构建依赖并执行下列命令:
MSBuild.exedeps\llvm.vcxprojMSBuild.exedeps\gtest.vcxproj
该命令会重构平台上的依赖组件,接下来你可以重新运行配置脚本并完成项目编译:
python../cmake/config-win-X86_64.pyMSBuild.exe/p:Configuration=Release ALL_BUILD.vcxproj
针对Android平台,需要Android NDK,该功能只在Linux平台上测试过。配置脚本config-android-ARM.sh需要修改以匹配NDK版本以及目标平台:
1.NDK_PATH需指向Android NDK; 2.SDKBIN_PATH需要补充完整,指向NDK所使用的工具集; 3.API_LEVEL需匹配目标Android API版本; 4.正确的代码必须导出至AS、CC、CXX和STRIP环境变量;
QBDI:https://github.com/QBDI/QBDI
*参考来源:QBDI,FB小编Alpha_h4ck编译,转载请注明来自 FreeBuf.COM