好久不见啊大伙,大一下学期更加的忙碌,每天就是上课,敲代码,敲代码,泡妞,泡不成,换一个接着泡,感觉就像吃泡椒,泡太久了,味道太重,泡不久呢,又没味道。
1.闲话少说,接着今晚的 GDT HOOK
(1).概念请百度。
就说关键部分。
typedef struct CALLGATE_DESCRIPTOR
{
USHORT offset_0_15; (2)
USHORT selector;
UCHAR param_count : 4;
UCHAR some_bits : 4;
UCHAR type : 4;
UCHAR app_system : 1;
UCHAR dpl : 2;
UCHAR present : 1;
USHORT offset_16_31(3);
2.我们来说说这个的结构(2)(3)我就不说了,首先是 DPL(Descriptor Privilege Lebel)权力等级描述,
我们是为了让r3访问这个全局描述符所以我们要把DPL=3.
3.
param_count 表示你建立的new pro 的参数有几个;
4.
selector 选择段,我们要写0x8(windows)下都是;
5.
type 类型:调用门的类型是0xc;
6.先贴代码在解释~ ~.
(1.)要先得到人家的地址,
ULONG Gdtbase()
{
char gdt[6] ;
ULONG base;
__asm sgdt gdt;
base=*(ULONG *)(&gdt[2]);
DbgPrint("base 0x%x\n",base);
return base;
}
(2.)接着要初始化人家:
CALLGATE_DESCRIPTOR cg;
cg.selector=0x8;
cg.param_count=0;
cg.type=0x3;
cg.dpl=0x3;
cg.offset_0_15=0xffff&Address;
cg.offset_16_31=Address>>16;
return cg;
(3.)接着要hook 人家(好害羞)
Void Hook(CALLGATE_DESCRIPTOR cg)
{
PSEG_DESCRIPTOR gdt;
PSEG_DESCRIPTOR gdtEntry;
PCALLGATE_DESCRIPTOR old;
CALLGATE_DESCRIPTOR oldcg;
int i=0;
gdt=(PSEG_DESCRIPTOR)Gdtbase();
old=(PCALLGATE_DESCRIPTOR)&(gdt[60]);
DbgPrint("0x%x\n",sizeof(CALLGATE_DESCRIPTOR));
for (i=0;i<=0x1F;i++)
{
DbgPrint("0x%x\n",&(gdt[i]));
}
oldcg=*old;
gdtEntry=(PSEG_DESCRIPTOR)&cg;
gdt[60]=*gdtEntry;
}
7.下面解释hook idt
typedef struct SEG_DESCRIPTOR{
UINT32 base:32;
UINT32 seg_limit:20;
UINT32 g:1;
UINT32 d_b:1;
UINT32 unused:1;
UINT32 avl:1;
UINT32 p:1;
UINT32 dpl:2;
UINT32 s:1;
UINT32 type:4;
}SEG_DESCRIPTOR,*PSEG_DESCRIPTOR;
首先人家这个
结构占了8个空间,so 数字下表也就是往前面+8x,系统一边段选择被试用0x1-0x1f;你想XX也可以每人拦你,你想插入新的每人管你,甚至我们可以改变他们的权利等级.
8.好像扯来扯去,都没说概念,测试一下
9.这个很重要,cpu KeSetSystemAffinityThread 设置一下线程只绑定第x个cpu那。
Super-Rootkis 121157016 欢迎你的到来
好多牛都在你们,最近群的活跃度不太好,进来后请看群规定.
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课