
内核开发
FFE4
业余病毒分析
展开
-
RtlUpcaseUnicodeString转换大写后,Buffer丢失NULL结束符,传入垃圾字符
使用UNICODE_STRING时,必须严格遵守Length,MaximumLength都不可信。如果直接用dst.Buffer给一个wstring赋值,则会带入垃圾字符;记录一下,STL和UNICODE_STRING混用,容易出现问题;原创 2024-10-25 16:31:42 · 264 阅读 · 0 评论 -
在内核中阻止进程创建的正确方法
最近遇到一个BUG,通过Word在打开hyperlink时,在进程通知回调中结束了Chrome浏览器进程,目标进程虽然被杀了,但是Word还会再尝试用另一种方法再打开浏览器,这种情况只出现在Win7上,百思不得其解。原创 2023-12-06 22:29:21 · 690 阅读 · 0 评论 -
【内核与用户层同步】内核对象安全描述符降权
使用下面函数修改内核Event的安全描述符以后,加入SeAliasUsersSid,给普通用户也赋予权限,这样就可以打开内核的Event了,此时用户层程序如果是普通用户权限,则打开Event失败,因为内核创建的对象,普通用户层是没有权限打开的。DriverEntry 创建一个命名的内核通知事件对象。用户层打开该对象,并创建线程,等待事件通知。原创 2022-12-01 14:30:54 · 457 阅读 · 1 评论 -
拦截Minifilter与应用层通信的FltMessage
关于如何拦截Minifilter和应用层之间的通信消息,Hook FltMessage的两种方式原创 2022-07-29 09:06:08 · 813 阅读 · 0 评论 -
win7x86安装驱动提示 0x241 577无法验证此设备所需的驱动程序的数字签名
1)背景win7x64开发驱动时,默认我们会开机F8 关闭强制驱动签名校验,之后可以正常安装驱动。win7x86开发驱动时,我们也可以用同样的方法,也可以在驱动项目属性上关闭强制校验。选择驱动项目属性,链接-》命令行-》附加选项 中加上/INTEGRITYCHECK,这个选项以后,会导致强制校验文件签名。解决方法:去掉该选项即可...原创 2021-11-04 11:26:10 · 1666 阅读 · 0 评论 -
安装驱动,提示文件找不到 error=2
1)背景安装驱动后,启动服务时,提示找不到文件!检查注册表中对应驱动文件路径等一切正常。之前遇到过这个问题,也挺坑的,最近又遇到了,原因却不一样!2)案例 一说说第一次遇到这个问题时的场景,第一次安装驱动一切正常,卸载驱动后,再次安装,就提示找不到文件。原因:设备对象被其它驱动引用了,未释放导致。3)案例 二驱动中使用了Rtl系列函数,比如RtlCompareMemory,编译后的sys文件导入表中RtlCompareMemory函数链接的是kernel32.dll,这会导致启动驱动服务时,提原创 2021-11-04 11:11:40 · 2492 阅读 · 0 评论 -
windbg .for命令遍历Win10所有注册的镜像通知回调函数
命令.for(r $t0=nt!PspLoadImageNotifyRoutine;poi(@$t0)!=0; r $t0=@$t0+8){r $t1=poi(@$t0)&0FFFFFFFFFFFFFFF0h;.printf "pCallback=0x%p pFunc=0x%p\n",@$t1+8,poi(@$t1+8);!address poi(@$t1+8); .echo =======================================}第一次进来,fffff8075eeb原创 2021-09-25 02:51:06 · 404 阅读 · 0 评论 -
WDM项目中使用minifilter
直接导入fltkernel.h,并使用minifilter中的函数,编译时会提示找不到符号等错误。需要在项目链接器->输入文件中增加fltmgr.lib 即可编译,并使用filter相关内核函数原创 2020-11-13 14:06:02 · 470 阅读 · 0 评论 -
使用LIST_ENTRY维护一个进程链:插入、删除、遍历
#include<ntifs.h>LIST_ENTRY g_Head = { 0 };KSPIN_LOCK g_SpinLock;typedef struct _ProcessSnapeNode{ LIST_ENTRY ListEntry; ULONG PID;}ProcessSnapeNode, *PProcessSnapeNode;VOID PrintAllNode(){ if (IsListEmpty(&g_Head)) { DbgPrint("链原创 2020-10-14 00:12:32 · 1389 阅读 · 3 评论 -
进程挂靠后使用PsGetCurrentProcessId获取的进程ID不准
如题,在使用KeStackAttachProcess挂靠到目标进程后,又调用了一系列子函数,此时并没有把EPROCESS传进去。PEPROCESS pProcess = NULL;KAPC_STATE apc;NTSTATUS status = PsLookupProcessByProcessId((HANDLE)pid, &pProcess);if (NT_SUCCESS(status)){ KeStackAttachProcess(pProcess, &apc);原创 2020-06-01 21:17:33 · 1996 阅读 · 0 评论 -
使用Legacy Filters过滤创建和打开命名管道
之前写的方法,都比较不正规,这次采用设备过滤器来拦截命名管道的创建和打开,下面是效果图代码:#include "ntifs.h"typedef struct{ PDEVICE_OBJECT LowerDeviceObject;}DEVICE_EXTENSION,*PDEVICE_EXTENSION;PDEVICE_OBJECT g_MyFilterDevice = NULL;void DriverUnload(PDRIVER_OBJECT DriverObject){ DbgPri原创 2020-05-28 20:08:22 · 364 阅读 · 0 评论 -
WindowsXP下获取命令行参数
1)背景最近有个需求在WindowsXP下通过PsSetCreateProcessNotifyRoutine注册了一个进程创建回调,然后尝试通过PEB来获取被创建进程的命令行参数,发现PEB结构中的命令行等相关数据还没有被填充进去。通过查看GetCommandLineA函数的反汇编,得知进程的命令行保存在一个固定的地址0x7C8855F4MOVE EAX, DWORD PTR [0x7C8855F4]RETN在进程创建回调中,附加到目标进程,再查看这个地址的数据,如下所示。 因为时机还不对,这原创 2020-05-21 15:34:25 · 562 阅读 · 0 评论 -
Hook Npfs驱动对象Dispatch过滤创建和打开管道
通过Hook Npfs对象的Dispatch的IRP回调函数,达到过滤命名管道的需求,这种方式测试win7-win10_1909 都非常稳定!#include <ntifs.h>#include <ntstrsafe.h>#include <ntddkbd.h>// Propertys// ==============================================================================extern原创 2020-05-12 10:23:14 · 540 阅读 · 7 评论 -
Win7x64通过ObCallback过滤文件、命名管道创建和打开
测试了win7x64 、win8x64,可以正常过滤命名管道。也可以通过替换npfs驱动的dispatch入口函数来做。#include <ntifs.h>#include <ntddk.h>struct ThreadData{ ULONG ThreadId; int Priority;};#define PRIORITY_BOOSTER_DEVICE 0X8000#define IOCTL_PRIORITY_BOOSTER_SET_PRIORITY CT原创 2020-05-11 20:27:45 · 939 阅读 · 0 评论 -
Minifilter过滤命名管道和邮槽的一些问题
最近有个需求需要监控管道的链接,IRP_MJ_CREATE过滤不到管道的创建和链接。注册的IRP_MJ_CREATE_NAMED_PIPE这个irp的回调也一直不被调用。OSR上老外也提了类似的问题:https://community.osr.com/discussion/239743/can-a-minifilter-filter-a-non-file-devices-irpshttps://community.osr.com/discussion/171174https://communit原创 2020-05-11 15:37:14 · 1082 阅读 · 0 评论 -
windbg调试符号下载不了
微软符号服务器已经很久没ping通了,挂上全局代理可以下载符号,但是又不想总是开着全局代理。后来找到一种替代方案,可以通过设置系统环境变量,来让下载符号的流量走代理服务器_NT_SYMBOL_PROXY设置好代理后,再下载符号,已经有提示下载进度了!...原创 2020-02-04 18:35:30 · 9231 阅读 · 8 评论 -
sxe ld 命令
有些场景需要使用windbg调试某个dll模块,而这个模块加载时机不是很确定。通常需要使用sxe ld <dll名称> 来设置一个模块加载异常。当被调试进程加载指定名称的dll时,调试器就会中断,后续就可以对该模块的设置一些符号断点了。那么如何看到我设置的所有sxe断点呢? 在windbg的event filter中可以管理设置过的sx系列断点...原创 2020-01-14 20:29:49 · 2541 阅读 · 0 评论 -
error MSB4057: 该项目中不存在目标“Deploy”
使用vs2013创建一个驱动项目时,自动创建对应的解决方案。然后在驱动的解决方案下面再创建一个控制台项目,调试控制台项目时,弹出窗口error MSB4057: 该项目中不存在目标“Deploy”。解决办法:首先把当前项目切换到控制台项目,然后打开配置管理器把控制台项目,部署下面的对勾取消再点调试的时候,虽然还是弹一次,直接点第二个按钮就可以调试了...原创 2020-01-13 22:01:10 · 2674 阅读 · 0 评论 -
神秘的蓝屏代码0xc000007e
之前一直使用vs2013进行开发,最近换了vs2019,刚写好的helloworld驱动项目,在win7虚拟机中加载就蓝屏,错误码是0xc000007e,开始还以为是我用cpp来写驱动导致的,后面改成c版本还是蓝屏,同样的错误码!蓝屏发生时,还没有运行到DriverEntry函数,说明不是我写的代码问题,很大可能是编译环境的问题导致的。由于这个问题是第二次出现,上一次遇到了,也解决了,但是忘记...原创 2019-11-24 10:05:27 · 1530 阅读 · 0 评论 -
KbdClass键盘过滤驱动以及书中几处错误
《寒江独钓》这本书中的键盘过滤驱动例子中,照着书上的例子抄完,代码有些错误的地方!书上的例子有3处错误,分别如下:1)对象类型声明错误extern POBJECT_TYPE IoDriverObjectType;修改为以下正确方式extern POBJECT_TYPE *IoDriverObjectType;在使用的*IoDriverObjectType地方,也需要修改成正确的方式...原创 2019-11-20 16:32:00 · 1894 阅读 · 0 评论 -
内核字符串操作遇到的一些坑
1) RtlDowncaseUnicodeString这个函数可以将UNICODE_STRING类型的字符串全部转为小写字符,比较坑的是,转换后的字符串长度,并不带NULL结束符。使用以下代码进行测试 UNICODE_STRING usName = { 0 }; RtlInitUnicodeString(&usName, L"test"); // 转为小写字符串 UNICOD...原创 2019-11-15 18:17:13 · 359 阅读 · 0 评论 -
内核中访问HKCU注册表
在内核中如果要访问HKEY_LOCAL_MACHINE下面的注册表子健,可以用\Registry\Machine代替。例如,应用层要想访问HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft这个注册表,对应的在内核中,就得这样使用 \Registry\Machine\SOFTWARE\Microsoft那么应用层要想访问HKEY_CURRENT_USER\SOFTWAR...原创 2019-11-15 17:33:12 · 1394 阅读 · 0 评论 -
内核中获取操作系统安装盘路径
NTSTATUS GetSystemRootPath(PUNICODE_STRING pusSystemRoot){ NTSTATUS status = STATUS_UNSUCCESSFUL; PFILE_OBJECT pFileObject = NULL; POBJECT_NAME_INFORMATION pObjectNameInformation = NULL; HANDLE h...原创 2019-11-15 17:20:46 · 602 阅读 · 0 评论 -
Wdm.h、Ntddk.h 和 Ntifs.h 的组织结构
在 Windows Vista 版本的 WDK 之前,用于驱动程序开发的主要头文件为 Wdm.h、Ntddk.h 和 Ntifs.h,它们包含很多重复声明。从 Windows Vista 版本的 WDK 开始,Wdm.h、Ntddk.h 和 Ntifs.h 将按层次结构来组织并且不包含重复信息。上层的文件将包含下层的文件。每个函数和结构声明仅出现一次。Ntifs.h 包含 Ntddk.h,而 ...原创 2019-10-13 05:04:42 · 3304 阅读 · 0 评论 -
windows kernel char数组转wchar数组
需求很简单,char数组转wchar数组,原来的做法: UNICODE_STRING usFilePath = { 0 }; ANSI_STRING asFilePath = { 0 }; RtlInitAnsiString(&asFilePath, pFilePath); RtlAnsiStringToUnicodeString(&usFilePath, &am...原创 2019-10-12 18:53:43 · 1133 阅读 · 0 评论 -
WinDbg手动修复堆栈
栈被破坏了可一点都不好玩儿!尤其是当你在分析crash dump或者程序发生异常的时候,我猜首先要做的事,可能就是先查看一下儿堆栈调用。但是发现当前线程的栈被破坏了,你的主要分析工具也无法显示堆栈,这可咋办哩?尽管如此,有时候也可以修复被破坏的堆栈。我已经出了一些关于.NET和C++调试的教程,但是大家的要求,我也会再展示一个例子.net 调试:http://sela.co.il/syl/s...原创 2019-09-29 10:19:04 · 2955 阅读 · 0 评论 -
手动加载PDB符号文件
事件起因平时需要用到web环境来测试东西时,我会在服务器上用python -m SimpleHTTPServer来启动一个小型web服务,有时为了方便,就没停止服务,一直在服务器上挂着。。今天登陆服务器,发现几条可疑的访问请求记录,如下图分析Payload这个很明显是有人在批量扫描漏洞,并植入木马103.131.9.85 - - [25/Sep/2019 00:58:05] "GET ...原创 2019-09-27 17:42:59 · 4866 阅读 · 0 评论 -
PsSetCreateProcessNotifyRoutine监控进程创建
PsSetCreateProcessNotifyRoutine函数用来注册一个进程创建的回调函数,当有新从进程被创建时,就把父进程的ID,和子进程(被创建的进程)ID传给回调函数,通过回调函数,可以监控新创建的进程NTSTATUS PsSetCreateProcessNotifyRoutine( _In_ PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRouti...原创 2019-09-25 11:22:16 · 5613 阅读 · 0 评论 -
RemoveHeadList、RemoveEntryList、RemoveTailList用法
原创 2019-09-11 11:09:53 · 1865 阅读 · 0 评论