登录  | 立即注册

游客您好!登录后享受更多精彩

查看: 272|回复: 0

WIN64枚举GDT以及枚举并恢复IDT的代码

[复制链接]

90

主题

9

回帖

407

积分

管理员

积分
407
发表于 2024-12-25 22:18:44 | 显示全部楼层 |阅读模式
GDT:
  1. typedef union _KGDTENTRY64
  2. {
  3.         struct
  4.         {
  5.                 USHORT LimitLow;
  6.                 USHORT BaseLow;                                //base:2B
  7.                 union
  8.                 {
  9.                         struct
  10.                         {
  11.                                 UCHAR BaseMiddle;        //base:1B
  12.                                 UCHAR Flags1;
  13.                                 UCHAR Flags2;
  14.                                 UCHAR BaseHigh;                //BASE:1B
  15.                         } Bytes;
  16.                         struct
  17.                         {
  18.                                 ULONG BaseMiddle:8;
  19.                                 ULONG Type:4;
  20.                                 ULONG S:1;
  21.                                 ULONG Dpl:2;                //DPL
  22.                                 ULONG Present:1;        //P
  23.                                 ULONG LimitHigh:4;
  24.                                 ULONG System:1;
  25.                                 ULONG LongMode:1;
  26.                                 ULONG DefaultBig:1;
  27.                                 ULONG Granularity:1;//G
  28.                                 ULONG BaseHigh:8;
  29.                         } Bits;
  30.                 };
  31.                 ULONG BaseUpper;                        //base:4B
  32.                 ULONG MustBeZero;
  33.         };
  34.         UINT64 Alignment;
  35. } KGDTENTRY64, *PKGDTENTRY64;

  36. ULONG64 MakeULONG64ForGDT(USHORT BaseLow, UCHAR BaseMiddle, UCHAR BaseHigh, ULONG BaseUpper)
  37. {
  38.         ULONG64 ul64=0;
  39.         memcpy(((PUCHAR)(&ul64))+0,&BaseLow,2);
  40.         memcpy(((PUCHAR)(&ul64))+2,&BaseMiddle,1);
  41.         memcpy(((PUCHAR)(&ul64))+3,&BaseHigh,1);
  42.         memcpy(((PUCHAR)(&ul64))+4,&BaseUpper,4);
  43.         return ul64;
  44. }

  45. typedef struct _GDT_INFO
  46. {
  47.         UCHAR        CpuId;
  48.         UCHAR        DPL;
  49.         UCHAR        P;
  50.         UCHAR        G;
  51.         WORD        GdtLimit;
  52.         WORD        ItemLimit;
  53.         ULONG64        GdtBase;
  54.         ULONG64 ItemBase;
  55.         ULONG        Type;
  56.         ULONG        Selector;
  57. } GDT_INFO, *PGDT_INFO;

  58. GDT_INFO GdtInfo[256]= {0}; //“默认”CPU最多有16个核心

  59. void GetGDT(ULONG64 *Base, WORD *Limit)
  60. {
  61.         typedef void (__fastcall *SCFN)(void);
  62.         UCHAR data[10]= {0};
  63.         PVOID p=&data[0];
  64.         SCFN scfn=NULL;
  65.         UCHAR shellcode[15]=
  66.             "\x48\xB8\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7F" //9
  67.             "\x0F\x01\x00"                             //12
  68.             "\xC3";                                    //13
  69.         /*
  70.                 mov rax,xxxxxxxxxxxxxxxxh
  71.                 sgdt [rax]
  72.                 ret
  73.         */
  74.         memcpy(shellcode+2,&p,8);
  75.         scfn=(SCFN)MALLOC_NPP(14);
  76.         memcpy(scfn,shellcode,14);
  77.         scfn();
  78.         memcpy(Base,data+2,8);
  79.         memcpy(Limit,data,2);
  80.         FREE(scfn);
  81. }

  82. ULONG EnumGDT()
  83. {
  84.         ULONG c=0,j=0,k=0,gec=0;
  85.         ULONG CpuNumber=KeNumberProcessors;
  86.         ULONG64 GdtBase=0;
  87.         WORD GdtLimit=0;
  88.         KGDTENTRY64 GdtEntry[16]= {0};
  89.         memset(GdtInfo,0,sizeof(GDT_INFO)*256);
  90.         for(j=0; j<CpuNumber; j++)
  91.         {
  92.                 KeSetSystemAffinityThread(j+1);
  93.                 GetGDT(&GdtBase,&GdtLimit);
  94.                 KeRevertToUserAffinityThread();
  95.                 if(GdtLimit>256){GdtLimit=256;}
  96.                 memcpy(GdtEntry,(PVOID)GdtBase,GdtLimit);
  97.                 gec=(GdtLimit+1)/16;
  98.                 for(k=0; k<gec; k++)
  99.                 {
  100.                         GdtInfo[c].CpuId=(UCHAR)j;
  101.                         GdtInfo[c].GdtBase=GdtBase;
  102.                         GdtInfo[c].GdtLimit=GdtLimit;
  103.                         GdtInfo[c].ItemBase=MakeULONG64ForGDT(GdtEntry[k].BaseLow,(UCHAR)(GdtEntry[k].Bits.BaseMiddle),(UCHAR)(GdtEntry[k].Bits.BaseHigh),GdtEntry[k].BaseUpper);
  104.                         GdtInfo[c].ItemLimit=GdtEntry[k].LimitLow;
  105.                         GdtInfo[c].DPL=(UCHAR)GdtEntry[k].Bits.Dpl;
  106.                         GdtInfo[c].P=(UCHAR)GdtEntry[k].Bits.Present;
  107.                         GdtInfo[c].G=(UCHAR)GdtEntry[k].Bits.Granularity;
  108.                         GdtInfo[c].Type=GdtEntry[k].Bits.Type;
  109.                         GdtInfo[c].Selector=k*16;
  110.                         c++;
  111.                 }
  112.                 if(c>256){break;}
  113.         }
  114.         return c;
  115. }
复制代码
IDT:
  1. /*
  2. nt!_KIDTENTRY64
  3.    +0x000 OffsetLow        : Uint2B
  4.    +0x002 Selector         : Uint2B
  5.    +0x004 IstIndex         : Pos 0, 3 Bits
  6.    +0x004 Reserved0        : Pos 3, 5 Bits
  7.    +0x004 Type             : Pos 8, 5 Bits
  8.    +0x004 Dpl              : Pos 13, 2 Bits
  9.    +0x004 Present          : Pos 15, 1 Bit
  10.    +0x006 OffsetMiddle     : Uint2B
  11.    +0x008 OffsetHigh       : Uint4B
  12.    +0x00c Reserved1        : Uint4B
  13.    +0x000 Alignment        : Uint8B
  14. */
  15. typedef struct _IDTENTRY64
  16. {
  17.         USHORT OffsetLow;
  18.         USHORT Selector;
  19.         USHORT BitInfo;
  20.         USHORT OffsetMiddle;
  21.         ULONG  OffsetHigh;
  22.         ULONG  Reserved1;
  23. } IDTENTRY64, *PIDTENTRY64;


  24. IDTENTRY64 IdtInfo[8192]= {0}; //“默认”CPU最多有32个核心

  25. ULONG EnumIDT()
  26. {
  27.         PUCHAR CurrentIdtBaseAddressOffset,CurrentIdtBaseAddress;
  28.         ULONG c=0,j=0;
  29.         ULONG CpuNumber=KeNumberProcessors;
  30.         memset(IdtInfo,0,sizeof(IDTENTRY64)*256);
  31.         for(j=0; j<CpuNumber; j++)
  32.         {
  33.                 KeSetSystemAffinityThread(j+1);
  34.                 CurrentIdtBaseAddressOffset=(PUCHAR)__readmsr(0xC0000101) + 0x38;
  35.                 KeRevertToUserAffinityThread();
  36.                 CurrentIdtBaseAddress=(PUCHAR)(*(ULONG64*)CurrentIdtBaseAddressOffset);
  37.                 memcpy(&IdtInfo[j*256], CurrentIdtBaseAddress, 256*sizeof(IDTENTRY64));
  38.                 c=c+256;
  39.                 if(c > 256*32){break;}
  40.         }
  41.         return c;
  42. }

  43. void SplitQWORDforIDT(ULONG64 Number, ULONG *high, USHORT *middle, USHORT *low)
  44. {
  45.         memcpy(high,((PUCHAR)&Number)+4,4);
  46.         memcpy(middle,((PUCHAR)&Number)+2,2);
  47.         memcpy(low,((PUCHAR)&Number),2);
  48. }

  49. void ModifyIDT(UCHAR cpu, UCHAR id, ULONG64 Address)
  50. {
  51.         ULONG high_dword=0;
  52.         USHORT mid_word=0,low_word=0;
  53.         PIDTENTRY64 TargetAddress;
  54.         PUCHAR CurrentIdtBaseAddressOffset,CurrentIdtBaseAddress;
  55.         KeSetSystemAffinityThread(cpu+1);
  56.         CurrentIdtBaseAddressOffset=(PUCHAR)__readmsr(0xC0000101) + 0x38;
  57.         KeRevertToUserAffinityThread();
  58.         CurrentIdtBaseAddress=(PUCHAR)(*(ULONG64*)CurrentIdtBaseAddressOffset);
  59.         TargetAddress=(PIDTENTRY64)(CurrentIdtBaseAddress+id*16);
  60.         SplitQWORDforIDT(Address,&high_dword,&mid_word,&low_word);
  61.         _disable();
  62.         TargetAddress->OffsetLow=low_word;
  63.         TargetAddress->OffsetMiddle=mid_word;
  64.         TargetAddress->OffsetHigh=high_dword;
  65.         _enable();
  66. }
复制代码


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|断点社区 |网站地图

GMT+8, 2025-1-18 19:11 , Processed in 0.059720 second(s), 26 queries .

Powered by XiunoBBS

Copyright © 2001-2025, 断点社区.

快速回复 返回顶部 返回列表