KiFastCallEntry自己理解

#define KI_USER_SHARED_DATA         0xffdf0000

#define SharedUserData  ((KUSER_SHARED_DATA * const) KI_USER_SHARED_DATA)

 

KUSER_SHARED_DATA 结构区域在 User Kernel 层地址分别为:

User 层地址为:0x7ffe0000

Kernnel 层地址为:0xffdf0000

 

 

kd> dt nt!KUSER_SHARED_DATA 0xffdf0000

   +0x000 TickCountLowDeprecated : 0

   +0x004 TickCountMultiplier : 0xa03afb7

   +0x008 InterruptTime    : _KSYSTEM_TIME

   +0x014 SystemTime       : _KSYSTEM_TIME

   +0x020 TimeZoneBias     : _KSYSTEM_TIME

   +0x02c ImageNumberLow   : 0x14c

   +0x02e ImageNumberHigh  : 0x14c

   +0x030 NtSystemRoot     : [260] 0x43

   +0x238 MaxStackTraceDepth : 0

   +0x23c CryptoExponent   : 0

   +0x240 TimeZoneId       : 0

   +0x244 LargePageMinimum : 0x400000

   +0x248 Reserved2        : [7] 0

   +0x264 NtProductType    : 3 ( NtProductServer )

   +0x268 ProductTypeIsValid : 0x1 ''

   +0x26c NtMajorVersion   : 5

   +0x270 NtMinorVersion   : 2

   +0x274 ProcessorFeatures : [64]  ""

   +0x2b4 Reserved1        : 0x7ffeffff

   +0x2b8 Reserved3        : 0x80000000

   +0x2bc TimeSlip         : 0

   +0x2c0 AlternativeArchitecture : 0 ( StandardDesign )

   +0x2c8 SystemExpirationDate : _LARGE_INTEGER 0x0

   +0x2d0 SuiteMask        : 0x112

   +0x2d4 KdDebuggerEnabled : 0x3 ''

   +0x2d5 NXSupportPolicy  : 0x2 ''

   +0x2d8 ActiveConsoleId  : 0

   +0x2dc DismountCount    : 0

   +0x2e0 ComPlusPackage   : 0xffffffff

   +0x2e4 LastSystemRITEventTickCount : 0x9dd368

   +0x2e8 NumberOfPhysicalPages : 0xff7a

   +0x2ec SafeBootMode     : 0 ''

   +0x2f0 TraceLogging     : 0

   +0x2f8 TestRetInstruction : 0xc3

   +0x300 SystemCall       : 0x7c95ed50  //KiFastCallEntry() stub 函数也就是//KiFastSystemCall()

   +0x304 SystemCallReturn : 0x7c95ed54

   +0x308 SystemCallPad    : [3] 0

   +0x320 TickCount        : _KSYSTEM_TIME

   +0x320 TickCountQuad    : 0x38e31e

   +0x330 Cookie           : 0x38d2fc64

   +0x334 Wow64SharedInformation : [16] 0

kd> u 0x7c95ed50

7c95ed50 8bd4            mov     edx,esp

7c95ed52 0f34            sysenter

7c95ed54 c3              ret

7c95ed55 8da42400000000  lea     esp,[esp]

7c95ed5c 8d642400        lea     esp,[esp]

7c95ed60 8d542408        lea     edx,[esp+8]

7c95ed64 cd2e            int     2Eh

7c95ed66 c3              ret

kd> u 0x7c95ed54

7c95ed54 c3              ret

7c95ed55 8da42400000000  lea     esp,[esp]

7c95ed5c 8d642400        lea     esp,[esp]

7c95ed60 8d542408        lea     edx,[esp+8]

7c95ed64 cd2e            int     2Eh

7c95ed66 c3              ret

7c95ed67 55              push    ebp

7c95ed68 8bec            mov     ebp,esp

 

kd> u 0x7c95ed50 //KiFastSystemCall()

7c95ed50 8bd4            mov     edx,esp

7c95ed52 0f34            sysenter

7c95ed54 c3              ret

kd> u 0x7c95ed54

7c95ed54 c3              ret

 

ntdll!ZwWriteFile:
7c957b9d b81c010000      mov     eax,11Ch                                                      ;
系统服务例程号
7c957ba2 ba0003fe7f  mov   edx,offset SharedUserData!SystemCallStub (7ffe0300)          

 ; 取得 KiFastCallEntry() stub 函数
7c957ba7 ff12            call    dword ptr [edx]

; 调用这个 stub 函数
7c957ba9 c22400          ret     24h

 

 

 



 

 

 

 

 

x86 体系的 sysenter/sysexit 指令快速切入机制里 IA32_SYSENTER_ESP 寄存器(MSR 地址为 175h)提供了 ESP 值。但是,在 windows 里并没有使用这个值,而是使用 KPCR 结构 TSS 块里的 ESP 值。

        //
        //
得到当前 TSS 块,并读取 0 级的 esp

        //
注意:这个 Esp0 指向一个 KTRAP_FRAME 结构的 V86Es 成员!

就是指到STACK原点

 

 


        // Esp0
值减去 0x7c 就等于 KTRAP_FRAME 结构地址,trap 用于 context 信息
        // esp
被赋予 KTRAP_FRAME 结构地址:esp = KtrapFrame,它以 push  的方式保存 context 信息       //
        PKTSS Tss = GetCurrentTss();                        
        PKTRAP_FRAME KtrapFrame = (PKTRAP_FRAME)(Tss->Esp0 - 0x7c);

 

 

在KiFastCallEntry() 在 KTRAP_FRAME 里保存下面的内容:

 

KtrapFrame->Eip = UserSharedData->SystemCallReturn;                // 保存返回函数

 

 

总结:R3的函数调用通过USERSHAREDATA中的/KiFastSystemCall(),实际也就是

/KiFastCallEntry() 的一个代理函数stub,进入sysenter, 在系统INIT的时候其EIPWRMSRKiFastCallEntry函数,其ESP指到V86ES,这样将类似与INT2E,陆续将起SSEIP  CS FLAG压入,创建一个等同与INT2E,但未触发中断的快速调用。

当返回时,KiFastCallEntry将其返回的EIP设置成USERSHAREDATA中的KiFastSystemCallret,从而返回到用户R3

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

<p> 现在的网络在线教学会教你写驱动、写应用层代码、写界面、还会教你玩逆向、以及一些调试技巧。但在安全软件开发领域,却没有教程会教你从实际的项目角度去切入,如何灵活的应用这些知识,最终打造一款安全产品出来。它涵盖了通过对安全趋势感受选择方向,确定后分析威胁(分析大部分样本)归纳其共性后,进而推导出防御思路,单调的防御思路还不足以形成产品,此时需要思考还需添加哪些功能才能使其足够成熟,能够满足基本产品级要求。再对所有功能进行归纳划分,最后产生成熟的架构。再根据架构开始进行驱动、应用层、界面的代码编写,这中间踩过的坑,遇到的坎,我都将一一为大家呈现。看到这里,估计你的心中也有点了然了。<br /> 是的,这真的可能是目前网络安全开发领最硬核的在线教程了。那么你准备好了吗?<br /> <br /> 本课程的前面两章,讲解如何感受与判断当前的安全趋势,如何判断某一种威胁是否具有流行的潜力;如何产生对抗思路;如何产生最终安全产品的技术架构并梳理出核心流程。虽然只有两章,但其实关于设计模式,技术选型的批判与自我批判将贯穿本课程所有章节。<br /> <br /> 第三章讲解应用层核心服务模块设计与实现,包括与各模块间的互交通讯、握手处理等;也将重点讲解在安全产品通讯设计中,如何抉择哪些通讯需加密,哪些无需,为什么?当然还包括核心服务模块的日常事物的处理等。核心模块是整个产品架构的通讯中枢,乃重中之重,通过学习核心模块设计实现便可掌握整个安全软件的具体运作流程(套路)。为自己将来设计安全软件打个基础。同时也会涉及到逆向工程,讲解当你需要一个功能但手上没有相关代码,并且网络上给出的代码都不成熟的情况下,如何去寻找合适的成熟产品进行逆向。<br /> <br /> 第四章的重点在于探讨在加密算法的安全性问题。在特定的环境下,原来安全的加密算法可能变得不安全,同样的原来不安全的加密算法也可能变得安全。本节会告诉你如何灵活的去理解并运用。<br /> <br /> 第五章前十节是讲解驱动基本知识,开发环境搭建、windbg使用(有彩蛋)、编写windbg高级调试脚本、Verifier使用技巧等。然后对内核hook安装与卸载的稳定性进行深入探讨与论证实验(包括了普通hook和inlinehook),最后得出第一手结论(说它是第一手是因为目前网络上的资料还没有人给出这样的结论),此过程中深入分析了360对KiFastCallEntry(高频函数)进行hook时分别使用两种模式的原因。前十章能使你的驱动代码稳定性上升到一个新台阶。后面则讲解终结者的sfilter框架,包括如何在驱动中使用各种数据结构:链表、延展树、资源锁、消息传递注意点等等。因为目前网络上的资料,对内核中的各种小花招讲的很多,但是对各种数据结构设计、消息的处理与衔接之类的讲的太少,或者说压根就没讲。而本章会也会重点讲解这一块,因为这才是安全软件稳定性的第一保障!<br /> <br /> 第六章是探讨面对安全威胁时,如何针对实际情况设计相应的清除思路,然后讲解守护模块在安装时如何启动服务,以及在安装后是如何与服务实现互相守护。<br /> <br /> 第七章前五节是对SOUI这个界面库进行介绍,并且讲解了布局,系统控件,自定义控件的使用方法。同时也会讲解选择SOUI界面库的原因,这是一个及其简单易用的界面库(比qt之类的简单多了),你只要会点MFC的基本知识就能写个炫酷界面。然后讲解终结者【引导页】的布局设计与源码剖析、【主界面】与【威胁消息回调页面】布局与源码剖析;最后讲多种启动模式的设计与处理,接口的处理等。<br /> <br /> 第八章讲解安全类软件在编写卸载程序与安装包时的一些注意事项,当然也包括了这两类模块的编写方法。<br /> <br /> <br /> <br /> 预备知识<br /> <br /> 预备知识的最低要求是必须熟练掌握C语言。<br /> 什么?你对windows api不熟,没事,我们有源码!<br /> 什么?你对内核api不熟,没事,我们有源码!<br /> 什么?你对界面编程不熟,没事,我们有源码!<br /> 我们不仅有源码,我们还管售后,我们是三人团队,一个日常事务,两个技术售后(包括我)。大家购买课程以后,可以加下这个qq群:698220527【安全软件开发实战】 群主是【铁汉】,QQ号:66854746 看仔细了哈。<br /> 我们首先会把源码发你,如果你有学不明白的地方可以在里面提出来,大家互相切磋。<br /> <br /> 注意<br /> <br /> 每位学员送一套【勒索软件终结者】源码,可以看着源码跟着课程进行学习!关键章节都带有课后作业,分为必做题和非必做题。我对必做题也进行了“爱”设计,它可以确保一个事情:如果你做得出来,就代表你一定看懂了整体框架和运作流程。做不出来那一定是没看懂!不会存在看懂了但做不出来,或者做出来了但没看懂的情况。作业的设计,本身也是一种攻防嘛。<br /> <div> <br /> </div> </p> <p> <span></span> </p>
©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值