无需修改注册表,从内核模式加载驱动和本地应用程序

Windows 11下RW-Everything驱动加载失败?手把手教你绕过RwDrv.sys签名限制 本文针对Windows 11 22H2系统中RW-Everything因RwDrv.sys驱动被列入微软“易受攻击驱动程序阻止列表”而加载失败的问题,提供了两种实用的解决方案。文章详细剖析了问题根源,并手把手指导用户通过修改注册表临时禁用驱动黑名单,或启用系统测试签名模式来绕过签名限制,恢复工具的正常使用,同时强调了操作时的安全注意事项。 阅读详情
Loading drivers and Native applications from kernel mode, without touching registry

    * Security

"How to load driver without touching registry from kernel mode", this is asked almost always. Today, I will give you an insight into how Windows loads its driver and then will document a new method to load a driver without touching registry.

This is required because even if you exploit kernel vulnerabilities ,you still cannot load any driver because almost all existing Antivirus solutions hijack the NTOSkrnl API's ( which let you write to specific registry locations, load drivers etc).

The first method to load driver is given below:

Windows NT loads drivers using the following function ZwLoadDriver.

Its declaration is as follows:

NTSTATUS ZwLoadDriver (IN PUNICODE_STRING DriverServiceName);

DriverServiceName: Pointer to a counted Unicode string that specifies a path to the driver's registry key, /Registry/Machine/System/CurrentControlSet/Services/DriverName, where DriverName is the name of the driver

The Second Method is given below:

After Windows 2000 start's up, It starts loading the special driver win2k.sys.It doesn't load in the traditional way (as all other drivers are loaded) by calling the following procedures ZwLoadDriver, NtLoadDriver etc.

It actually loads by the following kernel API ZwSetSystemInformation.

This API is used to set system information such as page file, loads the above driver, file cache( information working set) etc.

It is actually implemented as follows:

ZwSetSystemInformation(
IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
//specifies operation to do
IN PVOID SystemInformation, //specifies operation data
IN ULONG SystemInformationLength ) //specifies data length

it's internally implemented as follows:

Switch (SystemInformationClass)
Case 0:

Case 1:
.
.
.
Case 5: ;this actually extends the system service descriptor table
.
.
.
MmLoadSystemImage(SystemInforMation,NULL,NULL,TRUE,imagehandle,baseaddress);

call entrypoint(driverobject,NULL) ;

break ;
case 6:
.
.
.
.
.

These 2 are the only known method of loading drivers.

Here is the third method. (No antivirus solution currently hijacks it so it is safe).

As seen above ZwSetSysteminformation loadimage function to load driver into memory and then calls its entry point.

Now we will briefly analyze the parameters and functionality of MmLoadSystemImage

MmLoadSystemImage(UNICODE STRING Imagepath, UNICODE STRING prefix optional,UNICODE STRING basename optional,
ULONG unknown=0,PVOID imagehandle,PVOID baseaddress);

ImagePath is a fully qualified NT style pathname
prefix is added to pathname when loading driver

basename is the name system shows after module has been loaded

unknown is unknown

*imagehandle is the handle to section(it's already referenced, so you will have dereference it at unload)

*baseaddress is the address at which image has been loaded in kernel memory

This function actually loads the image in memory, resolves imports,loads dependencies, etc.

In Windbg,u can find the address of above function using "d MmLoadSystemImage" (of course ,symbols are required)

NOTE:- MmLoadSystemimage internally calls and checks the image after loading it into memory so make sure the checksum for the image is fine.This functionality is done by the MiCheckSystemImage.The import resolving job and dependency loading is done by MiResolveImageReferences API.

Thee MmloadSystemimage works as follows: (PseudoCode)

1) traverse existing module list to check whether it has been alredy loaded
2) if it exists return error (image already loaded STATUS_IMAGE_ALREADY_LOADED) and return from call

3) try to open file using Zwopenfile,if file cannot be opened,just return with error code
4) compute image checksum and match it with checksum stored in header
5) if checksum doesn't matches. return with error code
6) create a section with zwcreatesection and then reference it
7) map it into kernel space using mMapViewInSystemSpace
8) if necessary apply relocations to image using function LdrRelocateImage
9) resolve refrences iusing MiResolveImageReferences
10) then create an entry in psmoduleloadedlist for the module
11) make it writeprotect
12) then close file handle
13) return from call

So, now we have a function which loads image in memory, but what about calling Driver Entry (entry point of driver). This information can be obtained from the PE headers itself after the image successfully loads in memory. This method has been and can used to load and execute drivers, native applications etc directly from kernel mode

Here is the assembly code (kernel mode assembly code). it has been tested on Windows XP SP0 English Version.After minor modifation code runs on win2k,xp,2k3 etc

__asm {

;below code loads the driver in memory
loaddriver:
mov dword [Stack],esp //save stack

;paramters as always are passed in reverse
push DWORD Driverbase ;it stores driver base
push DWORD ImageHandle ;it stores section handle
push dword 0
push dword 0
push dword 0
push DWORD U_STRINGloc ;it points to unicode string containing driver to load

mov edi, 0x805c03ae ;MmLoadSystemImage address function on Win XP SP0 English version,(OS and SP dependent data)
call edi
cmp eax,0 ;check whether driver loaded successfully in memory
jne drivernotloaded ; if loading failed, exit without calling entrypoint

;since driver has loaded successfully call its init function both parameters are passed 0
mov DWORD edi, [Driverbase]
mov DWORD ebx ,[edi + 0x3c] ;to get offset of optional header
mov dword ebx,[edi + ebx + 0x18 + 0x10] ; to get entry point ofset from base of code
add edi ,ebx ; add base + entry point to get entry point in memory
push 0 ;
push 0
call edi ;call entry point (Driver Entry in case of Drivers)

drivernotloaded:
mov dword esp,[ Stack] ; correct stack so as execution continues

ret

; Here data and/or variables are stored

; This is the driver to load including path name

;DosDevices@:hooka.sys length 48
db 0x5c,0x00,0x44,0x00,0x6f,0x00,0x73,0x00,0x44,0x00,0x65,0x00,0x76,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x73,0x00,0x5c,0x00
db 0x42,0x00,0x3a,0x00,0x5c,0x00,0x68,0x00,0x6f,0x00,0x6f,0x00,0x6b,0x00,0x61,0x00,0x2e,0x00,0x73,0x00,0x79,0x00,0x73,0x00,0x00,0x00

;it's used to store driver base address
Driverbase:
dd 0
;it's used to store section handle
ImageHandle:
dd 0;

;it is used to store Stack location
Stack:
dd 0

;structure used for unicode strings in memory
struc U_STRING
Length: resw 1
MaximumLength: resw 1
Buffer: resd 1
endstruc

}

//asm code ends here

NOTE: - These API's or functions are not exported by NTOSKRNL, but these exist for internal usage.These functions are not hooked by any anti-virus solutions, so these can be used to load drivers and native application and then run them.

That's all about loading a driver from kernel mode without touching registry.
Also,the code does some error checking,so as no hard error occurs.

Have fun! 
操作系统内核模式下的进程隐藏技术 本文还有配套的精品资源,点击获取 简介:标题“Hide Process”讨论了在操作系统内核级别实现进程隐藏的技术,特别是涉及Windows驱动程序开发。进程隐藏的目的是使特定的进程在任务管理器或其他工具中不可见,这在安全和隐私保护方面有其合法用途,但也可能被用于恶意目的。技术实现涉及修改系统注册表、利用系统API、内核模式驱动编程、权限控制、代码注入等方法。本技术要点旨在... 阅读详情

相关推荐

MmLoadDriver内存加载驱动.7z

64位环境下已签名驱动中实现加载未签名驱动,程序是源代码,可修改编译

核心态加载驱动和本地应用

Loading drivers and Native applications from kernel mode, without touching registry By: vipinkumar You are Responsible for everything.Also,if you develop something off this,you should give credit to

2403

KingDriver_辅助_C++_驱动_

刚刚发的那个是恢复句柄表达到破掉驱动保护。这个是直接禁止驱动加载源码。支持全系统写法。

windbg拦截驱动

驱动的加载有几种方式,查看CreateService就可以知道。 1、SERVICE_BOOT_START=0x00000000,被系统loader加载,这类驱动是最早加载的。驱动文件必须放在C:\Windows\System32\drivers目录下,因为此时系统只能读注册表,不能打开文件,不能打出调试信息。看了下面的分析就清楚了。 2、SERVICE_SYSTEM...

weixin_34244102的博客 339

CANape快速上手

文章帮助记录CANape学习过程。

小弱鸡的博客 1万+

[pcie]gen6 下 L0p

000b~100b: 触发L0p 操作流程协商工作link width 到target link width.为111b:link width 硬件动态调整。硬件动态:Device control 3 register.target link width=111b当pcie链路检测到空闲状态时,设备可以主动进入L0p状态。L0p 是pcie gen6 新引入的链路状态,是L0的子状态。(5)LINK WIDTH:当LINK WIDTH CHANGE.cmd为Request时表示请求的链路宽度。

BIG_APPLE1的博客 1680

NT下实现不通过注册表加载进程的方法

http://blog.mmbest.com/?6576发布时间2006年10月26日  翻译发布:2006年10月29日译者按:本文提供了一种在win NT下悄声无息的加载“驱动”的方法。这里所将的“驱动”并不是指平常的驱动,而是指将程序载入系统的内核中,采用该方式将不通过任何注册表项,因此将无法使用任何方法(包括各种杀毒软件)查出这一加载项,达到隐藏自身的目的。为了翻译的方便,本人暂将里面提到

1583

pytorch实现手语识别

连续手语识别项目,中文数据集CSL

masteryi-0018的博客 1万+

调试驱动程序的入口

调试驱动程序的入口(1) 这是老生常谈的一个问题,先说一个一般性的方法。 将内核调试器设置成启动时断点(快捷键Ctrl+Alt+K),调试器提示: Will breakin on first symbol load at next boot. 这句话意味着 The debugger breaks into a restarted target computer ...

weixin_34309543的博客 1656

YOLOv11在STM32H7上的MCU部署实战:基于CMSIS-NN的高效推理实现

嵌入式AI与MCU部署技术解析 本文系统介绍了基于STM32H7微控制器的YOLOv11模型部署方案。主要内容包括: 边缘计算背景下MCU的AI部署优势与挑战,重点分析了STM32H7平台特性 YOLOv11模型的结构优化,包括E-ELAN骨干网络和Meta-ACON激活函数等改进 CMSIS-NN加速库的架构原理,在STM32H743上可实现5.4倍卷积加速 完整的开发环境搭建流程,涵盖硬件选型、工具链配置和模型转换 模型优化关键技术,包括int8量化、剪枝和内存占用优化等 实验表明,该方案在保持模型精度

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 854

机器学习实战26-一种基于LightGBM的股市涨跌预测系统与代码实现过程

在全球经济一体化的背景下,股市作为经济活动的晴雨表,其波动与预测对于投资者、金融机构乃至国家政策制定者而言至关重要。随着金融市场的日益复杂化与信息量的爆炸式增长,股市分析不再仅限于基本面和技术面的传统研究,而是迫切需要更加精准、高效及智能化的方法来捕捉市场动态,以辅助决策制定。模型评估是确保LightGBM股市预测系统准确性和稳定性不可或缺的一环。通过综合运用多种评估指标、科学的验证方法以及深入的性能分析,我们不仅能够全面理解模型的能力和限制,还能为持续优化模型、提升预测准确性奠定坚实基础。

微学AI的博客 2328

加载windows驱动的几种方式

windows api加载驱动的几种方式:

要把所有那些负面的信息当做对自身行为的评价,而不是对自身价值的评判。 3374

Windows 下 OpenClaw(小龙虾) 安装全记录:从零到一的保姆级图文教程(持续更新中)

本文主要介绍了Windows 下 OpenClaw 安装全记录:从零到一的保姆级图文教程,希望能对学习使用OpenClaw 的同学们有所帮助。 文章目录 1. 背景 2. 实战教程 2.1 步骤一 安装Node.js 2.2 步骤二:安装并配置OpenClaw 2.3 步骤三:配置模型 2.4 步骤四:对话 3. 后续使用步骤

weixin_43178406的博客 16万+

用于修改HTTP流量的用户模式和内核模式应用程序的比较

在本文中,您可以学习如何拦截HTTP流量,以便将自定义代码注入Windows HTML标记。 为此,有两种完全不同的方法:一种采用内核模式,另一种采用用户模式。 为了简单起见,将没有掩盖的HTTPS流量。 本文用作代码示例的详细示例,以更广泛地讨论用户模式与内核模式实现比较。 HTTP响应数据注入算法 在开始讨论不同的方法之前,让我们看一下将数据注入HTTP响应的算法。 该算法包括以下数...

IT与开发人员的地盘 366

[QMT和ptrade量化交易小白入门]-120、卖出深度虚值期权的三重过滤策略

本专栏主要是介绍QMT和ptrade的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写200篇左右。QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步。

木头大左的博客 284

Linux内核编程(十三)Input输入子系统

Input 子系统是 Linux 内核中专门为输入设备设计的一个子系统,它提供了一个通用的框架来管理各种输入设备,如键盘、鼠标、触摸屏、游戏手柄等。这个子系统的主要目的是简化和规范化输入设备驱动的开发,同时提高驱动的通用性和兼容性。(1)输入设备:如键盘、鼠标、触摸屏、游戏手柄等,它们是用户与计算机进行交互的主要方式。(2)输入设备驱动的复杂性:传统上,为每种输入设备编写驱动都需要创建文件、进行硬件初始化、实现文件操作函数集和处理中断等。每种设备的驱动可能都有许多重复性的工作。

qq_1033275663的博客 2866

HidHide技术原理:Windows内核模式过滤驱动的实现揭秘

HidHide是一款基于Windows内核模式的过滤驱动工具,能够帮助用户实现对HID设备的精细化管理与隐藏控制。通过内核层的驱动过滤技术,HidHide可以在系统级别拦截并处理设备枚举请求,为特定应用程序提供设备访问控制能力,同时保持对系统稳定性的最小影响。 ## 核心工作机制:内核驱动的设备拦截技术 HidHide的核心功能由内核模式驱动实现,其工作原理基于Windows的WDM(Wind

gitblog_01053的博客 1101

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

如何彻底解决OpenArk内核模式加载问题:5步完整指南

OpenArk是一款功能强大的Windows反Rootkit(ARK)工具,为逆向工程师和系统安全分析师提供全面的内核级分析能力。然而,许多用户在尝试进入内核模式时可能会遇到驱动加载失败、权限不足等问题。本文将为您提供完整的解决方案,帮助您快速诊断并彻底解决OpenArk内核模式加载问题。 ## 📊 快速诊断:识别问题类型 在开始解决之前,首先需要确定您遇到的具体问题类型。OpenArk内核

gitblog_00809的博客 737

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

OpenArk内核模式加载失败终极解决方案:快速修复指南

OpenArk作为新一代Windows反Rootkit工具,其内核模式提供了强大的系统底层操作能力。然而在实际使用中,许多用户遇到了内核驱动加载失败的问题,这直接影响了工具的核心功能发挥。本文将深入解析问题根源并提供实用的快速修复方案。 [![OpenArk工具界面](https://raw.gitcode.com/GitHub_Trending/op/OpenArk/raw/361fb2e0a

gitblog_00415的博客 1531

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

OpenArk项目内核模式加载失败问题分析与解决方案

OpenArk是一款功能强大的Windows系统工具,它提供了用户模式和内核模式两种工作方式。内核模式能够提供更底层的系统操作能力,但在实际使用中,许多用户遇到了无法成功进入内核模式的问题。本文将深入分析这一问题的成因,并提供多种解决方案。 ## 问题表现 当用户尝试在OpenArk中切换到内核模式时,通常会遇到以下错误信息: 1. 驱动加载失败(NtLoadDriver错误代码c00004...

gitblog_01133的博客 700

如何快速解决OpenArk内核模式加载失败:完整故障排除指南

OpenArk内核模式是这款强大Windows系统工具的核心功能,但许多用户在尝试切换时都会遇到驱动加载失败的困扰。本文将从实际问题出发,带你一步步解决OpenArk内核模式加载失败的各种情况,让你重新获得完整的系统分析能力。 ## 用户故事:从挫败到成功 小王是一名网络安全工程师,最近需要使用OpenArk分析一个可疑进程。当他点击切换到内核模式时,却看到"驱动加载失败"的错误提示。这让他十

gitblog_00506的博客 1061

Gemini Voyager「隐藏最近项与 Gems」功能全解析:从界面操作到源码实现

::: info **注意**:本文介绍的功能由 Gemini Voyager 提供,支持 1.1.9 及后续版本。 ::: ## 导读 Gemini™ 首页的「最近保存」(Recently saved)区域与侧边栏中的 **Gems** 列表,常常成为公共场合泄露隐私或干扰视线的来源。Gemini Voyager 为这两个区域提供了一套优雅的「隐藏 / 恢复」开关:鼠标悬停时浮现隐藏按钮,隐

gitblog_00718的博客 884

深度解析OpenArk内核模式加载机制:Windows安全工具的高级内核调试技术

OpenArk是一款面向Windows平台的下一代开源Anti-Rootkit(ARK)工具,专为系统管理员和逆向工程师设计,提供深度系统监控和内核级调试功能。该工具通过创新的内核驱动加载机制,实现了对Windows内核的全面访问和控制能力,为系统安全分析和恶意软件检测提供了强大的技术支撑。 ## 技术背景与架构设计 OpenArk采用分层架构设计,将用户态界面与内核态驱动分离,通过高效的进程

gitblog_00865的博客 541

WINCE的注册表中加载驱动的属性

原文地址::http://blog.csdn.net/armeasy/article/details/5694783 相关网帖 1、Wince6.0驱动开发----http://wenku.baidu.com/view/2560b76a7e21af45b307a82f.html

xqhrs232的专栏 903

内核术语--内核模式,用户模式,内核对象,内核调试,安全,注册表,Unicode,驱动

内核模式 VS 用户模式 为了防止普通的应用程序修改或访问临界区的操作系统的数据,Windows使用两种访问模式:内核模式和用户模式。用户级别的应用程序代码运行在用户模式下,操作系统的代码运行在内核模式(比如系统服务和驱动)。内核模式下有权限访问所有内存和所有的CPU指令。内核模式比用户模式权限高的目的是保证系统的稳定性。 注意:X86和X64处理器定义了4个级别的代码执行权限(也叫做ring

gnimgnot 2571

如何让系统加载自己写的驱动程序?

  如何让系统加载自己写的驱动程序?   两种办法:  1、在[HKEY_LOCAL_MACHINE/Drivers/BuiltIn]下添加注册键。  2、在应用程序中调用ActivateDeviceEx。     在一些文件中用分号来表示注释,例如下面的内容   ; @CESYSGEN IF SERVERS_MODULES_HTTPD  ; @CESYSGEN ENDIF  在“CESY

fangfang的专栏 1万+
上一篇: 机器狗写入到userinit.exe文件的下载者源码
下一篇: NT下实现不通过注册表加载进程的方法
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值