在ring0调用Ring3的代码

VB6实现Ring3下直接调用Ring0层函数,反一切R3下API Hook。 接论坛帖子:http://topic.youkuaiyun.com/u/20120518/18/9a00ec5c-b3d1-4a1f-9bc1-ba1a47b52463.html 例子应用如下。我只是给一个方法给大家,这个方法肯定很麻烦,有需求的人可以用。 添加Module1 Private asm_CallCode() As Byte, KiFastSystemCall&, KiIntSyst 阅读详情

作者:VXK/CVC.GB
时间:2005-02-05
每次上driverdevelop总看到有人问怎么在Ring0下调用Ring3的代码——
Ring3使用Ring0已经是地球人全知道的事情了,但是ring0下使用ring3的代码
恐怕很少有人知道,Ratter和Benny这两个高人以及Elzc的作者Elzcor各自提出
过一种方法。总结起来就是三种方法,Zombie在2004年也提出过一个方法看起
来像是Ratter和Elzcor的方法结合而成~
当然说其本质都是一种思想把ring3代码搞到ring3的空间去执行,听起来
大家也好像有所明白了吧,Benny的方法是在Ring0的向Ring3进程插入代码执行,
Ratter则是Hook KAPIZ等待用户层调用发生把ring3代码放回Ring3空间,利用
KeUserModeCallBack来执行,Elzcor则是自己建立一个进程把代码内存感染到
进程执行。Zombie取两家之长搞的~。
今天我来向大家介绍的更像是Ratter和Benny的方法结合,对于Benny的方法,
我不完全采用,我采用的思想仍然是代码放回Ring3空间~
首先无论如何我们都要有一个进程~
习习~Windows提供强大的kernel函数帮我们虐待用户~
PsSetCreateProcessNotifyRoutine摄定好NotifyRoutine在创建进程时我们就
可以yy进程了~
通过DDK文档MSDN的大叔的帮助,这个函数
PsSetCreateProcessNotifyRoutine有两个参数
返回值是NTSTATUS型,第一个参数是回调函数NotifyRoutine,第二个参数是Bool型的
如果第二个参数为False表示设定NotifyRoutine,为True就是取消~
NotifyRoutine的形式如下
NotifyRoutine proc dwParentId:DWORD, dwProcessId:DWORD, bCreate:BOOL
这样我们就可以获得一个进程了~~xixi~~
我们的NotifyRoutine只处理dwProcessId和dwProcessId,对bCreate不用理,通过使用ps
函数PsLookupProcessByProcessId得到PEPROCESS结构(得不到结构的不处理),再取进程Name
如果是Explore且插入标识无就开始我们的插入~(选Explore的原因我就不用说了吧?)
插入时我采用Ratter的方法,于是乎就要用KeAttachProcess,Attach到进程然后开始
工作~~呵呵~~
插完了就用回调CallBackUserMode~~然后DetachProcess...
KeUserModeCallBack的参数
NTSTATUS KeUserModeCallback (
IN ULONG ApiNumber,
IN PVOID InputBuffer,
IN ULONG InputLength,
OUT PVOID *OutputBuffer,
IN PULONG OutputLength
)
可能看不出来怎么使它返回UserMode执行任意代码,但是如果你看看win2ksrc/private/ntos/ke/i386/
下的callback.c和callout.asm就会发现世界真奇妙~~~居然KiCallUserMode回调的是~~~~~xixi~~~~
我不说了,大家应该自己研究一下吧~
另外我提一下参数传递的问题,这里使用KeUserModeCallBack必须要用有效的InputBuffer和OutputBuffer
当KeUserModeCallBack发生时,调用我们的Ring3代码参数传入的方式好像是PUSH进来的
KiCallUserMode中回调USER的时KiServiceExit回自动的飞向我们的代码~
类似发生下面的事情~
(
;这些代码并非真的在KiCallUserMode里存在~
;只是我个人的猜测,因为softice跟到最后到处是[ebx+xxx],[esi+xxx]这样的东西~
;实在难说~做后使用jmp _KiServiceExit返回ring3的代码更是头大~
;不过分析的说可能是栈传入参数~
;如果看ntos/ke/i386/下的分析,估计会更头大~它的栈传递和stack变换等等搞的很晕~~
;不过可以肯定的说,就是已经到了ring3了,我们自己做个检测不就行了?
;hehe~具体到底是怎么传递的呢?大家做个检测吧,我不说了~
;正确的函数传递方式:Kernel是怎么运行我们的函数的~
push Outlength
push lpOutBuffer
push Inlength
push lpInBuffer
push API_NUMBER
call KeUserCallBackDispatch
KeUserCallBackDispatch:
add esp,4
pop edx ;edx=Api_Number
mov eax,fs:[PcTeb]
mov eax,[eax].TebPeb
mov eax,[eax].PebKernelCallbackTable
call [eax+edx*4] ;Real Call To [EAX+EDX*4],hehe~~
;我们计算的api_number被还原了~~~xixi~~~下面的代码里有那个计算~~呵呵~~

)

虽然是这样的,但是我还是劝各位不要用KeUserModeCallBack来传递参数给我们的Ring3代码,要传递也应
该使用其它方法——比如Ratter把参数Copy到Ring3代码后面,然后再代码里重定位到地方取参数~
返回参数EAX是KeUserModeCallBack的,因而要想要返回参数就要传递outsize为strlen(lpoutbuf)就行了~~
如果非要传递,应该小心一些~因为可能蓝屏~我也不知道为什么~呵呵~

我还有一种方法就是覆盖KeUserCallbackDispatcher为我们Ring3代码的地址----大多数情况下会蓝,然后
用KeUserModeCallBack执行,这样我们就可以通过一个常见systemcall_number来执行我们代码,另外通过分析ntos/ps/psinit.c
我发现KeUserCallbackDispathcer就是NTDLL里的KiUserCallbackDispatcher~~~习习~~~
那样避免蓝屏要用在进程空间改写KiUserCallBackDispatch和插入代码~
内核空间改写的话,要指向内核地址,ring3代码要插入内核的NTDLL空间中~
记得不论在哪里改写都要最后调用原函数~~~!!!!!!!!!~~~~
......(这种方法是我最z发现的阿阿----其实是听erx大哥讲的一个思路~)
再多说就成了教唆犯罪了~

在ring0调用Ring3的代码的续
 
  利用建立新的APC方法回调代码——原创者不详~
  这种方法一般应用用户层和内核驱动之间有交互——KeUserModeCallBack的是插入回调,
  Infect是感染进程~
  但是建立新APC的方法更温柔一些,呵呵~~
所用到的函数是两个undoc的函数,具体的原始形态实在是简单——感谢Open Source Windows~~~

VOID
KeInitializeApc (
   IN PRKAPC Apc,//我们要自己初始化这个OurApc=ExAllocatePool(NonPagedPool, sizeof(struct _KAPC));
   IN PRKTHREAD Thread,//目标线程——用户层交互的话,直接KeGetCurrentThread()好了
   IN KAPC_ENVIRONMENT Environment,//应该添0,就是CurrentApcEnvironment
   IN PKKERNEL_ROUTINE KernelRoutine,//我们的APC处理函数MyApcRoutine,在APC_LEVEL上运行,很恐怖的高级,kernel mode apc!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
   IN PKRUNDOWN_ROUTINE RundownRoutine OPTIONAL,//添NULL,
   IN PKNORMAL_ROUTINE NormalRoutine OPTIONAL,//添入我们的ring3层的Ring3App代码线性地址,其实是user mode 的APC处理Routine,~~~privalige非常吓人~~~
   IN KPROCESSOR_MODE ApcMode OPTIONAL,//1,使用NormRoutine
   IN PVOID NormalContext OPTIONAL//第一个参数~~~我们ring3层代码的,习习
   )

完成APC初始化后,我们要插入我们的APC了
BOOLEAN
KeInsertQueueApc (
   IN PRKAPC Apc,//OurApc
   IN PVOID SystemArgument1,//Ring3App的第二个参数arg2
   IN PVOID SystemArgument2,//Ring3App的第三个参数arg3
   IN KPRIORITY Increment//0
   )

Ring3层代码的样子::    
void Ring3App(ulong arg1,ulong arg2,ulong arg3);

我们在kernel mode 的APC
//我们也可以在这做点什么,不过APC_LEVEL这个高级别东西,我们最好还是不要做什么大动作~
void MyApcRoutine(struct _KAPC *Apc,//Apc结构不说了吧?
              PKNORMAL_ROUTINE norm_routine,//我们的Ring3App地址
              void *context,//arg1
              void *SysArg1,//arg2
              void *SysArg2)//arg3
{
   ExFreePool(Apc);
   return;
}


整体的思想的代码:
//in kernel mode
PKAPC OurApc;
void SendApc(ulong addr,ulong arg1,ulong arg2,ulong arg3)
{
     PKTHREAD thread=KeGetCurrentThread();
    OurApc=ExAllocatePool(NonPagedPool, sizeof(struct _KAPC));

   KeInitializeApc(OurApc, thread, 0,
      (PKKERNEL_ROUTINE)&MyApcRoutine, 0,
   (PKNORMAL_ROUTINE)addr, 1, (PVOID)arg1);
   KeInsertQueueApc(OurApc, (PVOID)arg2, (PVOID)arg3, 0);
   *((unsigned char *)thread+0x4a)=1;//这句代码强制线程发生APC调用~
   //kthread+0x4a的地方是KTHREAD->ApcState(kthread+0x34)->UserApcPending(ApcState+0x16)~~~
   //xixi~~~
   return ;
}
//in user mode
void Ring3App(ulong arg1,ulong arg2,ulong arg3)
{
....
}
   
void SendQp(..)
{
 ....
 SendBuf = BuildUpIrp(IRP_XXX_YYYY);
 SendBuf->BackAddr=(ULONG)Ring3App;
 ....
 ReturnBuf = SendIrp(hDevice,SendBuf,sizeof(SendBuf));
 ....
 ....

利用调用门从Ring 3进入Ring 0[转] ☆ 利用调用门从Ring 3进入Ring 0观察用户空间程序memdump.exe执行时CS、DS、FS所对应的段描述符:--------------------------------------------------------------------------> memdump -l 8GDTR.base             = 0x8003F000GDTR.limit        阅读详情

相关推荐

ring0驱动调用ring3应用程序 从RING0级下启动RING3级的应用程序源代码

从RING0级下启动RING3级的应用程序源代码 ring0驱动调用ring3应用程序.zip

64位内核开发第十二讲,进程监视,ring3跟ring0事件同步.

一丶同步与互斥详解,以及实现一个进程监视软件. 1.用于线程同步的 KEVENT 事件很简单分别分为 事件状态. 以及事件类别. 事件状态: 有信号 Signaled 无信号 Non-signaled 事件类别 自动恢复 Synchronization 自动设置 不自动恢复. Notification 手动设置 事件的创建函数 ** IoCreateNotificationEvent() ** *...

weixin_30315435的博客 426

新手别怕!用‘东北天’和‘右前上’坐标系,5分钟搞懂惯性导航姿态矩阵(含Python验证代码)

本文通过‘东北天(ENU)’和‘右前上(RFU)’坐标系,详细解析惯性导航中的姿态矩阵概念。包含Python代码验证,帮助新手快速理解坐标变换、欧拉角及旋转矩阵的构建与应用,特别强调有限转动不可交换性与无限转动次序无关的区别。

weixin_29062255的博客 333

ring0 APC插dll

ring0 APC插dll...........虽然来自代码流氓...XX原因不在空间发....不过Sudami牛发了...俺就把代码帖上来吧...呵呵........不许做坏事哦....高手飘过      ----by sysnap           #include #define MAX_PID 65535 /////////////////////////////////

blackbean的专栏 625

从零搭建AGV避障系统:我用激光雷达+树莓派视觉模块踩过的那些坑

本文分享了基于树莓派与国产激光雷达从零搭建低成本AGV避障系统的实战经验。针对复杂仓库环境,详细剖析了激光雷达数据噪声、视觉模块算力瓶颈、IMU漂移等核心挑战,并提供了多传感器融合、软件架构设计与避障决策的具体解决方案,为中小型自动化改造项目提供了宝贵参考。

git9versioner的博客 985

STM32F103xx / STM32F429VET6最小系统原理图

心血来潮想试一下STM32F4系列和F1系列在编程上有什么差别,手头没有开发板,本着能勤俭节约的原则自己先做一块看看能不能成,看了一下STM32F429VET6的芯片在F429xx中最便宜,对照着数据手册绘制了原理图画了PCB,目前打板中,焊接完如果跑不通回来修改文章。这里我们可以看到,VDD是标准工作电压,VDDA是模拟工作电压,且VDDA必须与VDD等电位,VBAT是备份工作电压,一般接纽扣电池电源,如果存在VREF+引脚,则要求VDDA-VREF+ < 1.2V。截图下来比较糊,不知道为什么。

m0_51294753的博客 1万+

转一个win32k回调实现自定义r3函数的方法 教主威武

<br />ring0调用ring3早已不是什么新鲜事,除了APC,我们知道还有KeUserModeCallback.其原型如下:<br />NTSTATUS<br />KeUserModeCallback (<br />     IN ULONG ApiNumber,<br />     IN PVOID InputBuffer,<br />     IN ULONG InputLength,<br />     OUT PVOID *OutputBuffer,<br />     IN PULONG O

Sunny_wwc的专栏 2882

智能检查点优化:动态频率与差异化存储的断点续训实践(模型训练丨容错机制丨人工智能)

本文深入探讨了大规模模型训练中智能检查点优化的核心实践。针对传统固定频率保存导致的存储浪费与恢复缓慢问题,提出了基于损失变化率的动态频率算法与分层差异化存储策略。通过PyTorch代码示例,详细展示了如何实现动态调度与增量保存,有效降低存储成本,并确保训练中断后能快速、可靠地恢复,显著提升训练任务的容错能力与经济效益。

weixin_29072299的博客 335

Ring0和Ring3

Intel的CPU将特权级别分为4个级别:RING0,RING1,RING2,RING3。 Windows只使用RING0和RING3,RING0只给操作系统用,RING3谁都能用。 如果普通应用程序企图执行RING0指令,则Windows会显示“非法指令”错误信息。因为有CPU的特权级别作保护。 ring0是指CPU的运行级别,ring0是最高级别,ring1次之,ring2更次之…… 以Li...

weixin_43742894的博客 3184

利用大模型和聚类算法找出 Excel 文件中重复或相似度高的数据,并使用 FastAPI 进行封装的详细方案

tokenizer将输入的文本列表texts转换为 PyTorch 张量,同时进行填充和截断操作,以确保所有输入具有相同的长度。对输入进行推理,得到模型的输出。对模型的最后一层隐藏状态求平均,得到每个文本的向量表示。.numpy()将 PyTorch 张量转换为 NumPy 数组。使用DBSCAN算法对文本向量进行聚类。eps是邻域半径,是形成核心点所需的最小样本数。fit方法对输入的向量进行聚类,并返回每个样本所属的簇标签。try:定义了一个 POST 请求的 API 路由,路径为。

AI的内部世界的博客 1069

AI + 药物临床试验研发赛道

研究日期:2026-07-09 | 研究主题:AI + 药物临床试验研发赛道 | 聚焦岗位:Agent 平台架构师 / AI 工程架构师。

AI天才研究院 148

ring0调用Ring3的代码

在ring0调用Ring3的代码    作者:VXK/CVC.GB时间:2005-02-05 每次上driverdevelop总看到有人问怎么在Ring0下调用Ring3的代码——Ring3使用Ring0已经是地球人全知道的事情了,但是ring0下使用ring3的代码恐怕很少有人知道,Ratter和Benny这两个高人以及Elzc的作者Elzcor各自提出过一种方法。总结起来就是三种方法,Zomb

1471

【OpenClaw企业级智能体实战】第09篇:OpenClaw金融投研实战:17个场景+完整代码,打造专属数字研究员

金融投研面临信息过载、流程重复、数据安全合规三大核心痛点,OpenClaw作为本地部署的新一代AI智能体,凭借“长期记忆+主动执行+数据不出域”的优势,成为券商分析师集体追捧的效率工具。本文基于8家头部券商公开研报,拆解OpenClaw在金融投研的17个核心应用场景(信息处理、研报撰写、量化策略、流程自动化),详解原理、技术选型、实操流程,并提供可直接运行的完整代码与执行结果。文章兼顾新手入门与进阶提升,强调安全隔离部署与幻觉防范,读者可按步骤搭建专属投研智能体,将信息处理、数据整理等重复工作效率提升80%

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 677

KeUserModeCallback用法详解(Ring0调用Ring3代码)

ring0调用ring3早已不是什么新鲜事,除了APC,我们知道还有KeUserModeCallback.其原型如下: 代码: NTSTATUS KeUserModeCallback (      IN ULONG ApiNumber,      IN PVOID InputBuffer,      IN ULONG InputLength,      OUT PVOID *OutputB

zacklin的专栏 4271

还在用 RaiDrive/Rclone 挂载网盘?教您使用Windows 原生 WebDAV 丝滑直连 AList/Openlist,让你的网盘秒变本地硬盘!

网盘文件分散管理?😩 别再依赖第三方工具了!本文教你如何在 Windows 下,利用原生 WebDAV 功能,将 Openlist 网盘直接映射为本地硬盘!💻 操作简单,告别繁琐,让你的云端文件像本地文件一样丝滑!🚀 轻松实现高效管理,快来体验吧!

XiaoqiangClub的博客 2978

假人有限元模型

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

调用门使代码段从ring3调用到ring0再回到ring3的过程

GDT和LDT分别为全局描述表和局部描述表,其中表中每一项又叫做段描述符。段描述符,由段地址,以及段类型,特权级DPL等组成,其中段类型说明此段是代码段还是数据段,还是各种门,还是TSS等。通过GDT访问某个段的时候需要使用段选择符来进行调用。普通调用下,是根据是否是一致代码段进行同级权限代码段之间的调用,或者是低权限向高权限代码的调用,但是CPL不会改变。如果想要从低权限向高权限调用,并且可以改...

weixin_30470857的博客 279

Statistics and Machine Learning Toolbox

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

RING3到RING0

当我在说跳转时,说的什么? CPU有很多指令,不是所有的指令都能够随时用,比如 ltr指令就不是随便什么时候能用,在保护模式下,如果你不安规则来执行指令,CPU就会抛出异常,比如你在INTEL手册上就能看到如下文本 意思据是说,如果你当前的CPL不是RING0,那么就会抛出GP(0)异常! 所以要正确使用这个指令,你就需要将CPL跳转到RING0来。这就是跳转! RING3到RI...

weixin_30632089的博客 183

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

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

[收藏] Ring0 Call Ring3

pjf(jfpan20000@sina.com)很久没写什么东西,一来文笔太烂,二来我不是一般的懒。这个东西一看题目也就知道又是一篇无聊的帖子,凑凑数先。因为最近决定把读本科时的古董机上的东西收拾一下,看到一些最初学习时的老代码,回忆往日的时光,还颇有一些感慨呢...以后有空就选一些贴贴,也不怕人笑了。今天第一帖,代码原是大二时为NT4系统写的,是原先实践x86体系写的,作用是在Driver中“调

Purpleendurer@优快云 3464

【转】ring3 CPU指令级别--操作内核的一些系统级别工具

RING3   什么是RING3?这得从CPU指令系统(用于控制CPU完成各种功能的命令)的特权级别说起。在CPU的所有指令中,有一些指令是非常危险的,如果错用,将导致整个系统崩溃。比如:清内存、设置时钟等。如果所有的程序都能使用这些指令,那么你的系统一天死机n回就不足为奇了。所以,CPU将指令分为特权指令和非特权指令,对于那些危险的指令,只允许操作系统及其相关模块使用,普通的应用程

autumn20080101的专栏 2017

[转载]用汇编写个最小的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

Ring0 Call Ring3

pjf(jfpan20000@sina.com)很久没写什么东西,一来文笔太烂,二来我不是一般的懒。这个东西一看题目也就知道又是一篇无聊的帖子,凑凑数先。因为最近决定把读本科时的古董机上的东西收拾一下,看到一些最初学习时的老代码,回忆往日的时光,还颇有一些感慨呢...以后有空就选一些贴贴,也不怕人笑了。今天第一帖,代码原是大二时为NT4系统写的,是原先实践x86体系写的,作用是在Driver中“调

2501

专注于操作系统18之完整的特权级转换

在上一篇文章中,我们已经能从ring0级进入到ring3级,在这里我们将再加上从ring3级到ring0级。从ring3级到ring0级这需要使用在第十四篇文章中提到的调用门来实现。即在进入ring3级后,在使用调用门来调用ring0级代码(注意当发生特权级转换时,堆栈是发生了变化的,上一篇文章已说明从ring0级到ring3级堆栈所发生的变化。当从ring3到ring0级时,ring0级堆栈信息

大道至简的专栏 1102

任意用户模式下执行 ring 0 代码

<br />        众所周知在非 Admin 用户模式下,是不允许加载驱动执行 RING 0 代码的。<br /> 本文提供了一种方法,通过修改系统 GDT,IDT 来添加自己的 CALLGATE 和<br /> INTGATE 这样便在系统中设置了一个后门。我们就可以利用这个后门<br /> 在任意用户模式下执行 ring 0 代码了。为了保证我们添加的 CALLGATE 和 INT<br /> GATE 永久性。可以在第一次安装时利用 SERVICE API 或 INF 文件设置成随<br />

Rprop 2813

用汇编写个最小的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

调用门实战(4)----特权级转移实践

本次实践从ring0进入ring3然后又回到ring0

金俊小筑 1009

特权级--ring0到ring3

内核要和用户程序分开,内核一定要安全,不能被用户程序干涉,但是有时候用户程序也需要读取内核的某些数据,怎么办呢?x86就引入了访问特权等级(0-3)的机制,x86 cpu共有4个特权级 level0 到 level3 其中level0特权级最高,level3特权级最高。处理器通过识别CPL、DPL、RPL这3中种特权级进行特权级检验。 CPL(Current Privilege Level)是当

kwame211的博客 578
上一篇: Process Initiation
下一篇: 终止进程的内幕
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值