请问在98下面如何进入ring0?
希望给出源码!谢谢

解决方案 »

  1.   

    ?Area:  编程语言 Programr.China 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪? From: Huang Fei                                    Read: Yes    Replied: No 
       To: All                                          Mark:                     
     Subj: NT下获得Ring0的技术(一)
    哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪
            NT下如何取到Ring0级执行权(1)        黄飞
            98/8        (注:引用本文请先征得作者同意,谢谢!)
    ===============================================
    这些天几个战友讨论95/98下RING0执行权讨论得热火朝天,
    也提出了很好得实现方法.本文就NT下的这个问题进行探讨.RING0意味这什么?
    熟悉汇编的朋友很清楚,取到RING0级的执行权,整个OS的
    内存将暴露在你的眼皮下,可以直接操纵硬件端口,操纵
    系统寄存器...不得了了... :)
    NT的保护?
    NT是纯的32位OS,MS引以位傲的操作系统,引用了许多VMS.
    UNIX等先进操作系统的概念,把自己的核心数据结构,代码
    利用INTEL CPU的保护机制"完好"的包了起来.至今我仍未
    发现在这方面NT有什么大的漏洞.我下面介绍的技术也有
    一定缺陷.
    概述:
    NT下要使自己的程序在RING0执行,要做一下工作:
    (1).写出自己要在RING0执行的代码
    (2).写一个NT Driver,提供RING0调用Win32接口
    (3).写一个NT Service,提供动态Create.Remove
    NT Driver的功能
    (4).写自己的调用APP,与Service.Ring0 Code连接.
    下面详细介绍各个部分:
    1.NT driver部分
    即使在NT driver中,NT Driver的封装机制也不让你
    透过HAL层去直接操纵硬件,幸运的是,在NT的Kernel
    中隐藏着一组GDT操作接口,但是由于MS的XX...
    所有这些东东都是未公开的. :(
    为此,我做的第一项工作就是挖掘,下面是挖出的金子,
    大家共享吧 . :)
    // Undocumented DDK
    // <begin>
    NTSTATUS KeI386AllocateGdtSelectors( OUT PUSHORT SelArray,
                                    IN int NumOfSelectors );
    NTSTATUS KeI386ReleaseGdtSelectors( OUT PUSHORT SelArray,
                                    IN int NumOfSelectors );
    NTSTATUS KeI386SetGdtSelector( IN ULONG sels, IN PVOID desc );
    // ...
    // <end>
    第3个可是我辛苦了一天的结果,NT不知被我搞死了多少次. :(
    参数意义很好懂,看名字就行了.
    另外,写过NT Driver的朋友一看就应该知道,这些API都是要在
    Driver中才能调用的.我就不罗嗦了. 好了,敲的手都累了,这些天比较忙,只好抽空再写下一部分了.===============================================(1) Over....     Huang Fei
    ...     =========
    -!- xMail 1.00
     ! Origin: Shanghai Shake-River BBS.(021-59572197)  (6:654/1001)
    ?Area:  编程语言 Programr.China 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?  Msg#: 4986                                         Date: 27 Aug 98  16:19:04
      From: Huang Fei                                    Read: Yes    Replied: No 
        To: All                                          Mark:                     
      Subj: NT下获得RING0的技术(二)
    哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪
            NT下如何取到Ring0级执行权(2)        黄飞
            98/8        (注:引用本文请先征得作者同意,谢谢!)
    ===============================================
    CALLGATE技术使用:
    一个不留神,被感冒病毒袭击了,好在用康太克98杀了一通,总算
    暂时喘了口气. :(
    这些天老板看的太紧,抽空凑了几个字,各位不要奸笑. :)
    OK,上次贴过了关键的3个Undocument API,想想在NT Driver
    部分里另外一个要点是CallGate技术应用,下面是CallGate部分
    程序原码:
    注:我就不详细解释了,定义及使用原理见Matt在95奥秘
    一书中的讲解.有兴趣者可以自己看看.
    #pragma pack(1)
    typedef struct
    {
        unsigned short  limit_0_15;
        unsigned short  base_0_15;
        unsigned char   base_16_23;
        unsigned char   accessed    : 1;
        unsigned char   readable    : 1;
        unsigned char   conforming  : 1;
        unsigned char   code_data   : 1;
        unsigned char   app_system  : 1;
        unsigned char   dpl         : 2;
        unsigned char   present     : 1;
        unsigned char   limit_16_19 : 4;
        unsigned char   unused      : 1;
        unsigned char   always_0    : 1;
        unsigned char   seg_16_32   : 1;
        unsigned char   granularity : 1;
        unsigned char   base_24_31;
    } CODE_SEG_DESCRIPTOR;typedef struct
    {
        unsigned short  offset_0_15;
        unsigned short  selector;
        unsigned char   param_count : 4;
        unsigned char   some_bits   : 4;
        unsigned char   type        : 4;
        unsigned char   app_system  : 1;
        unsigned char   dpl         : 2;
        unsigned char   present     : 1;
        unsigned short  offset_16_31;
    } CALLGATE_DESCRIPTOR;
    #pragma pack()
    ...
      ring0_desc.limit_0_15 = 0xFFFF;
      ring0_desc.base_0_15 = 0x0000;
      ring0_desc.base_16_23 = 0x00;
      ring0_desc.accessed = 0;
      ring0_desc.readable = 1;
      ring0_desc.conforming = 0;
      ring0_desc.code_data = 1;
      ring0_desc.app_system = 1;
      ring0_desc.dpl = 0;
      ring0_desc.present = 1;
      ring0_desc.limit_16_19 = 0xF;
      ring0_desc.unused = 0;
      ring0_desc.always_0 = 0;
      ring0_desc.seg_16_32 = 1;
      ring0_desc.granularity = 1;
      ring0_desc.base_24_31 = 0x00;
                    callgate_desc.offset_16_31 = (USHORT) \
                            ((((ULONG)func_address) >> 16) & 0xFFFF);
                    callgate_desc.offset_0_15 = (USHORT)func_address;
      callgate_desc.selector = extension->GdtSelectors[0];
                    callgate_desc.param_count = Count;
      callgate_desc.some_bits = 0;
      callgate_desc.type = 0xC;
                    callgate_desc.app_system = 0;
      callgate_desc.dpl = 3;
      callgate_desc.present = 1;
    ...
    上面建立了一个RING0 CODE描述符和一个对应的CallGate描述符,
    利用他们在加上(1)中介绍的3个Undocumented API,就可以提供一个
    后门用以刺入NT的RING0级. ;)2. NT Service部分
    NT Service是NT提出的一个新概念(虽然95/98里有雏形),通过一个集中化的
    SCM( Service Control Manager )管理各种重要的后台进程,例如RAS,DHCP,
    后台打印,网络消息等等,有关Service的详细信息可以在MSDN中找到.
    简便期间,我这里把NT Service部分和Win32 APP部分合二为一,省去Interface
    部分,直接和RING0 Code连接就行了.当然,实际使用中最好以DLL方式提供Win32
    的API接口.
    下面是原码:// cgateapp.c
    //
    #include <windows.h>#define FILE_DEVICE_CALLGATE 0x00008300
    #define CALLGATE_IOCTL_INDEX 0x830// DDK micros
    #define CTL_CODE( DeviceType, Function, Method, Access ) (                 \
        ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \
    )
    #define METHOD_BUFFERED                 0
    #define FILE_ANY_ACCESS                 0// Driver control codes
    #define IOCTL_CALLGATE_CREATE CTL_CODE( FILE_DEVICE_CALLGATE, \
                                                METHOD_BUFFERED,  \
                                                FILE_ANY_ACCESS )
    ...
    太长了,接下次吧. :)
    ===============================================(2) Over....     Huang Fei
    ...     =========
    -!- xMail 1.00
     ! Origin: Shanghai Shake-River BBS.(021-59572197)  (6:654/1001)?Area:  编程语言 Programr.China 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?  Msg#: 4987                                         Date: 27 Aug 98  16:22:22
      From: Huang Fei                                    Read: Yes    Replied: No 
        To: All                                          Mark:                     
      Subj: NT下获得RING0的技术(三)
    哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪
            NT下如何取到Ring0级执行权(3)        黄飞
            98/8        (注:引用本文请先征得作者同意,谢谢!)
    ===============================================
    续(2)
    ...
    #define IOCTL_CALLGATE_RELEASE CTL_CODE( FILE_DEVICE_CALLGATE, \
                                             CALLGATE_IOCTL_INDEX+1, \
                                             METHOD_BUFFERED,                \
                                             FILE_ANY_ACCESS )#define STR_DEVICENAME TEXT("callgate")
    #define STR_COMPDEVNAME TEXT("\\\\.\\callgate")
    #define STR_DRVEXEPATH  TEXT("c:\\test\\cgatedrv.sys")VOID CallDriver( HANDLE hDevice );/* Declare the function present in RING0.ASM */
    void func(int *cr0, int *cr2, int *cr3);
      

  2.   

    http://member.netease.com/~fsdb/source/nt95_0.txt
      

  3.   

    我找到的1篇文章里面写的
    static void __declspec( naked ) NowInRing0()
    {
    ....
    }void GotoRing0()
    {
    DWORD dwExcept;dwExcept = (DWORD)NowInRing0;_asm {
    mov eax, fs:[0]
    push eax 
    sidt [esp-02h] 
    pop ebx 
    mov idt, ebx
    add ebx, 0x1C
    mov int_idt, ebxmov eax, [ebx] 
    mov [Base], eax
    mov ax, [ebx-4] 
    mov [Entry], axcli
    mov esi, dwExcept
    push esi
    mov [ebx-4], si
    shr esi, 16 
    mov [ebx+2], si 
    pop esi
    stiint 3
    }
    }大概是这样晕,他说大概是这样!我不知道这样是正确的吗?
    是不是一调这个函数就进入RING0了呢?
      

  4.   

    哪里编译出错?
    我见过的读取硬盘序列号的程序就是用的那个。
    http://vip.6to23.com/nowcan1/tech/diskid.htm