摘要:
在笔者上一篇文章`《驱动开发:内核特征码搜索函数封装》`中为了定位特征的方便我们封装实现了一个可以传入数组实现的`SearchSpecialCode`定位函数,该定位函数其实还不能算的上简单,本章`LyShark`将对特征码定位进行简化,让定位变得更简单,并运用定位代码实现扫描内核PE的`.text`代码段,并从代码段中得到某个特征所在内存位置。
阅读全文
posted @ 2022-10-18 16:59
lyshark
阅读(1356)
推荐(1)
摘要:
Minifilter 是一种文件过滤驱动,该驱动简称为微过滤驱动,相对于传统的`sfilter`文件过滤驱动来说,微过滤驱动编写时更简单,其不需要考虑底层RIP如何派发且无需要考虑兼容性问题,微过滤驱动使用过滤管理器`FilterManager`提供接口,由于提供了管理结构以及一系列管理API函数,所以枚举过滤驱动将变得十分容易。
阅读全文
posted @ 2022-10-18 08:22
lyshark
阅读(1942)
推荐(0)
摘要:
在前面的系列教程如`《驱动开发:内核枚举DpcTimer定时器》`或者`《驱动开发:内核枚举IoTimer定时器》`里面`LyShark`大量使用了`特征码定位`这一方法来寻找符合条件的`汇编指令`集,总体来说这种方式只能定位特征较小的指令如果特征值扩展到5位以上那么就需要写很多无用的代码,本章内容中将重点分析,并实现一个`通用`特征定位函数。
阅读全文
posted @ 2022-10-17 11:40
lyshark
阅读(1323)
推荐(0)
摘要:
在上一篇文章`《驱动开发:内核枚举DpcTimer定时器》`中我们通过枚举特征码的方式找到了`DPC`定时器基址并输出了内核中存在的定时器列表,本章将学习如何通过特征码定位的方式寻找`Windows 10`系统下面的`PspCidTable`内核句柄表地址。
阅读全文
posted @ 2022-10-16 16:05
lyshark
阅读(1210)
推荐(0)
摘要:
在笔者上一篇文章`《驱动开发:内核枚举IoTimer定时器》`中我们通过`IoInitializeTimer`这个API函数为跳板,向下扫描特征码获取到了`IopTimerQueueHead`也就是IO定时器的队列头,本章学习的枚举DPC定时器依然使用特征码扫描,唯一不同的是在新版系统中DPC是被异或加密的,想要找到正确的地址,只是需要在找到DPC表头时进行解密操作即可。
阅读全文
posted @ 2022-10-16 04:50
lyshark
阅读(1272)
推荐(0)
摘要:
在前面的博文《驱动开发:Win10内核枚举SSDT表基址》中已经教大家如何寻找SSDT表基地址了,找到后我们可根据序号获取到指定SSDT函数的原始地址,而如果需要输出所有SSDT表信息,则可以定义字符串列表,以此循环调用GetSSDTFunctionAddress()函数得到,当然在此之间也可以调用
阅读全文
posted @ 2022-10-14 13:05
lyshark
阅读(435)
推荐(0)
摘要:
今天继续分享内核枚举系列知识,这次我们来学习如何通过代码的方式枚举内核`IoTimer`定时器,内核定时器其实就是在内核中实现的时钟,该定时器的枚举非常简单,因为在`IoInitializeTimer`初始化部分就可以找到`IopTimerQueueHead`地址,该变量内存储的就是定时器的链表头部。枚举IO定时器的案例并不多见,即便有也是无法使用过时的,此教程学到肯定就是赚到了。
阅读全文
posted @ 2022-10-14 11:24
lyshark
阅读(870)
推荐(0)
摘要:
在上一篇文章`《驱动开发:内核中实现Dump进程转储》`中我们实现了ARK工具的转存功能,本篇文章继续以内存为出发点介绍`VAD`结构,该结构的全程是`Virtual Address Descriptor`即`虚拟地址描述符`,VAD是一个`AVL`自`平衡二叉树`,树的每一个节点代表一段虚拟地址空间。程序中的代码段,数据段,堆段都会各种占用一个或多个`VAD`节点,由一个`MMVAD`结构完整描述。
阅读全文
posted @ 2022-10-13 13:30
lyshark
阅读(1576)
推荐(0)
摘要:
多数ARK反内核工具中都存在驱动级别的内存转存功能,该功能可以将应用层中运行进程的内存镜像转存到特定目录下,内存转存功能在应对加壳程序的分析尤为重要,当进程在内存中解码后,我们可以很容易的将内存镜像导出,从而更好的对样本进行分析,当然某些加密壳可能无效但绝大多数情况下是可以被转存的。
阅读全文
posted @ 2022-10-11 18:34
lyshark
阅读(1291)
推荐(0)
摘要:
在上一篇博文`《驱动开发:内核通过PEB得到进程参数》`中我们通过使用`KeStackAttachProcess`附加进程的方式得到了该进程的PEB结构信息,本篇文章同样需要使用进程附加功能,但这次我们将实现一个更加有趣的功能,在某些情况下应用层与内核层需要共享一片内存区域通过这片区域可打通内核与应用层的隔离,此类功能的实现依附于MDL内存映射机制实现。
阅读全文
posted @ 2022-10-11 11:47
lyshark
阅读(1741)
推荐(2)
摘要:
PEB结构`(Process Envirorment Block Structure)`其中文名是进程环境块信息,进程环境块内部包含了进程运行的详细参数信息,每一个进程在运行后都会存在一个特有的PEB结构,通过附加进程并遍历这段结构即可得到非常多的有用信息。
阅读全文
posted @ 2022-10-10 16:32
lyshark
阅读(1383)
推荐(0)
摘要:
在上一篇文章`《驱动开发:内核取ntoskrnl模块基地址》`中我们通过调用内核API函数获取到了内核进程`ntoskrnl.exe`的基址,当在某些场景中,我们不仅需要得到内核的基地址,也需要得到特定进程内某个模块的基地址,显然上篇文章中的方法是做不到的,本篇文章将实现内核层读取32位应用层中特定进程模块基址功能。
阅读全文
posted @ 2022-10-09 14:33
lyshark
阅读(1263)
推荐(0)
摘要:
模块是程序加载时被动态装载的,模块在装载后其存在于内存中同样存在一个内存基址,当我们需要操作这个模块时,通常第一步就是要得到该模块的内存基址,模块分为用户模块和内核模块,这里的用户模块指的是应用层进程运行后加载的模块,内核模块指的是内核中特定模块地址,本篇文章将实现一个获取驱动`ntoskrnl.exe`的基地址以及长度,此功能是驱动开发中尤其是安全软件开发中必不可少的一个功能。
阅读全文
posted @ 2022-10-09 09:58
lyshark
阅读(1755)
推荐(0)
摘要:
在驱动开发中我们有时需要得到驱动自身是否被加载成功的状态,这个功能看似没啥用实际上在某些特殊场景中还是需要的,如下代码实现了判断当前驱动是否加载成功,如果加载成功, 则输出该驱动的详细路径信息。
阅读全文
posted @ 2022-10-08 20:28
lyshark
阅读(1095)
推荐(0)
摘要:
Flask 框架中如果想要实现WebSocket功能有许多种方式,运用SocketIO库来实现无疑是最简单的一种方式,Flask中封装了一个`flask_socketio`库该库可以直接通过pip仓库安装,如下内容将重点简述SocketIO库在Flask框架中是如何被应用的,最终实现WebSSH命令行终端功能,其可用于在Web浏览器内实现SSH命令行执行。
阅读全文
posted @ 2022-10-06 18:28
lyshark
阅读(1291)
推荐(0)
摘要:
echarts是百度推出的一款开源的基于`JavaScript`的可视化图表库,该开发库目前发展非常不错,且支持各类图形的绘制可定制程度高,Echarts绘图库同样可以与`Flask`结合,前台使用`echart`绘图库进行图形的生成与展示,后台则是Flask通过`render_template`方法返回一串JSON数据集,前台收到后将其应用到绘图库上,实现动态展示Web服务日志状态功能。如下案例中将分别展示运用该绘图库如何绘制(饼状图,柱状图,折线图)这三种最基本的图形。
阅读全文
posted @ 2022-10-05 18:26
lyshark
阅读(1377)
推荐(2)
摘要:
Tracert 命令跟踪路由原理是IP路由每经过一个路由节点TTL值会减一,假设TTL值=0时数据包还没有到达目标主机,那么该路由则会回复给目标主机一个数据包不可达,由此我们就可以获取到目标主机的IP地址,如下我们通过scapy构造一个路由追踪工具并实现一次追踪。
阅读全文
posted @ 2022-10-04 15:42
lyshark
阅读(1073)
推荐(0)
摘要:
Python 通过pywin32模块调用WindowsAPI接口,实现对特定进程加载模块的枚举输出并检测该PE程序模块所启用的保护方式,此处枚举输出的是当前正在运行进程所加载模块的DLL模块信息,需要用户传入进程PID才可实现输出。
阅读全文
posted @ 2022-10-04 14:47
lyshark
阅读(477)
推荐(0)
摘要:
内核中执行代码后需要将结果动态显示给应用层的用户,DeviceIoControl 是直接发送控制代码到指定的设备驱动程序,使相应的移动设备以执行相应的操作的函数,如下代码是一个经典的驱动开发模板框架,在开发经典驱动时会用到的一个通用案例。
阅读全文
posted @ 2022-10-03 20:11
lyshark
阅读(817)
推荐(1)
摘要:
在前几篇文章中给大家具体解释了驱动与应用层之间正向通信的一些经典案例,本章将继续学习驱动通信,不过这次我们学习的是通过运用`Async`异步模式实现的反向通信,反向通信机制在开发中时常被用到,例如一个杀毒软件如果监控到有异常进程运行或有异常注册表被改写后,该驱动需要主动的通知应用层进程让其知道,这就需要用到驱动反向通信的相关知识点,如下将循序渐进的实现一个反向通信案例。
阅读全文
posted @ 2022-10-03 15:47
lyshark
阅读(1165)
推荐(0)
摘要:
在本人前一篇博文《驱动开发:通过ReadFile与内核层通信》详细介绍了如何使用应用层ReadFile系列函数实现内核通信,本篇将继续延申这个知识点,介绍利用PIPE命名管道实现应用层与内核层之间的多次通信方法。 什么是PIPE管道? 在Windows编程中,数据重定向需要用到管道PIPE,管道是一
阅读全文
posted @ 2022-10-01 08:33
lyshark
阅读(406)
推荐(0)
摘要:
在本人前一篇博文`《驱动开发:通过ReadFile与内核层通信》`详细介绍了如何使用应用层`ReadFile`系列函数实现内核通信,本篇将继续延申这个知识点,介绍利用`PIPE`命名管道实现应用层与内核层之间的多次通信方法。
阅读全文
posted @ 2022-10-01 08:33
lyshark
阅读(1320)
推荐(0)
摘要:
驱动与应用程序的通信是非常有必要的,内核中执行代码后需要将其动态显示给应用层,但驱动程序与应用层毕竟不在一个地址空间内,为了实现内核与应用层数据交互则必须有通信的方法,微软为我们提供了三种通信方式,如下先来介绍通过ReadFile系列函数实现的通信模式。
阅读全文
posted @ 2022-09-30 16:23
lyshark
阅读(1264)
推荐(4)
摘要:
ImGUI 它是与平台无关的C++轻量级跨平台图形界面库,没有任何第三方依赖,可以将ImGUI的源码直接加到项目中使用,该框架通常会配合特定的D3Dx9等图形开发工具包一起使用,ImGUI常用来实现进程内的菜单功能,而有些辅助开发作者也会使用该框架开发菜单页面,总体来说这是一个很不错的绘图库,如下将公开新版ImGUI如何实现绘制外部菜单的功能。
阅读全文
posted @ 2022-09-30 09:54
lyshark
阅读(3473)
推荐(4)
摘要:
在上一篇文章`《驱动开发:内核字符串转换方法》`中简单介绍了内核是如何使用字符串以及字符串之间的转换方法,本章将继续探索字符串的拷贝与比较,与应用层不同内核字符串拷贝与比较也需要使用内核专用的API函数,字符串的拷贝往往伴随有内核内存分配,我们将首先简单介绍内核如何分配堆空间,然后再以此为契机简介字符串的拷贝与比较。
阅读全文
posted @ 2022-09-29 13:21
lyshark
阅读(1430)
推荐(1)
摘要:
在内核编程中字符串有两种格式`ANSI_STRING`与`UNICODE_STRING`,这两种格式是微软推出的安全版本的字符串结构体,也是微软推荐使用的格式,通常情况下`ANSI_STRING`代表的类型是`char *`也就是ANSI多字节模式的字符串,而`UNICODE_STRING`则代表的是`wchar*`也就是UNCODE类型的字符,如下文章将介绍这两种字符格式在内核中是如何转换的。
阅读全文
posted @ 2022-09-28 20:33
lyshark
阅读(2005)
推荐(0)
摘要:
提到自旋锁那就必须要说链表,在上一篇`《驱动开发:内核中的链表与结构体》`文章中简单实用链表结构来存储进程信息列表,相信读者应该已经理解了内核链表的基本使用,本篇文章将讲解自旋锁的简单应用,自旋锁是为了解决内核链表读写时存在线程同步问题,解决多线程同步问题必须要用锁,通常使用自旋锁,自旋锁是内核中提供的一种高IRQL锁,用同步以及独占的方式访问某个资源。
阅读全文
posted @ 2022-09-28 10:25
lyshark
阅读(1108)
推荐(0)
摘要:
首先CR3是什么,CR3是一个寄存器,该寄存器内保存有页目录表物理地址(PDBR地址),其实CR3内部存放的就是页目录表的内存基地址,运用CR3切换可实现对特定进程内存地址的强制读写操作,此类读写属于有痕读写,多数驱动保护都会将这个地址改为无效,此时CR3读写就失效了,当然如果能找到CR3的正确地址,此方式也是靠谱的一种读写机制。
阅读全文
posted @ 2022-09-25 11:16
lyshark
阅读(2925)
推荐(0)
摘要:
Windows内核中是无法使用`vector`容器等数据结构的,当我们需要保存一个结构体数组时,就需要使用内核中提供的专用链表结构`LIST_ENTRY`通过一些列链表操作函数对结构体进行装入弹出等操作,如下代码是本人总结的内核中使用链表存储多个结构体的通用案例。
阅读全文
posted @ 2022-09-23 21:02
lyshark
阅读(1008)
推荐(0)
摘要:
LyScript 插件集成的内置API函数可灵活的实现绕过各类反调试保护机制,前段时间发布的那一篇文章并没有详细讲解各类反调试机制的绕过措施,本次将补充这方面的知识点,运用LyScript实现绕过大多数通用调试机制,实现隐藏调试器的目的。
阅读全文
posted @ 2022-09-17 16:45
lyshark
阅读(677)
推荐(0)