工具介绍

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. springboot启动后执行一段代码的方式

    文章转载自: https://www.cnblogs.com/zuidongfeng/p/9926471.html https://blog.csdn.net/zknxx/article/detail ...

  2. 【微信小程序】——wxss引用外部CSS文件及iconfont,图文教程

    小程序引入外部文件的方式是:@import “/.wxss”; 小程序的wxss文件font-face的url不接受http地址作为参数,可以接受base64,因此可以先将字体文件下载后,转换为bas ...

  3. 解决linux下创建用户时出现 Creating mailbox file: 文件已存在

    原来linux下添加用户后,会在系统里自动加一个邮箱(系统邮箱),路径是:/var/spool/mail/用户名.      可以直接用命令#rm -rf /var/spool/mail/用户名    ...

  4. altium designer(AD13)隐藏敷铜的方法

    覆铜,就是将PCB上闲置的空间作为基准面,然后用固体铜填充,这些铜区又称为灌铜.敷铜的意义在于,减小地线阻抗,提高抗干扰能力;降低压降,提高电源效率;还有,与地线相连,减小环路面积. 如果拿到别人的P ...

  5. 大数据技术之Hadoop3.1.2版本伪分布式部署

    大数据技术之Hadoop3.1.2版本伪分布式部署 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.主机环境准备 1>.操作系统环境 [root@node101.yinzh ...

  6. nginx 代理 websocket

    nginx 代理 websocket nginx 首先确认版本必须是1.3以上 map指令的作用: 该作用主要是根据客户端请求中$http_upgrade 的值,来构造改变$connection_up ...

  7. 2019-ACM-CCPC-Online-Contest

    2019-ACM-CCPC-Online-Contest 1.^&^ 题意: ​ 求一个最小的正整数\(C\),使得\((A\oplus C) \&(B\oplus C)\)最小. 思 ...

  8. robot framework 笔记(一)

    背景: 平时使用rf时会用到一些方法,长时间不用就会忘记,本文用来记录当做自己的小笔记 内容持续更新中········ 一.robot framework 大小写转换 1.转换小写: ${low} E ...

  9. DELL--R420 CPU报警“CPU0000 cpu2 internal error (IERR)contact support”

    按照以下操作解决: 请用户按以下操作,搞定. 请使用一台服务器测试: 开机看到dell标志时,按F2键→"System BIOS Setting" →"System Pr ...

  10. Hibernate的持久化对象

     Hibernate的持久化类 什么是持久化类        1. 持久化类:就是一个Java类(咱们编写的JavaBean),这个Java类与表建立了映射关系就可以成为是持久化类.        * ...