首页
社区
课程
招聘
[求助]对rootkit ring3进ring0之调用门学习有个问题
发表于: 2010-7-26 15:35 5354

[求助]对rootkit ring3进ring0之调用门学习有个问题

2010-7-26 15:35
5354
在我的机器上,GDT表中第9个的present等于0,我增加一个调用函数.

为什么用main.c测试时,报内存访问出错.

程序是从combojiang大牛教程对rootkit ring3进ring0之一调用门中改过来.
http://bbs.pediy.com/showthread.php?t=62263

有谁知道错在哪的,请指点一下哪里出错了.谢谢


//------------------------------CallGate.sys-----------------

#include <ntddk.h>

UNICODE_STRING g_usDeviceName;
UNICODE_STRING g_usSymbolicLinkName;

                 
#define MAKELONG(a, b) ((unsigned long) (((unsigned short) (a)) | ((unsigned long) ((unsigned short) (b))) << 16))

#pragma pack(1)

typedef   struct   gdtr   {
                unsigned   short   Limit;
                unsigned   short   BaseLow;
                unsigned   short   BaseHigh;
}Gdtr_t,  *PGdtr_t;

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()

NTSTATUS DispatchControl(PDEVICE_OBJECT DeviceObject, PIRP Irp)
{
   Irp->IoStatus.Status=STATUS_SUCCESS;
   Irp->IoStatus.Information=0;
   IoCompleteRequest(Irp,0);

   return STATUS_SUCCESS;
}
__declspec(naked) Rrin0Fun()
{
        __asm
        {     
          pushad
             pushfd
               cli
        }

        DbgPrint("MyGateFun\n");
       
        __asm
        {
              sti
           popfd
         popad
          retf

        }
}

VOID AddCallGate(ULONG FuncAddr)
{
        Gdtr_t   gdt;

        CALLGATE_DESCRIPTOR *pGDT;
    ULONG Index;
        ULONG Addr;
        __asm   sgdt   gdt;

        pGDT=(CALLGATE_DESCRIPTOR*)MAKELONG(gdt.BaseLow,gdt.BaseHigh);

  
    Index=1;
        while(Index<255)
        {
        if(pGDT[Index].present==0)
                {
                        __asm cli
                        pGDT[Index].offset_0_15=(unsigned   short)FuncAddr;
                        pGDT[Index].selector=8;
                        pGDT[Index].param_count=0;
                        pGDT[Index].some_bits= 0;
                        pGDT[Index].type=0xC;
                        pGDT[Index].app_system=0;
                        pGDT[Index].dpl=3;
            pGDT[Index].present=1;
                        pGDT[Index].offset_16_31=(unsigned   short)(FuncAddr>>16);
                        __asm sti
                        DbgPrint("0x%x\n",Index);
                        break;
                }
                Index++;
        }

        Index=1;
   while(Index<255)
    {
       
                Addr=MAKELONG(pGDT[Index].offset_0_15,pGDT[Index].offset_16_31);
                DbgPrint("%d Func:0x%x,%d\n",Index,Addr,(int)pGDT[Index].present);
                Index++;
   }

}

VOID OnUnLoad(IN PDRIVER_OBJECT pDriverObject)
{
        IoDeleteSymbolicLink(&g_usSymbolicLinkName);
        IoDeleteDevice(pDriverObject->DeviceObject);
        DbgPrint("Called OnUnLoad!\n");
}

NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject,IN PUNICODE_STRING pRegistryPath)
{   
        NTSTATUS status=STATUS_DEVICE_CONFIGURATION_ERROR;
        PDEVICE_OBJECT pDeviceObject;
        ULONG i;
        RtlInitUnicodeString(&g_usDeviceName,L"\\Device\\MYCALLGATE");
        RtlInitUnicodeString(&g_usSymbolicLinkName,L"\\??\\MYCALLGATE");
       
        status=IoCreateDevice(pDriverObject,0,&g_usDeviceName,FILE_DEVICE_UNKNOWN,0,FALSE,&pDeviceObject);
        if(status==STATUS_SUCCESS)
        {
                status=IoCreateSymbolicLink(&g_usSymbolicLinkName,&g_usDeviceName);
                if(STATUS_SUCCESS==status)
                {
                    for(i=0;i<IRP_MJ_MAXIMUM_FUNCTION;i++)
                        {
                                pDriverObject->MajorFunction[i]=DispatchControl;
                        }

                        pDriverObject->DriverUnload=OnUnLoad;

            DbgPrint("Ring0Fun %x\n",Rrin0Fun);

            AddCallGate((ULONG)Rrin0Fun);
                        status=STATUS_SUCCESS;
                }
                else
                {
                        IoDeleteDevice(pDeviceObject);
                }
        }
     
       
        return status;
}

//----------------------main.c------------------------
//测试
#include <windows.h>
#include <stdio.h>

void main()
{
     WORD farcall[3];

     farcall[0] = 0x0;
     farcall[1] = 0x0;
     farcall[2] = 0x0b;   //0x09 |0x03=0x0b

     _asm call fword ptr [farcall]

}

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 998
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
farcall[2]=0x4b;
2010-7-27 00:16
0
雪    币: 364
活跃值: (1741)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
为什么是farcall[2]=0x4b;   选择子CallGate_Sel = 索引值 or 0x03.  

 我索引值Index是9,选择子CallGate_Sel 不是0x09 | 0x03=0x0b  吗?
2010-7-27 09:56
0
雪    币: 998
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
(0x9<<3)|0x03
2010-7-27 10:54
0
雪    币: 364
活跃值: (1741)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
楼上,多谢了.
2010-7-27 14:20
0
雪    币: 1485
活跃值: (1135)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
问题解决了吗?我在win7也出现问题
2018-3-20 12:10
0
游客
登录 | 注册 方可回帖
返回
//