工具介绍

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. python 版本号比较 重载运算符

    # -*- coding: utf-8 -*- class VersionNum(object): """ 版本号比较 默认版本以“.”分割,各位版本位数不超过3 例一: ...

  2. curl 获取状态返回码

    [root@1708mode ~]# curl -o /dev/null -s -w "%{http_code}\n" baidu.com200 朋友问,就有了 wget 没学会& ...

  3. spice在桌面虚拟化中的应用系列之二(Linux平台spice客户端的编译安装,支持USB映射)

    1.系统环境 1.1 测试环境 centos6.4最小化安装(centos6.x桌面版也适用) 使用yum源为163源加EPEL源 1.2 spice客户端介绍 spice作为远程连接工具,可以支持远 ...

  4. python判断目录或者文件

    1. 判断目录是否存在 'isdir',删除目录时只有该目录为空才可以 'rmdir' import os if(os.path.isdir('D:/Python_workspace/spyder_s ...

  5. MYSQL中的乐观锁实现(MVCC)简析

    https://segmentfault.com/a/1190000009374567#articleHeader2 什么是MVCC MVCC即Multi-Version Concurrency Co ...

  6. 【转】Java奇技淫巧-插件化注解处理API(Pluggable Annotation Processing API)

    参考资料 JDK6的新特性之六:插入式注解处理API(Pluggable Annotation Processing API) Java Annotation Processing and Creat ...

  7. [转]LINUX最大线程数及最大进程数

    原文:https://blog.csdn.net/wowocpp/article/details/86673886 --------------------- cat /proc/sys/kernel ...

  8. P2680 运输计划[二分+LCA+树上差分]

    题目描述 公元20442044 年,人类进入了宇宙纪元. L 国有 nn 个星球,还有 n-1n−1 条双向航道,每条航道建立在两个星球之间,这 n-1n−1 条航道连通了 LL 国的所有星球. 小 ...

  9. (java)selenium webdriver学习---三种等待时间方法:显式等待,隐式等待,强制等待

    selenium webdriver学习---三种等待时间方法:显式等待,隐式等待,强制等待 本例包括窗口最大化,刷新,切换到指定窗口,后退,前进,获取当前窗口url等操作: import java. ...

  10. ldap系列-基础知识

    来源:关键字排名 ldap 是什么? LDAP(Lightweight Directory Access Protocol)即轻量级目录访问协议,提供信息服务.那啥是目录服务呢? 目录服务是一种特殊的 ...