看流星社区

 找回密码
 注册账号
查看: 3539|回复: 1

X64 HOOK IDT源码

[复制链接]

该用户从未签到

发表于 2016-7-13 09:44:10 | 显示全部楼层 |阅读模式

kd> dt nt!_KIDTENTRY64 @idtr + @@(sizeof(nt!_KIDTENTRY64))
   +0x000 OffsetLow        : 0x44c0
   +0x002 Selector         : 0x10
   +0x004 IstIndex         : 0y000
   +0x004 Reserved0        : 0y00000 (0)
   +0x004 Type             : 0y01110 (0xe)
   +0x004 Dpl              : 0y00
   +0x004 Present          : 0y1
   +0x006 OffsetMiddle     : 0x40e
   +0x008 OffsetHigh       : 0xfffff800
   +0x00c Reserved1        : 0
   +0x000 Alignment        : 0x40e8e00`001044c0
kd> !idt 1

Dumping IDT:

01:        fffff800040e44c0 nt!KiDebugTrapOrFault

#pragma pack(1)
typedef struct{
        USHORT limit;
        ULONG64 BASE;


}IDT_INFO,*PIDT_INFO;


typedef union _KIDTENTRY64
{
        struct
         {
                USHORT OffsetLow;
                USHORT Selector;
                USHORT IstIndex : 3;
                USHORT Reserved0 : 5;
                USHORT Type : 5;
                USHORT Dpl : 2;
                USHORT Present : 1;
                USHORT OffsetMiddle;
                ULONG OffsetHigh;
                ULONG Reserved1;
                };
        UINT64 Alignment;
        } KIDTENTRY64, *PKIDTENTRY64;

#pragma pack()
typedef NTSTATUS(NTAPI *_KeSetAffinityThread)(
        IN PKTHREAD Thread,
        IN KAFFINITY Affinity
        );
NTSTATUS HOOKIDT(ULONG IDTID, PVOID NewfcuncAddress,__out  PVOID * oldTRAP1){

KIRQL oldIrql;
ULONG lowpart;
KAFFINITY processOrs;
PKTHREAD thread;
LONG i;
IDT_INFO idtinfo;
ULONG_PTR oldTrap = 0;
ULONG_PTR newTrap;
KIDTENTRY64*idt_entry;
UNICODE_STRING ustrKeSetAffinityThread;
_KeSetAffinityThread KeSetAffinityThread;
RtlInitUnicodeString(&ustrKeSetAffinityThread, L"KeSetAffinityThread");
KeSetAffinityThread = (_KeSetAffinityThread)MmGetSystemRoutineAddress(&ustrKeSetAffinityThread);
processOrs = KeQueryActiveProcessors();
thread = KeGetCurrentThread();
newTrap = (ULONG_PTR)NewfcuncAddress;
if (!MmIsAddressValid(oldTRAP1))
{ return 1; }

for (i = 0; i < 32; i++){
KAFFINITY curProc = processOrs &(1 << i);
if (curProc != 0){

KeSetAffinityThread(thread, curProc);
__sidt(&idtinfo);
idt_entry = idtinfo.BASE;

oldTrap = (ULONG_PTR)((((ULONGLONG)idt_entry[IDTID].OffsetHigh) << 32) | (ULONGLONG)(((idt_entry[IDTID].OffsetMiddle << 16) | idt_entry[IDTID].OffsetLow) & 0x00000000ffffffff));
if ( *oldTRAP1 == NULL)
{
*oldTRAP1 = (PVOID)oldTrap;
}

KeRaiseIrql(HIGH_LEVEL, &oldIrql);
lowpart = (ULONG)((ULONGLONG)(newTrap));
idt_entry[IDTID].OffsetLow = (USHORT)lowpart;
idt_entry[IDTID].OffsetMiddle = (USHORT)(lowpart >> 16);
idt_entry[IDTID].OffsetHigh = (ULONG)((ULONGLONG)newTrap >> 32);
KeLowerIrql(oldIrql);
}
}
KeSetAffinityThread(thread, processOrs);
return STATUS_SUCCESS;
}

该用户从未签到

发表于 2016-7-18 17:21:10 | 显示全部楼层

感谢楼主分享,非常感谢~~
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-3-19 11:24

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

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