教你如何使用QBDI动态二进制检测框架
工具介绍
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动态二进制检测框架的更多相关文章
- 冰蝎动态二进制加密WebShell基于流量侧检测方案
概述 冰蝎是一款新型动态二进制加密网站工具.目前已经有6个版本.对于webshell的网络流量侧检测,主要有三个思路.一:webshell上传过程中文件还原进行样本分析,检测静态文件是否报毒.二:we ...
- 【原创】利用动态二进制加密实现新型一句话木马之PHP篇
概述 本系列文章重写了java..net.php三个版本的一句话木马,可以解析并执行客户端传递过来的加密二进制流,并实现了相应的客户端工具.从而一劳永逸的绕过WAF或者其他网络防火墙的检测. 本来是想 ...
- Objective-C 【动态类型检测&响应方法】
------------------------------------------- 动态类型检测 代码: #import <Foundation/Foundation.h> @inte ...
- Android+openCV 动态人脸检测
动态人脸检测前提是需要打开摄像头. 网上看了很多教程,我知道的有两种方式打开摄像头: JavaCameraView mCameraView = new JavaCameraView(this, -1) ...
- 六.OC基础--1. id和instancetype类型,2.动态类型检测,3.响应方法,构造方法,4.重写构造方法,5.自定义构造方法
1. id和instancetype类型, id和instancetype类型区别: 1. id和instancetype都可以用来作为方法的返回值 2. id可以用来定义类型,instancetyp ...
- 手把手教你用深度学习做物体检测(五):YOLOv1介绍
"之前写物体检测系列文章的时候说过,关于YOLO算法,会在后续的文章中介绍,然而,由于YOLO历经3个版本,其论文也有3篇,想全面的讲述清楚还是太难了,本周终于能够抽出时间写一些YOLO算法 ...
- 手把手教你用深度学习做物体检测(六):YOLOv2介绍
本文接着上一篇<手把手教你用深度学习做物体检测(五):YOLOv1介绍>文章,介绍YOLOv2在v1上的改进.有些性能度量指标术语看不懂没关系,后续会有通俗易懂的关于性能度量指标的介绍文章 ...
- 插桩 inline hook 动态二进制插桩的原理和基本实现过程
插桩测试 https://source.android.google.cn/compatibility/tests/development/instrumentation https://zhuanl ...
- iOS回顾笔记(05) -- 手把手教你封装一个广告轮播图框架
html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...
随机推荐
- 微信小程序---客服消息接口调用,拿来即用
如果本文对你有用,请爱心点个赞,提高排名,帮助更多的人.谢谢大家!❤ 如果解决不了,可以在文末进群交流. 如果对你有帮助的话麻烦点个[推荐]~最好还可以follow一下我的GitHub~感谢观看! 在 ...
- containerd简述
containerd是容器虚拟化技术,从docker中剥离出来,形成开放容器接口(OCI)标准的一部分. docker对容器的管理和操作基本都是通过containerd完成的.Containerd 是 ...
- Java--8--新特性--Optional--有效防止空指针异常
Optional<T> 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念 ...
- Windows下学习C语言有哪些集成开发软件?
前言 初学者学习C语言遇到的最大困难想必就是搭建环境了,相当多的初学者就是被搭建环境导致放弃了学习编程,就我自己的经验而言,初学编程不应该受限于环境,使用成熟好用的环境就可以了,之后熟悉一些可以在慢慢 ...
- python3 推荐使用super调用base类方法
from:https://python3-cookbook.readthedocs.io/zh_CN/latest/c08/p07_calling_method_on_parent_class.htm ...
- Java精通并发-透过openjdk源码分析wait与notify方法的本地实现
上一次https://www.cnblogs.com/webor2006/p/11442551.html中通过openjdk从c++的底层来审视了ObjectMonitor的底层实现,这次继续来探究底 ...
- 后台将数据传回前台的三种绑定的方式(Model,Map.ModelAndView)
//方式1:通过model 将数据绑定 @RequestMapping(value = "findByIdModel", method = RequestMethod.GET) p ...
- 《基于 Java EE 的高校重修管理系统设计与实现》论文笔记(九)
标题:基于 Java EE 的高校重修管理系统设计与实现 一.基本信息 时间:2015 来源:河海大学文天学院 关键词::Java EE 架构: B/S 模式: 重修管理系统 二.研究内容 1.需求分 ...
- 《你又怎么了我错了行了吧》【Beta】Scrum meeting 3
第三天 日期:2019/6/26 前言: 第3次会议在女生宿舍召开(前一天晚上开的) 项目全部基本测试完成,解决了多处bug,明天终于可以拿去演示了.... 1.1 今日完成任务情况.成员贡献时间及工 ...
- .net序列化 - Newtonsoft(Json.Net)简单应用
Newtonsoft.Json,一款.NET中开源的Json序列化和反序列化类库. Json.Net是一个读写Json效率比较高的.Net框架.Json.Net 使得在.Net环境下使用Json更加简 ...