- 博客(54)
- 收藏
- 关注
原创 ETW HOOK[InfinityHook]技术解析
ETW是操作系统为了对系统调用、异常等信息做了一个日志操作,本质就是在进行调用这些中断、异常、系统调用时会走向这个代码函数区域日志保存的功能。而ETW HOOK就是在驱动层微软的PatchGuard并未对其做到很好的检测,以致于可以通过patch某些函数达到HOOK的目的,再加上系统调用、异常、上下文切换等都会经过这个,故功能也十分强大。
2025-01-16 18:28:49
759
原创 MiniFilter文件过滤(与用户层通信)
minifilter已经不仅封装好了irp,使我们使用时不用注意其底层实现,还封装好了一系列的用户层与驱动层minifilter通信的代码,所以直接按照使用规范调用相应api即可实现与用户层通信。
2025-01-10 14:18:19
388
6
原创 MiniFilter文件过滤
MiniFilter文件过滤驱动整体代码都比较死板,没有太多的流程内容,它的建立本质也是为了方便处理IRP请求,通过注册相应的前回调和后回调以对相应的文件做过滤操作处理,以下代码示例为阻止一个名为name.txt文件的写入操作。
2025-01-09 18:09:37
332
原创 鼠标过滤驱动
其编写过程大体与键盘过滤驱动相似,只需要切换一下附加的目标设备以及创建的设备类型等。但在该操作后依然无法捕获到Vmware创建的win7操作系统的鼠标irp信息,于是通过在获取鼠标驱动,遍历其所有的设备进而附加,这样便可以获取到鼠标的irp信息。
2025-01-09 10:06:28
754
原创 键盘过滤驱动
irp请求会从io管理器中传递到设备栈中依次向下发送,当到达底层真实设备处理完成后,会依次返回,这时如果在设备栈中有我们自己注册的设备,就可以起到一个过滤的功能。键盘过滤驱动就是如此,通过附加到原本存在的设备KeyboardClass0中,这时当发生按键时irp也会返回到我们的设备中,进而实现起响应。
2025-01-08 12:07:06
556
原创 内核上项目【自动化加壳签名】
本节主要是通过使用三个工具,一个是nginx进行搭建一个http服务器进行云下发,另一个是签名工具,还有就是VMP加壳工具(配置文件在.vmp文件中),通过编写批处理文件,使得在程序运行后自动化加壳上传到服务器。
2024-11-18 17:33:04
343
原创 内核上项目【隐藏驱动】
该项目主要功能是通过一个驱动程序将内置的另一个驱动程序进行解密自加载,最终实现加载的另一个驱动无法查到。整体主要分三个大的框架,自加载驱动、删除自身加载时的注册表、删除驱动自身文件。运用PE结构的知识拉伸一个驱动程序,并将其重定位表、导入表、cookie值(为了兼容win10)进行修复将自身驱动在注册时写入的的键值进行删除通过获取驱动程序文件对象,修改其对象的删除相关属性,最好调用ZwDeleteFile删除自身即可这是被隐藏的驱动本身DriverMode1.c这是将上述驱动进行加密后放到的头文件dl
2024-11-15 14:34:10
508
原创 内核上项目【远程call】
本次项目代码量过多,但思路相对简单,主要功能为挂起目标主线程,将主线程TrapFrame的rip进行修改跳转到指定的shellcode位置,该ShellCode我写的是弹出MessageBox,然后再恢复线程,最后创建一个工作队列,让系统将我们的ShellCode等痕迹进行清除,因为我只写了关于64位的进程操作,如果是操作32位进程,要在定位到Context结构,进而修改eip。
2024-10-31 16:29:00
627
原创 WinDbg符号表下载问题解决
之前下载符号表只需要科学上网即可,结果最近搞了新电脑发现不行了,看网上也都基本上对下载windbg符号文件的回答是翻墙或者设置一些环境变量什么的,但是搞了半天还是不行,但是我发现像这种工具就能下载pdb文件,经过摸索发现已经有人写了这种原因,使用SOCKET5代理的都不可以下载。
2024-10-28 11:10:23
577
原创 内核上项目【让ntoskrnl.exe保护程序】
如题让ntoskrnl.exe保护我们的程序,乍眼一看好像挺强,实际操作主要是借用了一下ntoskrnl.exe中的jump ecx指令,在注册回调的时候第一个参数就是ecx,所以直接将回调函数注册成ntoskrnl.exe的jump ecx,真正的回调函数放到参数即可。
2024-10-25 15:59:19
857
原创 内核上项目【读内存的几种方式】
在内核编程有时为了能够读取目标三环进程的内存,主要有以下几种不错的方式1.附加后通过直接memcpy复制目标内存进行读取,但是这种方式非常不稳定,不推荐2.使用MmCopyVirtualMemory进行读取,因为这是微软写好的一个内核函数,所以异常分发等都完善可以直接使用3.切换CR3读取,当切换了CR3时,访问的地址都将以CR3为目录项基址,所以可以直接访问到目标进程的内存4.使用MDL方式,附加进程然后将物理页上的内容映射一份到了内核,进而通过memcpy对映射后的地址进行拷贝即可。
2024-10-25 12:54:12
668
原创 漏洞利用开发基础学习记录
本文基于ERC.Xdbg漏洞分析文章进行初步归纳整理,主要有Win32 缓冲区溢出、SEH 溢出、Egg Hunters、Unicode 溢出、x86-64 缓冲区溢出,工具下载链接ERC.Xdbg。
2024-06-26 14:54:28
1039
原创 内核上项目【通信】
获取ExRegisterAttributeInformationCallback中ExpDisSetAttributeInformation、ExpDisQueryAttributeInformation全局变量位置,并将其置为0,以实现执行到注册的目标回调函数。箭头所标记位置进行判断全局变量ExpDisSetAttributeInformation、ExpDisQueryAttributeInformation是否为空,如果不为空就不进行注册,所以需要在操作步骤一中将其进行置0。进行通信,最后一项的。
2023-12-12 22:27:44
593
1
原创 APC学习记录
插入过程主要是根据参数决定APC插入链表的位置执行过程主要是先执行参数的KernelRoutine的代码,如果有NormalRoutine则跳到三环去遍历执行再回到内核,以此往复将链表中的所有APC执行完毕。
2023-10-28 19:16:16
992
原创 指定PID句柄提权
上一节句柄降权是降权驱动将我们CE中的私有句柄表的DbgVIew成员权限给换了,所以我们的方案就是将这个权限提升回去,但是这样就会出现一闪一闪的样子,因为降权驱动一遍在降权提权驱动一遍在提权,所以这时候的思路是让降权驱动失效。根据上节我们可以看到降权驱动是在判断CE中的私有句柄表中是否有DbgView的句柄,那么办法就是换掉这个CE私有句柄表中的DbgView句柄,但是新的DbgView句柄中内容和原来保存的是一致的,代码如下。3.在驱动中抹除CR3、PID、名称只是为了防止更深层检测,并不影响提权。
2023-07-28 12:39:26
964
原创 指定PID句柄降权
遍历指定PID进程的私有句柄表,如果发现其有DbgView.exe进程的EPROCESS则将其句柄权限进行修改,俗称句柄降权。
2023-07-26 16:01:25
524
原创 隐藏句柄表防止结束进程
三环传入一个指定的PID,驱动将保护通过删除目标进程的句柄表和PID,这样在任务管理器中将无法结束进程(注意:虽然任务管理器无法结束,但是由于VMware注册了一个回调函数,导致只要自身关闭会发生蓝屏,所以需要把VM3DMP.sys去掉)我所使用的系统是Win7 sp1,不同的系统特征码等也会不一样,请自行提取。
2023-07-24 15:30:01
545
原创 微过滤驱动实现保护特定程序
minifiter驱动,实现对特定的文件进行保护,防止打开、删除、修改属性等。三环程序C语言实现Minifilter动态安装与卸载。1.首先链接器的附加依赖项中导入。原型如下,其中第二参数是最重要的。
2023-07-14 15:07:51
630
原创 Windows内核编程【对象和注册表通知】
那么接下来就可以直接使用了,注册时给各个参数赋值,然后在回调函数中对获取的信息进行操作(以下代码是从链接中改写过来的)可以看到有两个参数,第一个参数是为了更好的描述回调中的相关信息,第二个参数是返回注册后的回调句柄。不好理解,这是因为回调的时候有处理操作前和处理操作后,还有删除注册表和设置键值等等这种类型,所以在。实验结果如下,在任务管理器中无法直接终止目标程序,但是程序自身可以将自己退出,原理就是在。那么接下来就要看申请的空间中存放的是什么数据,可以观察到在上方。所对应的不同的值,上图中结构类型就是。
2023-07-12 22:51:27
600
原创 线程被动切换【时钟中断】
线程切换的三种情况1.当前线程主动调用API:API函数–>KiSwapThread–>KiSwapContext–>SwapContext2.当前线程的时间片到期:KiDispatchInterrrupt–>KiQuantumEnd–>KiSwapContext–>SwapContext3.有备用线程:KiDispatchInterrrupt–>SwapContext4.如果时钟中断的时候时间片没有到期且没有备用线程,那么函数会直接返回,不会发生线程切换第一种是主动调用到内核API发送的,所以叫。
2023-07-10 17:32:16
178
原创 反沙箱相关学习记录【SetErrorMode】
这个反沙箱个人感觉和反调试类似,一个是查看调试与非调试状态的区别,一个是查看真实主机与虚拟机或沙箱的区别。之前也遇到很多但是没有做总结,所以将常见的总结到这个文章中。
2023-07-07 11:58:13
143
原创 反调试与反反调试相关学习记录
除了以上的方式外,修改EPROCESS的flags或者_OBJECT_HEADER中的Flags等等,各种方法其实本质就是对整个系统中所出现调试状态与非调试状态的区别,然后加以利用判断出其是非调试还是调试状态。
2023-07-07 10:43:12
461
原创 Windows内核编程【进程和线程通知】
Windows 内核编程》作者: [美] 帕维尔·约西福维奇(Pavel Yosifovich)(可以获取命令行等更多信息,创建注销是同一个函数)(注销,没有回调机制)
2023-07-05 15:57:53
371
原创 KiSwapThread逆向分析
这个函数主要功能是寻找一个新的线程,然后切换线程并判断是否是同一进程,进而判断是否要切换CR3,而切换线程的本质就是切换堆栈也就是esp(从下面的分析图片中可以看出)在这个函数当中会有很多与主线无关的汇编代码,但是并不影响主线的分析,所以基本遇到这种直接跳过,那么我们接下来说一下主线的逆向分析结果。
2023-07-03 00:23:15
623
原创 KiFindReadyThread逆向分析
每个核都有32个链表,在运行时该核触发时钟中断后,会寻找32位数组链表从大到小遍历每个线程,如果遍历的目标线程的亲核性就是运行的本核心,那么从就绪链表中摘除它,并将该线程的NextProcessor进行更改为新的核心的KPRCB.Number这里其实很好理解,就好比这个32位数组链表就是一个线程池,每个CPU需要切换线程的时候就从里面遍历看看谁的亲核性是自己,然后再从里面拿出该线程。
2023-06-27 14:55:20
562
原创 内核断链(ActiveProcessLinks)
3.在这个程序中没有直接使用EPROCESS+0xE8是为了兼容所有系统,而且通过搜寻特征的方法可以躲避各种检测。2.将其转换为大写匹配是否是目标程序,如果是则通过寻找目标EPROCESS结构体的。1.首先通过遍历所有的PID,使用。函数得到目标进程的全路径名称。
2023-06-23 17:07:34
400
原创 SSDT HOOK
1.首先通过MmCreateSection、MmMapViewInSystemSpace将ntdll加载到内存中,然后进行导出表搜索找到目标函数的服务号。2.然后通过内核导出的变量KeServiceDescriptorTable进而找到SSDT表。3.最后通过在SSDT表修改目标函数地址为自定义地址即可。
2023-06-22 21:49:59
412
5
原创 内核线程同步【待更新实现代码】
1.互锁操作如:InterlockedCompareExchange2.分发器对象也被称为可等待对象,通过KeWaitForSingleObject 和 KeWaitForMultipleObjects实现等待的目标函数都属于可等待对象3.互斥量注意:如果某个线程是一个互斥量的拥有者,那么此线程是唯一能释放该互斥量的线程(KeInitializeMutex)4.快速互斥量只能在内核中使用,也是比较常用的一种,故名思意速度要比普通的互斥量块(ExAcquireFastMutex )
2023-06-13 15:12:11
101
原创 Havoc开源框架编译过程
这里是大坑,因为这个是作者写的一个脚本,它通过下载一个名为x86_64-w64-mingw32-cross.tgz文件,然后解压这个文件,问题就出在这里,有时候它下载失败或者解压不成功它不提示,所以这里需要找到作者提供的那个Install.sh的脚本,通过里面的命令自己去下载解压,然后才能使用下面这个命令来编译服务端。不得不说这linux坑就是多,整个过程完全看脸,有的人能直接编译通过一个问题遇不到,有的全程都有问题。这里是个坑,用go mod需要设置一下两个环境变量,这样才能使用go mod下载成功。
2023-06-09 12:08:10
1399
4
原创 IDA中文函数命名
1.在ida.cfg文件中搜索Block_CJK_Unified_Ideographs,去掉Block_CJK_Unified_Ideographs这一行前面的注释。2.将ida.dll文件放入IDA64中,然后字符串搜索。,将其有下划线这一行nop掉。
2023-06-05 14:14:07
478
原创 Windows 内核编程【驱动程序:从头到尾】
本章主要因为Windows的API功能太弱,只能对线程设置几个级别,于是调用驱动的API来进行设置线程优先级别,于是客户端与驱动的代码如下。
2023-05-31 15:58:00
618
原创 OpenSSL之RSA学习
我使用的是OpenSSL 1.1.1版本,在对项目的设置中在我前面的文章有提到,除此之外因为这个代码有部分地方会触发堆栈异常,但是我并没有找到是在哪里,所以还需要在代码生成选项中->基本运行时检测改为默认值。
2023-05-30 17:54:57
476
原创 OpenSSL之SHA256学习
用到的函数主要有以下几个:1.用于初始化一个SHA256_CTX结构体2.用于添加文件块来更新SHA2563.获取文件的SHA2564.SHA256获取字符串的SHA256。
2023-05-30 11:04:39
1754
原创 从0到1简单开始使用OpenSSL
2.在VS中新建一个空白项目,然后在设置中将OpenSSL中的include包含目录和lib库目录都填写到VC++目录中,如下图。3.最后在链接器的附加依赖库中添加所需的lib,我使用的是libssl.lib和libcrypto.lib。答:安装OpenSSL时有两个版本的,安装了x64就只能编译x64版本的程序,不然会出现各种错误,如图所示。1.下载好合适的版本后,直接安装(一直下一步),最后在环境变量中添加安装后的bin目录,如下图。1.明明已经安照步骤填写了,为什么依然找不到目标文件?
2023-05-30 10:34:13
135
原创 关于OpenSSL1.1.1版本AES_decrypt奇怪问题
原本这里在malloc分配内存时应该有相应的信息标志,也就是4个0xfd,但是在调用完之后会给我清空了,这就导致我直接free这块内存直接失败。第一次使用OpenSSL库,想用用里面的算法,发现在使用AES_decrypt时会直接将解密后的内存尾部的四字节全部清0。既然它给我们清空了,那我们就自己修复吧,在它解密完后的字符串末尾再增加4个0xfd,于是代码如下。
2023-05-29 17:42:41
332
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人