工具介绍

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

x86-64

在项目结构的根路径创建一个新的目录,并执行 Linux 配置脚本:

mkdir build
cd build
../cmake/config-linux-X86_64.sh

如果构建脚本时提醒你缺失平台依赖的话,你需要重新构建依赖并执行下列命令:

make llvm

make gtest

该命令会重构平台上的依赖组件,接下来你可以重新运行配置脚本并完成项目编译:

../cmake/config-linux-X86_64.sh

make -j4

ARM 编译

针对 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

在 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.sh

make -j4

Windows

在 Windows 上构建项目需要安装 Python 3,以及最新版本的 CMake。

首先,需要修改 config-win-X86_64.py 来匹配安装好的 Visual Studio,然后运行下列代码:

mkdir build

cd build

python../cmake/config-win-X86_64.py

如果构建脚本时提醒你缺失平台依赖的话,你需要重新构建依赖并执行下列命令:

MSBuild.exedeps\llvm.vcxproj

MSBuild.exedeps\gtest.vcxproj

该命令会重构平台上的依赖组件,接下来你可以重新运行配置脚本并完成项目编译:

python../cmake/config-win-X86_64.py

MSBuild.exe/p:Configuration=Release ALL_BUILD.vcxproj

Android

针对 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:【GitHub 传送门

教你如何使用QBDI动态二进制检测框架的更多相关文章

  1. 冰蝎动态二进制加密WebShell基于流量侧检测方案

    概述 冰蝎是一款新型动态二进制加密网站工具.目前已经有6个版本.对于webshell的网络流量侧检测,主要有三个思路.一:webshell上传过程中文件还原进行样本分析,检测静态文件是否报毒.二:we ...

  2. 【原创】利用动态二进制加密实现新型一句话木马之PHP篇

    概述 本系列文章重写了java..net.php三个版本的一句话木马,可以解析并执行客户端传递过来的加密二进制流,并实现了相应的客户端工具.从而一劳永逸的绕过WAF或者其他网络防火墙的检测. 本来是想 ...

  3. Objective-C 【动态类型检测&响应方法】

    ------------------------------------------- 动态类型检测 代码: #import <Foundation/Foundation.h> @inte ...

  4. Android+openCV 动态人脸检测

    动态人脸检测前提是需要打开摄像头. 网上看了很多教程,我知道的有两种方式打开摄像头: JavaCameraView mCameraView = new JavaCameraView(this, -1) ...

  5. 六.OC基础--1. id和instancetype类型,2.动态类型检测,3.响应方法,构造方法,4.重写构造方法,5.自定义构造方法

    1. id和instancetype类型, id和instancetype类型区别: 1. id和instancetype都可以用来作为方法的返回值 2. id可以用来定义类型,instancetyp ...

  6. 手把手教你用深度学习做物体检测(五):YOLOv1介绍

    "之前写物体检测系列文章的时候说过,关于YOLO算法,会在后续的文章中介绍,然而,由于YOLO历经3个版本,其论文也有3篇,想全面的讲述清楚还是太难了,本周终于能够抽出时间写一些YOLO算法 ...

  7. 手把手教你用深度学习做物体检测(六):YOLOv2介绍

    本文接着上一篇<手把手教你用深度学习做物体检测(五):YOLOv1介绍>文章,介绍YOLOv2在v1上的改进.有些性能度量指标术语看不懂没关系,后续会有通俗易懂的关于性能度量指标的介绍文章 ...

  8. 插桩 inline hook 动态二进制插桩的原理和基本实现过程

    插桩测试 https://source.android.google.cn/compatibility/tests/development/instrumentation https://zhuanl ...

  9. iOS回顾笔记(05) -- 手把手教你封装一个广告轮播图框架

    html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...

随机推荐

  1. Redis 学习-持久化与主从复制

    一.持久化 1. RDB rdb 是 redis 内存到硬盘的快照,用于持久化 ①. 通过执行命令,主动保存快照 save # 执行保存快照,执行时 redis 会处理阻塞状态直至执行完成. bgsa ...

  2. 安装folly库以及folly的ConcurrentHashMap的简单使用

    我在写grpc的实例时, 需要使用一个多线程的hash map, C++标准库中没有多线程的hash map, facebook开源的folly中存在大量的基础类, 中间存在一个高性能的hash ma ...

  3. mybatis返回map类型数据空值字段不显示的解决方法

    在日常开发中,查询数据返回类型为map,数据库中有些自动值为null,则返回的结果中没有值为空的字段,则如何显示值为空的字段呢? Spring boot + MyBatis返回map中null值默认不 ...

  4. django后台xadmin如下配置(小结)

    django-admin文档:https://xadmin.readthedocs.io/en/latest/index.html目录: 1.xadmin基本配置 2.配置后台显示的模型类 3.后台注 ...

  5. Access、Trunk和Hybrid三种端口模式

    网络交换机(英语:Network switch)是一个扩大网络的器材,能为子网中提供更多的连接端口,以便连接更多的电脑. 通俗来说其起到的作用就是把一个网络端口分成多个网络端口 交换机和路由器的区别 ...

  6. VLAN实验2:配置Trunk接口

    实验环境公司规模较大200多个员工.内部网络是一个较大的局域网,有两台交换机S1和S2来负责员工网络的接入,接入交换机之间通过汇聚交换机S3相连.公司通过划分VLAN来隔离广播域,由于员工较多,同部门 ...

  7. Spring Boot SockJS应用例子

    1.SockJS用javascript实现的socket连接,兼容各种浏览器的WebSocket支持库2.WebSocket是H5的,不支持H5的浏览器没法使用.3.SockJS它提供类似于webso ...

  8. server端和前端的区别

    1.服务稳定性 server端可能会遭受各种恶意攻击和误操作 单个客户端可以意外挂掉,但是服务端不能 node中用pm2做进程守候,一旦挂掉,自己会重启 2.考虑内存和cpu(优化,扩展) 客户端独占 ...

  9. nodejs模块化标准

    commonjs 导出一个 a.js function add(a, b){ return a+b; } module.exports = add; b.js const add = require( ...

  10. Codeforces D. Powerful array(莫队)

    题目描述: Problem Description An array of positive integers a1, a2, ..., an is given. Let us consider it ...