首页
社区
课程
招聘
[原创]用GDT和IDT查找时钟中断处理函数的地址
发表于: 2009-12-5 18:00 9433

[原创]用GDT和IDT查找时钟中断处理函数的地址

2009-12-5 18:00
9433

嘿嘿 初学 也不知道有错没有 有错望纠正

#include <ntddk.h>
#include <string.h>
typedef struct _LDR_DATA_TABLE_ENTRY
{     
        LIST_ENTRY      InLoadOrderLinks;
        LIST_ENTRY        InMemoryOrderLinks;
        LIST_ENTRY        InInitializationOrderLinks;
        PVOID                DllBase;
        PVOID                EntryPoint;
        ULONG              SizeOfImage;
        UNICODE_STRING FullDllName;
        UNICODE_STRING BaseDllName;
        ULONG               Flags;
        USHORT             LoadCount;
        USHORT             TlsIndex;
        union
        {
                LIST_ENTRY    HashLinks;
                struct
                {
                        PVOID        SectionPointer;
                        ULONG      CheckSum;
                };
        };
        union
        {
                ULONG            TimeDateStamp;
                PVOID           LoadedImports;
        };
        PVOID               EntryPointActivationContext;
        PVOID                PatchInformation;
} LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY;
typedef unsigned char P2C_U8;
typedef unsigned short P2C_U16;
typedef unsigned long P2C_U32;
typedef short WORD;
typedef unsigned int DWORD;
#pragma pack(push,1)
typedef struct P2C_IDT_ENTRY_ {
        P2C_U16 offset_low;
        P2C_U16 selector;
        P2C_U8 reserved;
        P2C_U8 type:4;
        P2C_U8 always0:1;
        P2C_U8 dpl:2;
        P2C_U8 present:1;
        P2C_U16 offset_high;
} P2C_IDTENTRY, *PP2C_IDTENTRY;
#pragma pack(pop)
#pragma pack(push,1)
typedef struct P2C_GDT_ENTRY_ {
        P2C_U16 limit;
        P2C_U8 base1;
        P2C_U8 base2;
        P2C_U8 base3;
        P2C_U16 shuxing;
        P2C_U8 base4;
} P2C_GDTENTRY, *PP2C_GDTENTRY;
#pragma pack(pop)
#define P2C_MAKELONG(low, high) \
        ((P2C_U32)(((P2C_U16)((P2C_U32)(low) & 0xffff)) | ((P2C_U32)((P2C_U16)((P2C_U32)(high) & 0xffff))) << 16))

#define P2C_LOW16_OF_32(data) \
        ((P2C_U16)(((P2C_U32)data) & 0xffff))

#define P2C_HIGH16_OF_32(data) \
        ((P2C_U16)(((P2C_U32)data) >> 16))
#pragma pack(push,1)
typedef struct P2C_IDTR_ {
        P2C_U16 limit;                // 范围
        P2C_U32 base;                // 基地址(就是开始地址)
} P2C_IDTR, *PP2C_IDTR;
#pragma pack(pop)
void *p2cGetIdt()
{
        P2C_IDTR idtr;
        // 一句汇编读取到IDT的位置。
        _asm
        {
                sidt idtr
        }

        return (void *)idtr.base;
}
void *p2cGetGdt()
{
        P2C_IDTR gdtr;
        // 一句汇编读取到IDT的位置。
        _asm
        {
                sgdt gdtr
        }

        return (void *)gdtr.base;
}

NTSTATUS DriverEntry(IN OUT PDRIVER_OBJECT   DriverObject,IN PUNICODE_STRING      RegistryPath)
{
        WORD newcs,oldcs;
        PP2C_IDTENTRY idt_addr = (PP2C_IDTENTRY)p2cGetIdt();
        DWORD        offset = P2C_MAKELONG(idt_addr->offset_low,idt_addr->offset_high);
        newcs=idt_addr->selector;
        newcs=newcs/8;
        PP2C_GDTENTRY gdt_addr=(PP2C_GDTENTRY)p2cGetGdt();
        gdt_addr+=newcs;
        DWORD base=gdt_addr->base1+gdt_addr->base2*0x100+gdt_addr->base3*0x10000+gdt_addr->base4*0x1000000;
        DWORD realadr=base+offset;
        DbgPrint("Int 0 interrupt Function Address=%X",realadr);
        return STATUS_DEVICE_CONFIGURATION_ERROR;
}


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (10)
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
2
剽悍~
震惊~
2009-12-5 21:36
0
雪    币: 284
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
加精~ 强人
2009-12-5 21:42
0
雪    币: 35
活跃值: (11)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
都没人来给小弟看看对错
2009-12-6 16:52
0
雪    币: 2362
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
2009-12-6 17:27
0
雪    币: 35
活跃值: (11)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
都没人看 真可怜
2009-12-9 16:42
0
雪    币: 147
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
newcs=newcs/8;
  PP2C_GDTENTRY gdt_addr=(PP2C_GDTENTRY)p2cGetGdt();
  gdt_addr+=newcs;
这段代码写的不好,不要用数据结构gdt_addr指针做+号之类的指针操作,那样偏移可读性很差。
之所以上面除以8是因为
PP2C_GDTENTRY是8字节的
2009-12-10 13:30
0
雪    币: 35
活跃值: (11)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
上面的哥哥理解错了 哈哈哈 那个是选择子 除以8等于右移3位  剩下的就是索引号了 (我这里默认了描述符在GDT中 嘿嘿)
2009-12-10 20:11
0
雪    币: 147
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
呵呵,我知道,但是你用gtdaddr+索引号,自己想想是不是有点问题。如果gtdaddr是char*的话是会出问题的。但是你这里是个结构,所以gtdaddr+=索引号,隐藏着的是gtdaddr=(char*)gtdaddr+索引号*sizeof(struct xxx)*索引号,这个要是新手看到这个地方会懵
2009-12-23 20:55
0
雪    币: 35
活跃值: (11)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
哥哥 你真厉害 最终你以一个汉字忽悠了我 ,“懵”我都不认识 ,终于认识了 meng 三声的 我小学一年级时候拼音学的可好了 因为我读了两年 查字典还是很牛的 在此我要感谢党和人民对我多年的培养
2009-12-28 19:44
0
雪    币: 212
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
时钟中断不是一个陷阱门?为啥要查gdt? 最近逆过一下时钟中断,他的cs段是在中断里先会判断是否为8然后看是否切换cs段
2019-11-6 07:45
0
游客
登录 | 注册 方可回帖
返回
//