Windows NT/2000内部数据结构探究(http://webcrazy.yeah.net)

探究Windows 2000/XP原型PTE(http://webcrazy.yeah.net) 探究Windows 2000/XP原型PTE              WebCrazy(http://webcrazy.yeah.net)    内存管理可以说是操作系统实现中最重要的环节,也是最为复杂的一环节。对于相对贫乏的内存资源,内存共享也成了一个很重要的有效手段。Windows 2000/XP在此方面的实现借助于一个称为原型PTE(Prototype PTE,PPTE)的软件机制。在《小 阅读详情
 Windows NT/2000内部数据结构探究
                   WebCrazy( tsu00@263.net)
                        注:本文最初见于 www.nsfocus.com

    WINDOWS系统隐含了不少内部数据结构,其记录着与系统相关的所有重要信息如线程、进程、内核调用等等,具体如Windows NT/2000模块ntoskrnl.exe中的NtBuildNumber与KeServiceDescriptorTable等(用SoftICE或Visual Studio所带的Dependency Walker之类的可以看到),前者只是指出当前Windows的Build号(如SoftICE下可用dw命令查出我的机器中为0893h 即十进制2195);后者是指向如下数据结构的指针:
    struct _ServiceDescriptorEntry {
       unsigned int *ServiceTableBase;
       unsigned int *ServiceCounterTableBase;
       unsigned int NumberOfServices;
       unsigned char *ParamTableBase;
    }ServiceDescriptorTableEntry

    其典型应用为Mark Russinovich与Bryce Cogswell的Regmon,具体可以参阅 www.sysinternals.com.
    本文仅在Intel i386的Windows 2000 Server(Build 2195)中对TEB(Thread Environment Block)作初步介绍.
    TEB在Windows 9x系列中称为TIB(Thread Information Block),她纪录着线程的重要信息,每一个线程对应一个TEB结构。其格式如下(摘自Matt Pietrek的Under the Hood专栏-MSJ 1996):
    typedef struct _TIB
    {
        PEXCEPTION_REGISTRATION_RECORD pvExcept; // 00h Head of exception record list
        PVOID pvStackUserTop; // 04h Top of user stack
        PVOID pvStackUserBase; // 08h Base of user stack

        union // 0Ch (NT/Win95 differences)
        {
            struct // Win95 fields
            {
                WORD pvTDB; // 0Ch TDB
                WORD pvThunkSS; // 0Eh SS selector used for thunking to 16 bits
                DWORD unknown1; // 10h
            } WIN95;

            struct // WinNT fields
            {
                PVOID SubSystemTib; // 0Ch
                ULONG FiberData; // 10h
            } WINNT;
        } TIB_UNION1;

        PVOID pvArbitrary; // 14h Available for application use
        struct _tib *ptibSelf; // 18h Linear address of TIB structure

        union // 1Ch (NT/Win95 differences)
        {
            struct // Win95 fields
            {
                WORD TIBFlags; // 1Ch
                WORD Win16MutexCount; // 1Eh
                DWORD DebugContext; // 20h
                DWORD pCurrentPriority; // 24h
                DWORD pvQueue; // 28h Message Queue selector
            } WIN95;

            struct // WinNT fields
            {
                DWORD unknown1; // 1Ch
                DWORD processID; // 20h
                DWORD threadID; // 24h
                DWORD unknown2; // 28h
            } WINNT;
        } TIB_UNION2;

        PVOID* pvTLSArray; // 2Ch Thread Local Storage array

        union // 30h (NT/Win95 differences)
        {
            struct // Win95 fields
            {
                PVOID* pProcess; // 30h Pointer to owning process database
            } WIN95;
        } TIB_UNION3;

     } TIB, *PTIB;

  在Windows 2000 DDK中定义为:
    typedef struct _NT_TIB
    {
        struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList;
        PVOID StackBase;
        PVOID StackLimit;
        PVOID SubSystemTib;
        union {
            PVOID FiberData;
            ULONG Version;
        };
        PVOID ArbitraryUserPointer;
        struct _NT_TIB *Self;
    } NT_TIB;

    庆幸的是,Windows在调入进程,创建线程时,操作系统均会为每个线程分配TEB,而且都将FS段选择器(i386)指向当前线程的TEB数据(单CPU机器在任何时刻系统中只有一条线程在执行),这就为我们提供了存取TEB数据的途径。实际上Windows都是通过这种方法来为你的应用程序提供信息的,让我们来看一个例子吧!大家都知道用GetCurrentThreadID API来获得当前线程ID的,其在Kernel32.dll是如下实现的:

    GetCurrentThreadID:
    mov eax, FS:[00000018] ; 18h Linear address of TIB structure(TIB结构线性地址)
    mov eax, [eax+24] ; 24h ThreadID
    ret ; 将EAX中的值返回给调用者

    由于TEB结构过于庞大,我现在只来谈谈偏移量为00h的struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList,并结合CIH 1.3源码来说说它具体用处。ExceptionList主要用于处理SEH(Structured Exception Handling)的。如果你连C语言中新增的_try,_except与_finally也不熟悉的话,建议请先看看Jeffery Richter的<<Advanced Windows NT>>或之类的。

  首先让我们来看看_EXCEPTION_REGISTRATION_RECORD结构,在CRT(C++ RunTime library)源码中它如下定义:

    // Exsup.INC ---Microsoft Visual C++ CRT 源文件

    _EXCEPTION_REGISTRATION struc
    prev dd ?
    handler dd ?
    _EXCEPTION_REGISTRATION ends

    其中prev是指向前一_EXCEPTION_REGISTRATION的指针,形成一链状结构,这样才会在EXCPT.H中有EXCEPTION_CONTINUE_SEARCH这样的定义(参阅&t;<Advanced Windows NT>>);handler指向异常处理代码。

    CIH正是利用了这一机制,将handler指向它自己程序中。在它入口处有如下代码:

       .
       .
       .

    ; *********************************************************
    ; * Ring3 Virus Game Initial Program *
    ; *********************************************************

    MyVirusStart: ; Ring3代码入口点
    push ebp

    ; *************************************
    ; * Let's Modify Structured Exception *
    ; * Handing, Prevent Exception Error *
    ; * Occurrence, Especially in NT. *
    ; *************************************

    lea eax, [esp-04h*2]                 ;在栈中分配8字节存放_EXCEPTION_REGISTRATION结构
                     ;相当于C中基于栈的数据,即局部变量(C编译器中完成)
                                         ;这样EAX即指向_EXCEPTION_REGISTRATION的指针,但此时
                     ;_EXCEPTION_REGISTRATION结构未初始化
                                         ;具体实现机制可翻阅编译原理书籍和Matt Pietrek大师文章

                             
    xor ebx, ebx ;0->EBX
    xchg eax, fs:[ebx] ;FS:[0]<->EAX     ;此时EAX存放的是原来异常处理代码,FS:[0]指向TEB中
                      ;ExceptionList(FS指向TEB,ExceptionList偏移为0,即FS:[0])

    call @0
    @0:
    pop ebx                              ;此三行计算代码入口,此时ebx就是@0的地址
    lea ecx, StopToRunVirusCode-@0[ebx]  ;将ecx指向自己内部代码处
    push ecx                             ;填充_EXCEPTION_REGISTRATION结构的handler
                     ;在发生异常时,操作系统会自动调用,此时为CIH代码

    push eax                             ;EAX为原来异常处理代码
                                         ;填充_EXCEPTION_REGISTRATION结构的prev

       .
       .
       .

    这其后CIH调用int 3使系统发生异常,仍能进入自已的代码,这可从CIH源代码中的如下注释得到证实:

    ; *************************************
    ; * Generate Exception to Get Ring0 *
    ; *************************************

    int HookExceptionNumber               ; GenerateException
  HookExceptionNumber定义为3,此段代码会产生异常,具体请参阅CIH源代码。

    因为如上代码比较抽象,我特意将它稍加修改,以便于理解(PE格式可直接在Windows下执行):

    // TestCIH.C 有任何问题联系 tsu00@263.net

    #include <windows.h>
    #include <stdio.h>

    EXCEPTION_DISPOSITION __cdecl _except_handler(  //异常处理程序段               
        struct _EXCEPTION_RECORD *ExceptionRecord,
        void * EstablisherFrame,
        struct _CONTEXT *ContextRecord,
        void * DispatcherContext )
    {
        printf( "CIH Run Here.../n" );
        exit(0); //由于堆栈已被程序打乱,有兴趣的可以自己将它恢复,这儿我只简单的退出
    }

    void main(void)
    {
        _asm
        {
            push ebp

            mov eax, esp
            sub eax, 8         //这两行相当于lea eax, [esp-04h*2]
            xor ebx, ebx
            xchg eax, fs:[ebx]

            call next
      next:
            pop ebx                    //这三行在这没实在意义,只是为了与CIH对比

            lea ecx, _except_handler  //将_except_handler设为异常处理入口
            push ecx

            push eax
        }

        _asm
        {
            mov eax,0
            mov [eax],0       //发生STATUS_ACCESS_VIOLATION异常让操作系统调用_except_handler
        }
    }

    _except_handler回调函数原形可参阅EXCPT.H 
    在main函数中第一个_asm段与前面讨论的CIH代码基本一致,而第二个_asm段则试图写系统保留内存地址,发生异常。
    使用Visual C++如下编译:
        c:>Cl testCIH.c
        c:>testCIH
           CIH Run Here...
    在Windows 2000中,运行此段代码时,出现异常后操作系统将控制权交给_except_handler执行,这样CIH代码在NT/2000环境下在系统修改被其保护的内存地址时(IDT区域),不至于出现非法操作等提示,以达到保护自己的目的!

    我总觉得了解系统安全,首先必须对这个系统有足够的了解,就像了解CIH病毒一样,而目前国内在这方面的资料可真谓少之又少,本文仅在这方面说出我自己的一些切身实践,错误之处,在所难免。如果您有任何发现,如果您对这方面有比较有兴趣,请联系tsu00@263.net.

    最后很感谢绿盟高手的指点与帮助!

    参考文献:

        1.Jeffrey Richter <<Advanced Windows NT>>
        2.Matt Pietrek <<A Crash Course on the Depths of Win32 Structured Exception Handling>>
        3.CIH 1.3源代码

【Ubuntu2404】Ubuntu24.04安装NVIDIA驱动/CUDA/cuDNN搭建神经网络训练环境 NVIDIA 驱动、CUDA和cuDNN是紧密相关但各自具有独特功能的技术,它们共同为图形处理单元(GPU)加速的应用程序提供了强大的支持。本文主要介绍如何安装 `NVIDIA` 驱动、CUDA及cuDNN,为后续神经网络训练提供支持。本文主要介绍Ubuntu24.04安装NVIDIA驱动、CUDA和cuDNN的流程。 阅读详情

相关推荐

Claude Code vs Codex实战对比:哪个更适合你的Next.js项目?(含真实案例)

本文通过两个真实的Next.js项目案例,深度对比了Claude Code与Codex在UI实现和业务逻辑构建中的表现。Claude Code在代码质量、设计还原度和架构完整性方面优势明显,适合对可维护性要求高的生产级项目;而Codex则以快速响应和低成本见长,更适合原型开发或内部工具。文章提供了基于项目类型、团队能力和成本效益的详细选择策略。

weixin_29201859的博客 806

Windows版本和检测

Windows版本和检测 前天在研究PEB位置时发现自XPSP2之后就开始随机变动位置了,而不是想以前那样固定在0X7FFDF000上了.我突然想起以前转发的一篇文章非API函数检测操作系统类型>,此文中就是将PEB位置是否为OX7FFDF000作为区分WINNT和WIN9X的标志的.现在PEB的位置也不固定了,看来判断条件得修正一下了. Windows版本号分为操作系统版本号和服

misterliwei的专栏 2261

手把手教你用IN-Sight智能相机实现双向TCP/IP通讯(附网络调试助手推荐)

本文详细解析了IN-Sight智能相机实现双向TCP/IP通讯的完整流程。通过将相机同时配置为TCP服务器和客户端,构建了与上位机(如PLC、MES)稳定可靠的数据交换通道。文章深入剖析了发送(TCPDevice)与接收(ReadDevice)通道的独立配置、关键参数设置(如结束符CR+LF)、高效调试工具选择以及实战避坑指南,帮助工程师快速掌握这一构建柔性产线数据节点的核心技术。

qsc9012345的博客 671

NtBuildNumber

NtBuildNumber

求索 2142

【初阶】手把手教你轻松上手Denodo | 连接数据库并创建基本视图 (二)

在本教程的第二部分,我们将涵盖:连接到数据库,与创建基本视图。

Denodo的博客 1104

50、压电微泵与技术设备驱动的研究分析

本文研究了压电微泵在弹性微通道中的流体流动特性及技术设备驱动的振动行为。通过建立轴对称流固耦合模型,利用FreeFem++进行数值模拟,分析了不同数量压电致动器和频率对微泵流量的影响,发现多个致动器按特定时序压缩可产生净正向流量,并提出了稳态流量的近似解析公式。同时,针对技术设备驱动系统,探讨了周期性负载引起的强迫振动特性,明确了共振条件及影响因素,并比较了主动、被动和优化设计等振动控制策略。最后展望了实验验证、多物理场耦合与智能控制等未来研究方向,为相关设备的优化设计与高效运行提供了理论支持。

convnet3designer的博客 148

转:Windows NT/2000内部数据结构探究

    WINDOWS系统隐含了不少内部数据结构,其记录着与系统相关的所有重要信息如线程、进程、内核调用等等,具体如Windows NT/2000模块ntoskrnl.exe中的NtBuildNumber与KeServiceDescriptorTable等(用SoftICE或Visual Studio所带的Dependency Walker之类的可以看到),前者只是指出当前Windows的Buil

编程手札 1548

北斗导航 | ILS(仪表着陆系统)、MLS(微波着陆系统)和GBAS(地基增强系统)的性能对比

最 早 的 GBAS 系 统 是 **局 域 增 强 系 统(LAAS)**,它是 1990 年由美国 Honeywell 公司 和 NASA 共 同 完 成 的 差 分 GPS(DGPS)演 变 而 来 的。1998 年,LAAS 被 ICAO 采 纳为 GBAS。2009 年 9 月 3 日 Honeywell 公 司 的GBAS 系统通过了 **CAT-I 精密进近着陆系统**的设计认证 ,而 **CAT-II 和 CAT-III 系统的研发和验证工作也正在有序的进行中**

尘世冰封的专栏 3985

内核里获得系统版本,与系统滴答时间

获得系统版本号。内核编程难免使用硬编码,以及使用一些高版本系统才出现的函数。为了使得驱动能在低版本的系统上正常运行,就需要根据不同系统做不同处理了。 VOID GetVersion() { ULONG NtBuildNumber; RTL_OSVERSIONINFOW osi; osi.dwOSVersionInfoSize=sizeof(RTL_OSVERSIONINFOW); RtlFill...

墨鱼菜鸡 362

YOLO11改进-模块-引入多尺度差异融合模块MDFM

MDFM主要用于融合双时相图像特征并生成带有丰富上下文信息的差异特征,其过程包含以下步骤:1. 特征提取与差异特征生成首先从双时相图像中提取特征f1和f2,然后将f1和f2进行像素级别的相减,再对相减结果取绝对值,最后通过一个3x3的卷积操作得到Di。2. 多尺度特征融合(MSFF)接着利用多尺度特征学习机制来增强特征融合效果。该机制通过不同核大小的卷积构建多尺度融合过程,具体是通过一个名为 MSFF 单元来实现的。

qq_64693987的博客 4378

拼多多笔试真题-多多送快递(C++/Py/Java /Js/Go)

拼多多技术岗笔试 8月2号真题,拼多多笔试第三题【多多送快递】,提供详细思路讲解以及Java、C++、Python、Go、JavaScript多语言代码实现。拼多多笔试真题【多多送快递】多语言题解。

qq_45776114的博客 292

APC注入

/*********************************** desc : This code was written for inject a dll named text.dll to the target process based on APC. time : 2013 coder: ejoywx **********************

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 760

Windows下超详细安装Anaconda3以及jupyter notebook

1.下载Anaconda安装包 Anaconda官网网站:https://www.anaconda.com/products/individual下载安装包速度比较慢,国内小伙伴不建议尝试。 我们可以使用清华大学开源软件镜像站:清华大学开源软件镜像站:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/,请选择适合自己系统自行下载。 下载完成后如下图: 1.安装Anaconda安装包 1.打开安装包,点击Next 2.点击I Agre

m0_37957160的博客 3801

再谈Windows NT/2000内部数据结构(http://webcrazy.yeah.net)

再谈Windows NT/2000内部数据结构               WebCrazy(tsu00@263.net)                        注:本文最初见于www.nsfocus.com     现在我们结合Regmon(http://www.sysinternals.com/)在NT中的实现方法再来谈谈Windows NT/2000内部数据结构。    Regmon

FreeXploiT 1432

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

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

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

浅析Windows NT/2000环境切换(http://webcrazy.yeah.net)

浅析Windows NT/2000环境切换                  WebCrazy(tsu00@263.net)                       注:本文最初见于www.nsfocus.com    本文假设您已经了解Windows NT/2000系统体系,对Windows NT/2000内部KPEB/KTEB等数据结构与内核工作方式已有一定的概念,对80x86保护模式,I

FreeXploiT 2139

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

再谈Windows NT/2000环境切换(http://webcrazy.yeah.net)

再谈Windows NT/2000环境切换                           WebCrazy(tsu00@263.net)    线程是Windows NT/2000环境切换的最基本单位。在浅析Windows NT/2000环境切换>>(Nsfocus Magazine 12)一文中,我只对进程CR3切换进行了较详细的讨论,但未涉及线程调度的内容,本文将尽量讲述这些部分内容。在

FreeXploiT 2805

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

深入Windows NT/2000模块的组织(http://webcrazy.yeah.net)

深入Windows NT/2000模块的组织                    WebCrazy(http://webcrazy.yeah.net/)   在《小议Windows NT/2000分页机制 》中我对x86平台Windows NT/2000的非分页内存内部机制有了较为详细的说明,从中也可以看出地址空间可以分为进程空间与系统空间,其中每个进程有各自的进程空间,而所有的进程则共享同一个

FreeXploiT 1468

解析Windows NT/2000窗口对象的组织(http://webcrazy.yeah.net/)

解析Windows NT/2000窗口对象的组织                        WebCrazy(http://webcrazy.yeah.net/)   Microsoft Visual Studio提供的Microsoft Spy对Windows的窗口组织有非常直观的表现,在Windows视图下的Window Properties可以显示窗口的很多内容或属性。本文将从Windo

FreeXploiT 2165

小议Windows NT/2000分页机制(http://webcrazy.yeah.net)

 小议Windows NT/2000分页机制                     WebCrazy(tsu00@263.net)    内存管理是操作系统最重要的一部分,其决定了操作系统的性能。Intel X86采用分段、分页的内存机制,Windows NT/2000充分利用了此项先进的机制。段内IA-32体系使用页目录(Page Directory)与页表(Page Table,SoftIC

FreeXploiT 1966

Windows 2000 System Services列表(http://webcrazy.yeah.net)

Windows 2000 System Services列表              WebCrazy(tsu00@263.net)    Windows 2000 Server Build 2195 SP0 中文版共从ntoskrnl.exe(x86单处理器版本)中导出248个System Services,而从win2k.sys中导出639个System Services。SoftICE f

FreeXploiT 5136

浅谈Windows 2000/XP File Cache实现(http://webcrazy.yeah.net)

  浅谈Windows 2000/XP File Cache实现              WebCrazy(http://webcrazy.yeah.net)    声明:本文所叙内容为Windows NT/2000/XP的Cache管理内容,涉及内容均为Microsoft Undocumented内容。我在参考大量资料后分析而成,牵涉内容多多少少可能会有些许错误,甚至根本就是错误的,但本着学习

FreeXploiT 2380

Windows XP System Services(http://webcrazy.yeah.net)

 Windows XP System Services              WebCrazy(http://webcrazy.yeah.net)    在《再谈Windows NT/2000内部数据结构》一文中我曾经介绍过Windows 2000 System Call。如今Windows XP正式版已经出来了。从总的System Call的组织上看是没有多大的改变。System Call调

FreeXploiT 6510

Windows 2000内核KPEB/KTEB详细结构(http://webcrazy.yeah.net/)

Windows 2000内核KPEB/KTEB详细结构            WebCrazy(http://webcrazy.yeah.net/)    EPROCESS与ETHREAD结构在Windows NT/2000内核的地位是不言而喻的。他们结构中的成员包含了内核的方方面面,是两个比较大的结构。在Windows 2000 Server Build 2195 Free Ke

FreeXploiT 2134

剖析Windows NT/2000内核对象组织(http://webcrazy.yeah.net)

剖析Windows NT/2000内核对象组织                     WebCrazy(http://webcrazy.yeah.net/)    对象管理器在Windows NT/2000内核中占了极其重要的位置,其一个最主要职能是组织管理系统内核对象。在Windows NT/2000中,内核对象管理器大量引入了C++面向对象的思想,即所有内核对象都封装在对象管理器内部,除对象

FreeXploiT 1671

分析Windows NT/2000堆内存与虚拟内存组织(http://webcrazy.yeah.net)

 分析Windows NT/2000堆内存与虚拟内存组织                      WebCrazy(http://webcrazy.yeah.net/)    在讨论今天这个主题时,我觉得是应该给大家重复推介以下两本书:    Matt Pietrek        >    Jeffrey Richter        >    两者分别从核心态与用户态出发全面阐述了Windo

FreeXploiT 1673

解读Windows 2000/XP分层驱动模型(http://webcrazy.yeah.net)

 解读Windows 2000/XP分层驱动模型            WebCrazy(http://webcrazy.yeah.net)    可扩展性是Windows NT/2000/XP设计的目标之一,其分层驱动模型是可扩展性的最好体现。实现分层依赖于IO管理器的两个重要的设计:1、Windows中的任何一个驱动程序都被设计成Client/Server模式。对于客户端驱动,通过IoGetD

FreeXploiT 2544
上一篇: 再谈Windows NT/2000环境切换(http://webcrazy.yeah.net)
下一篇: 再谈Windows NT/2000内部数据结构(http://webcrazy.yeah.net)
freexploit
博客等级 码龄22年 315粉丝 778原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值