首页
社区
课程
招聘
[求助]Win7下IDT hook求助
发表于: 2011-4-1 16:33 9552

[求助]Win7下IDT hook求助

2011-4-1 16:33
9552
先上代码

#pragma pack(1)
typedef struct
{
  unsigned short LowOffset;
  unsigned short selector;
  unsigned char unused_lo;
  unsigned char segment_type:4;  //0x0E is an interrupt gate
  unsigned char system_segment_flag:1;
  unsigned char DPL:2;  // descriptor privilege level 
  unsigned char P:1; /* present */
  unsigned short HiOffset;
} IDTENTRY;

/* sidt returns idt in this format */
typedef struct
{
  unsigned short IDTLimit;
  unsigned short LowIDTbase;
  unsigned short HiIDTbase;
}IDTINFO;

#pragma pack()

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

typedef VOID (*pfnKeSetAffinityThread)(IN PKTHREAD pKThread, IN KAFFINITY Affinity);

//修改IDT isr
BOOLEAN IDTHook_Modify(ULONG ulIndex, ULONG ulHookFuncAddr)
{
  ULONG ulProcessors = KeNumberProcessors;
  KIRQL irql;
  IDTINFO IdtInfo;
  IDTENTRY *pIdtEntry = NULL;
  pfnKeSetAffinityThread KeSetAffinityThread = NULL;
  UNICODE_STRING ustrKeSetAffinityThread;

  RtlInitUnicodeString(&ustrKeSetAffinityThread, L"KeSetAffinityThread");
  KeSetAffinityThread = (pfnKeSetAffinityThread)MmGetSystemRoutineAddress(&ustrKeSetAffinityThread);
  if (KeSetAffinityThread == NULL)
  {
    return FALSE;
  }

  while (ulProcessors)
  {
    PMDL pMdlForIDT = NULL;
    IDTENTRY *pTempIdt = NULL;

    KeSetAffinityThread(KeGetCurrentThread(), ulProcessors);
    KeRaiseIrql(HIGH_LEVEL, &irql);
    
    //此处修改IDT 项
    __asm sidt IdtInfo
    pIdtEntry = MAKELONG(IdtInfo.LowIDTbase, IdtInfo.HiIDTbase);

    pMdlForIDT = MmCreateMdl(NULL, &pIdtEntry[ulIndex], sizeof(IDTENTRY));

    MmBuildMdlForNonPagedPool(pMdlForIDT);
    pMdlForIDT->MdlFlags = pMdlForIDT->MdlFlags | MDL_MAPPED_TO_SYSTEM_VA;
    pTempIdt = MmGetSystemAddressForMdlSafe(pMdlForIDT, NormalPagePriority);
    if (!MmIsAddressValid(pTempIdt))
    {
      KdPrint(("地址无效\r\n"));
    }

    __asm cli;

    pTempIdt->HiOffset = (USHORT)(ulHookFuncAddr >> 16);
    pTempIdt->LowOffset = (USHORT)ulHookFuncAddr;

    __asm sti;

    MmUnmapLockedPages(pTempIdt, pMdlForIDT);
    IoFreeMdl(pMdlForIDT);

    KeLowerIrql(&irql);
    ulProcessors--;
  }

  return TRUE;
}

pTempIdt->HiOffset = (USHORT)(ulHookFuncAddr >> 16);
此处bsod,求解释. pTempIdt正确

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

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 62
活跃值: (72)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
2
自己顶起来,坐等真相
2011-4-1 17:08
0
雪    币: 222
活跃值: (488)
能力值: ( LV11,RANK:188 )
在线值:
发帖
回帖
粉丝
3
/:^S
selector是在第二个位置,HignOffset是在最后一位的?
我记得IDT的struct Offset是一个和ULONG在同样union的结构啊。

我记错了
不是这个问题:

typedef struct _KIDTENTRY        // 4 elements, 0x8 bytes (sizeof)
          {
/*0x000*/     UINT16       Offset;
/*0x002*/     UINT16       Selector;
/*0x004*/     UINT16       Access;
/*0x006*/     UINT16       ExtendedOffset;
          }KIDTENTRY, *PKIDTENTRY;

唔,其实我一点点不知道驱动。我觉得是
pTempIdt直接equ  &pIdtEntry[ulIndex]就可以了?
而且这个没有mappages,是不能MmUnmapLockedPages的吧 (?)
2011-4-1 20:37
0
雪    币: 14
活跃值: (50)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
pMdlForIDT = MmCreateMdl(NULL, &pIdtEntry[ulIndex], sizeof(IDTENTRY));

    MmBuildMdlForNonPagedPool(pMdlForIDT);
    pMdlForIDT->MdlFlags = pMdlForIDT->MdlFlags | MDL_MAPPED_TO_SYSTEM_VA;
    pTempIdt = MmGetSystemAddressForMdlSafe(pMdlForIDT, NormalPagePriority);

在调用MmGetSystemAddressForMdlSafe前先MmProbeAndLockPages成IoWrite
2011-4-2 04:52
0
雪    币: 68
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
不错 保存收藏~
2011-4-2 11:17
0
雪    币: 62
活跃值: (72)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
6
无果。。。不过还是谢谢LS的和LS的LS的
2011-4-2 11:26
0
雪    币: 62
活跃值: (72)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
7
继续等高手解答
2011-4-2 11:35
0
游客
登录 | 注册 方可回帖
返回
//