RING 3 无驱动进入RING 0

浅谈NT下Ring3无驱进入Ring0的方法 [原创]浅谈NT下Ring3无驱进入Ring0的方法 关键字:NT,Ring0,无驱   (测试环境:Windows 2000 SP4,Windows XP SP2. Windows 2003 未测试)   在NT下无驱进入Ring0是一个老生常谈的方法了,网上也有一些C代码的例子,我之所以用汇编重写是因为上次在 [原创/探讨]Windows 核心编程研究系列之一(改变进程 阅读详情
作 者: hljleo
时 间: 2008-06-02,18:52
链 接: http://bbs.pediy.com/showthread.php?t=65906

可能这些已经没有什么,但对俺菜鸟来说学习一下应该还可以的。

MY BLOG: http://hi.baidu.com/hljleo
MY QQ:554920269

下面就是RING 3 无驱动怎么进入RING 0的知识要点




1 通过工作区//Device//PhysicalMemory操作内存,用到的函数流程NtOpenSection(),NtMapViewOfSection()。所以
依靠这种方法我们可以进入RAM的任何地址。
然而在使用这个工作区之前必须保证我们有权限使用它,可以通过一些函数来获得管理员权限:GetSecurityInfo(),SetEntriesInAcl(),SetSecurityInfo()。

2 在进入RING 0之前我们还必须知道目标虚拟地址映射后的物理地址的准确位置,所以我们必须找到进程的页目录。这里涉及到虚拟地址到物理地址的映射,简单解释一下:

A  CPU从当前运行进程的CR3寄存器中得到页目录。在这个目录中,虚拟地址的高10位让CPU找到页表的地址。
B  当找到了页表之后,在这张表中,CPU根据相应的虚拟地址进入下一步定位页。
C  当定位好了页之后,CPU使用虚拟地址的低12位作为页的偏移量。

所以如果我们知道了页目录的位置,我们也就知道了虚拟地址映射后的物理位置。页目录地址存在CR3寄存器中,我们是没有权限在user-mode直接获得的。
以下就是如何获得页目录的一些知识:

现在是认为知道我们进程的页目录在物理RAM中的地址,假使我们目标虚拟地址是V,映射页目录到虚拟地址D,把D认为是1024个DWORD。因此D中的(V>>22)项的高20位是物理页,一张页表,对应的虚拟地址V。现在映射这张页表到虚拟地址T,把T想象成一个1024 DWORD的数组,T中第 ((V>>12)&0x3FF) 项的高20位是虚拟地址V所代表的一个物理页,也就是我们目标虚拟地址映射后的物理地址。

在X86,进程的页目录是从虚拟地址0XC0300000开始,内存管理器从0XC0000000开始映射页表的。

问题的关键在于我们不知道进程页目录的物理地址,为找到页目录,必须做如下工作:
将RAM中的每一页都映射到我们进程的地址空间中,扫描一下内存,总之我们应该会找到页目录的。

假设我们检查的物理页是P,并且P被映射进入虚拟地址V中,我们把V想象成一个1024 DWORD的数组。如果P是我们进程中含有页目录的一个物理页的话,有如下结论:

A.V的第0x300项的高20位肯定等于P。
B.V中第0x300项的最低位肯定被设置了,因为它表明了此页存在于RAM中。
C.如果P是一个页目录,那么V中的第(V>>22)项表示是一个页表--对应于虚拟地址V它的本身。同时这个页表毫无疑问的被装载进入RAM中。因此,V中第(V>>22)项的最低位肯定被设置了。
如果找不到就换下一页。

3 知道了页目录的物理地址,我们就可以找到我们所感兴趣的虚拟地址到物理地址的映射,我们是得到GDT的物理地址

,有了GDT 的物理地址我们就可以无驱动进入内核了。因为我们可以通过GDT中的调用门来实现不同特权级的代码段之间进行控制访问,每一种门描述符中都有present位代表该描述符是否存在。它在每个描述符中的位置都是一样的,因此我们可以根据这个present位来在GDT中找出一个空白位置,在这个位置里面添加我们自己定义的描述符。

我们可以将描述符的selector 域设置为0X8(表明将会执行特权指令),同时它的offset_low和offse_high域分别对应

于我们即将要调用的函数的低16位和高16位。
至于要调用的函数实现的功能这就随个人不同的兴趣而定,比如说可以获得中断信息等等。
下面是主要程序代码的实现:

(1)寻找页目录:
 for(x=0;x<meminfo.dwTotalPhys;x+=0x1000)//经过修改后运行这些代码的进程,其虚拟地址的范围从0--0x1000将成

为进程地址空间中有效的虚拟地址范围
   
{
//映射当前页进入 RAM
MappedSize=4096; phys.QuadPart=x; DirectoryMappedAddress=0;
status = NtMapViewOfSection(Section, (HANDLE) -1, &DirectoryMappedAddress, 0L,MappedSize, &phys, 

&MappedSize, ViewShare,0, PAGE_READONLY);
if(status)continue;
entry=(DWORD*)DirectoryMappedAddress;

//得到偏移量
DirectoryOffset=(DWORD)DirectoryMappedAddress;
TableOffset=(DWORD)DirectoryMappedAddress;
DirectoryOffset>>=22;//第>>22项高20位是页表的物理地址
TableOffset=(TableOffset>>12)&0x3ff;//第>>12)&0x3FF项的高20位是虚拟地址的物理页的位置,虚拟地址中 第((V>>12)&0x3FF)项的低位必定被设置


//为了找到页目录,我们需要作出判断,即页目录的第 0x300项的高20位对应的是 我们要找页目录物理地址自身,如果是找到页目录的位置,如果不是进入下一页
// 当然该项的存在位必须被设置

if((entry[0x300]&0xfffff000)!=x ||(entry[0x300]&1)!=1 || (entry[DirectoryOffset]&1)!=1)
{NtUnmapViewOfSection((HANDLE) -1, DirectoryMappedAddress);continue;}


//映射页表
MappedSize=4096; 
phys.QuadPart=(entry[DirectoryOffset]&0xfffff000); 
TableMappedAddress=0;
status = NtMapViewOfSection(Section, (HANDLE) -1, &TableMappedAddress, 0L,MappedSize, &phys, 

&MappedSize, ViewShare,0, PAGE_READONLY);

if(status){NtUnmapViewOfSection((HANDLE) -1, DirectoryMappedAddress);continue;}

//如果找到页表---虚拟地址第(V>>12)&0x3ff页表项的高20位必须是页目录的地址
//当然存在位同样应该被设置,,现在找到真正页目录的位置

entry=(DWORD*)TableMappedAddress;
if((entry[TableOffset]&1)==1 && (entry[TableOffset]&0xfffff000)==x)found++;


NtUnmapViewOfSection((HANDLE) -1, TableMappedAddress);

//页目录已经找到,退出循环
if(found)break;
NtUnmapViewOfSection((HANDLE) -1, DirectoryMappedAddress);  
}

(2)知道了页目录的物理地址,我们就可以找到我们所感兴趣的虚拟地址到物理地址的映射,下面是得到GDT的物理地址,并设置自己的调用门,现在我们就可以无驱动进入内核了。


_asm
{
sgdt gdtr  //得到 gdtr 寄存器的内容保存于内存单元中,即得到 GDT 基地址与界限
lea eax,gdtr
mov ebx,dword ptr[eax+2]//高32位指出GDT在物理存取器中存放的基地址
mov gdtbase,ebx
}


DirectoryOffset=gdtbase;TableOffset=gdtbase;
DirectoryOffset>>=22;
TableOffset=(TableOffset>>12)&0x3ff;//保证GDT从一个页开始

entry=(DWORD*)DirectoryMappedAddress;

//映射页表- 第(V-22)页目录项的高20位是物理地址
MappedSize=4096;
 phys.QuadPart=(entry[DirectoryOffset]&0xfffff000); 
 TableMappedAddress=0;

status = NtMapViewOfSection(Section, (HANDLE) -1, &TableMappedAddress, 0L,MappedSize, &phys, 

&MappedSize, ViewShare,0, PAGE_READONLY);

//物理页是 第 (V>>12)&0x3ff页表项的高20位 - -这就是我们所想要的
entry=(DWORD*)TableMappedAddress;
physgdtbase=(entry[TableOffset]&0xfffff000);

NtUnmapViewOfSection((HANDLE) -1, TableMappedAddress);

NtUnmapViewOfSection((HANDLE) -1, DirectoryMappedAddress);

// 映射 gdt
phys.QuadPart=physgdtbase;MappedSize=4096;

NtMapViewOfSection(Section, (HANDLE) -1, (PVOID*)&GdtMappedAddress, L,MappedSize, &phys, &MappedSize, 

ViewShare,0, PAGE_READWRITE);
gdtbase&=0xfff;
GdtMappedAddress+=gdtbase;

  gate=(CallGateDescriptor * )GdtMappedAddress;

//在GDT中寻找空闲入口,即Present位为0的

selector=1;
while(1)
{
if(!gate[selector].present)break;
selector++;
}

// 设置 call gate
gate[selector].offset_low  = (WORD) ((DWORD)kernelfunction & 0xFFFF);//将会调用任意函数的地址,这里是

kernelfunction这个函数
gate[selector].selector     = 8;
gate[selector].param_count  = 1; //we will pass a parameter
gate[selector].unused    = 0;
gate[selector].type       = 0xc;     //0xc是 32-bit callgate 标志
      
gate[selector].dpl          = 3;      // 必须是 3
gate[selector].present      = 1;
gate[selector].offset_high = (WORD) ((DWORD)kernelfunction >> 16);
       


NtUnmapViewOfSection((HANDLE) -1, GdtMappedAddress);
CloseHandle(Section);
...........这里可以调用一些自己实现的函数。
易语言无驱动进入ring0源码-易语言 易语言无驱动进入ring0源码 立即下载

相关推荐

ring0驱动层上实现 隐藏进程(无进程 无端口 无服务)的简单demo.zip

ring0驱动层上实现 隐藏进程(无进程 无端口 无服务)的简单demo.zip

ring3到ring0的过渡----rootkit最基本驱动

这是一个比HelloDDK.sys更简单的例子,其实DDK_Unload都可以不要但是你将没法正常去停止这个内核服务,这个是否让人想起了某些恶意软件连停止内核服务失败的原因,另外还有个宏KdPrint(()),可以替代DbgPrint这个和HelloDDK比起来 功能单一多了,关于后SSDT HOOK,以后再在这个原型上增加功能VOID DDK_Unload( IN PDRIVER_OBJECT DriverObject ){ DbgPrint("Driver Unload");}N

Sorawa 592

ring0驱动内核级的ROOTKIT实现隐藏文件,隐藏注册表项,隐藏端口.zip

ring0驱动内核级的ROOTKIT实现隐藏文件,隐藏注册表项,隐藏端口.zip

在NT中直接访问物理内存

P.bhw98{ PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 9pt; PADDING-BOTTOM: 0px; MARGIN: 10px 0px 5px; LINE-HEIGHT: normal; PADDING-TOP: 0px; FONT-FAMIL

3785

运放 + MOS管构成的恒流电路分析及实用环境器件参数选择

恒流电路

五花带点肉 2万+

Win11右键菜单显示更多选项设置默认展开方法

在Windows 11操作系统中,用户可能会发现右键点击桌面空白处时,弹出的菜单中仅显示“显示更多选项”,而并非直接展示所有可用的选项。这对于希望快速访问特定功能的用户来说,无疑增加了一些不便。为了优化这一体验,本文将介绍两种简单的方法,帮助用户设置Win11右键菜单,使其默认展开包含的所有选项。通过上述两种方法,用户可以轻松地将Win11右键菜单设置为默认展开所有选项,从而提高工作效率和便捷性。希望这篇文章对你有所帮助!

nntxthml的博客 1万+

windows驱动读取gdtr_无驱动执行 Ring0 代码

无驱动执行 Ring0 代码2005-1-14 23:187729无驱动执行 Ring0 代码2005-1-14 23:187729〔转贴〕原作者姓名 free2000fly介绍无驱动执行 Ring0 代码的源程序的改写, 使得能在 VC6 及 vc71 下编译正文前不久因为有一个加密及直接操纵硬件的问题, 使用直接访问硬件更直接一点, 但操作系统是NT的,不能用 CIH 的技术, 在网上狂找, ...

weixin_39731271的博客 232

ESP32 驱动 SYN6288 语音合成:Arduino IDE 下实现中文数字混合文本的智能播报

本文详细介绍了如何在Arduino IDE环境下使用ESP32驱动SYN6288语音合成模块,实现中文数字混合文本的智能播报。通过硬件选型、开发环境搭建、编码转换原理、命令帧构造及串口通信实战等步骤,帮助开发者快速掌握语音播报技术。文章还提供了混合文本处理技巧和常见问题排查方法,适合智能硬件开发者参考。

weixin_42553471的博客 448

用Delphi在2000和XP/2003下从Ring3进入Ring0的无驱动解决方法by LYSoft LiuYang

这段代码很有意义的父亲纪念版,它是在我一生人中最痛苦的时期所开发的。唉,一切都成为永恒的怀念...... 注意:需要JEDI Win32 API(JWA)库支持另外,该方法不适用于PAE模式(WinXP SP2配备AMD64或EMT64处理器的系统),而且还不能支持Win2003 SP1 uses  Windows, Dialogs, SysUtils, NTDDK,  JwaWinNT, Jwa

LYSoft 3974

Java + Selenium + TestNg + Allure Web UI 自动化

我们知道,在Python中针对Web UI自动化有Python + Selenium + Pytest/Unittest +Allure的技术栈。那么对于Java而言,也有其独特的Web UI 自动化技术栈。相同的,我们同样的运用Selenium框架,测试报告同样运用Allure。不同的是,我们运用的语言由Python转化为了Java,测试用例管理框架从Pytest转化为了TestNG。

qq_45594960的博客 1913

iStore增强插件 如何重塑家庭网络与存储体验

本文深入解析了iStore增强插件如何重塑家庭数字生活体验。它通过集成智能流控、一键式文件共享、媒体服务器及智能家居网关等功能,将复杂的网络配置、存储管理与设备协同简化为图形化操作,有效解决了家庭网络卡顿、数据割裂与使用门槛高等核心痛点,让普通用户也能轻松打造高效、稳定、安全的家庭数字中枢。

prometheus9mon的博客 648

用Delphi在2000和XP/2003下从Ring3进入Ring0的无驱动解决方法

by LYSoft LiuYang  需要JEDI Win32 API(JWA)库支持 uses  Windows, Dialogs, SysUtils, NTDDK,  JwaWinNT, JwaWinType, JwaNtStatus, JwaAccCtrl, JwaAclApi, ntdll; const  KGDT_NULL     = 0;  KGDT

Stiwin Lee's Favorite 2364

手把手教你学simulink(90.1)--直流电动机实例:基于Simulink的基本模型的直流电动机(DC Motor)建模

直流电动机(DC Motor)因其结构简单、控制方便和良好的调速性能,广泛应用于各种工业自动化、机器人技术、家用电器以及航空航天等领域。为了更好地理解和应用直流电动机的工作原理及其控制系统,本项目旨在通过Simulink对直流电动机进行基本模型的建模与仿真。

MHD0815的博客 439

用Delphi在2000和XP/2003下从Ring3进入Ring0的无驱动解决方法by LYSoft

本文转自 http://blog.youkuaiyun.com/ly_liuyang/article/details/189013

hksoobe的专栏 645

高比例风电电力系统储能运行及配置研究(python&Matlab实现)

目录1 概述2 案例3 Matlab实现 3.1 题目及分析3.2 Matlab代码 4 七个题全部代码(值得学习) 下面我们先以第二题为例,然后给出Matlab代码:先考虑风电装机300MW直接替代机组3的发电功率曲线,观察系统功率平衡发生的变化情况。然后在此场景下,以最小发电成本为目标函数,将负荷分配给两台火电机组1、2和风电机组,绘制机组日发电计划图。再将风电装机容量作为一个决策变量,以最小发电成本为目标函数,求取最小发电成本对应的风电装机容量,绘制机组日发电计划图。1. 风电装机300MW、直接

weixin_46039719的博客 1741

【数据集】全球首个10米分辨率精细分类土地覆盖数据集GLC_FCS10

【数据集】全球首个10米分辨率精细分类土地覆盖数据集GLC_FCS10

WW、forever的博客 1567

Windows 2K不用驱动进入ring0(实现部分)

(*******************************************************************************   CopyRight (c) By 姚佩云 2004*   All Right Reserved*   Email : i_rock_1001@163.com www.jynx.com.cn*   Date    :*       Ne

soweb的专栏 1680

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

用汇编写个最小的WDM驱动程序进RING0

原著:wowocockhttp://www.luocong.com/bbs/dispbbs.asp?boardid=2&id=3176用汇编写个最小的WDM驱动程序进RING0在WINDOWS 2000/XP/2003里进入RING0是很多人的梦想,但实现这个梦想并不容易,因为基于NT内核的 WINDOWS 2000/XP/2003对自己保护得非常好,这与WINDOWS 9X有很大不同,WINDO

老汇编学Win32 7761

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Windows 2K不用驱动进入ring0(demo)

(*******************************************************************************   CopyRight (c) By 姚佩云 2004*   All Right Reserved*   Email : i_rock_1001@163.com www.jynx.com.cn*   Date    :*       Ne

soweb的专栏 1015

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

[转载]用汇编写个最小的WDM驱动程序进RING0

[function doZoom(size){ document.getElementById(zoom).style.fontSize=size+px} 字体:大 中 小] 2004年6月12日15:09星期六 原著:wowocockhttp://www.luocong.com/bbs/dispbbs.asp?boardid=2&id=3176用汇编写个最小的WDM驱动程序进R

jarodlau的专栏 1601

[原创]浅谈NT下Ring3无驱进入Ring0的方法

原文链接:浅谈NT下Ring3无驱进入Ring0的方法 (测试环境:Windows 2000 SP4,Windows XP SP2.Windows 2003未测试)   在NT下无驱进入Ring0是一个老生常谈的方法了,网上也有一些C代码的例子,我之所以用汇编重写是因为上次在[原创/探讨]Windows核心编程研究系列之一(改变进程PTE)的帖子中自己没有实验成功(其实已经成...

weixin_30835923的博客 189
上一篇: 个人防火墙的真相
下一篇: 驱动开发和调试的环境设置
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值