rootkit hook之[四]-- IDT Hook

X64 HOOK IDT kd> dt nt!_KIDTENTRY64 @idtr + @@(sizeof(nt!_KIDTENTRY64))    +0x000 OffsetLow        : 0x44c0    +0x002 Selector         : 0x10    +0x004 IstIndex         : 0y000    +0x004 Reserved0        : 0y0 阅读详情
 作 者: combojiang
时 间: 2008-02-19,17:05
链 接: http://bbs.pediy.com/showthread.php?t=59867

今天我们一起来学习下Rootkit里面的IDT hook. 由于涉及到一些基本概念,在这里也顺便提一下。呵呵,帖子比较长,慢慢看。闲话少说,直奔主题。

我们首先来了解下什么是IDT?
IDT = Interrupt Descriptor Table 中断描述表

IDT是一个有256个入口的线形表,每个IDT的入口是个8字节的描述符,所以整个IDT表的大小为256*8=2048 bytes,每个中断向量关联了一个中断处理过程。所谓的中断向量就是把每个中断或者异常用一个0-255的数字识别。Intel称这个数字为向量(vector).如图所示。

对于中断描述表,操作系统使用IDTR寄存器来记录idt位置和大小。
IDTR寄存器是48位寄存器,用于保存idt信息。其中低16位代表IDT的大小,大小为7FFH,高32位代表IDT的基地址。在我的机器上,基地址是8003F400H. 我们可以利用指令sigt读出IDTR寄存器中的信息,从而找到IDT在内存中的位置。
名称:  1.JPG
查看次数: 840
文件大小:  17.1 KB
IDT有三种不同的描述符或者说是入口,分别是:
1。任务门描述符
2。中断门描述符
3。陷阱门描述符

也就是说,在保护模式下,80386只有通过中断门、陷阱门或任务门才能转移到对应的中断或异常处理程序。


Intel参考手册上指出“同步中断”(在一个指令执行完成后,由CPU控制单元产生的)作为“异常”。
异步中断(可能会在任意时刻由其他硬件产生的)才称为“中断”。中断被外部的I/O设备产生。
但是异常是由编程错误或者是由反常情况(必须由内核来处理)触发的。在该文档中,
术语“中断信号”既指异常又指中断。

中断分为两种类型:可屏蔽中断--它在短时间片段里可被忽略;不可屏蔽中断--它必须被立即处理。例如:硬件失败为不可屏蔽中断,IRQS(中断请求)失败为可屏蔽中断。

异常被分为不同的两类:处理器产生的异常(Faults, Traps, Aborts)和编程安排的异常(用汇编指令int or int3 触发)。后一种就是我们经常说到的软中断。

我们先看看这三种描述符:
名称:  2.JPG
查看次数: 838
文件大小:  26.7 KB

其中:后两种描述符,非常的相似,只有1个bit位的差别。在处理上,采用相同的处理方式。如图所示,在这后两类的描述符里面记录了一个中断服务程序(ISR )的地址offset. 在IDT的256个向量中,除3个任务门入口外,其他都是这两种门的入口。并且所有的trap/interrupt gate的入口,他们的segment selector都是一样的,即:08h. 我们察看GDT中Selector = 8的描述符,描述的是00000000h ~ 0ffffffffh的4G地址空间。 因此,在描述符中的中断服务程序(ISR )的地址offset就代表了函数的入口地址。windows在处理的时候,按照下图方式,来处理这两类的描述符入口。即:根据segment selector在GDT中找出段基地址等信息,然后跟描述符中的中断服务程序(ISR )的地址offset相加得到代码段中的函数入口地址。然后调用该函数。
这个过程,我写得比较直接,在操作系统执行这过程时,还有很多的出错判断和异常保护,这里我们略过。
名称:  3.JPG
查看次数: 831
文件大小:  19.7 KB
接下来,我们看看任务门描述符的情况。
名称:  4.JPG
查看次数: 827
文件大小:  16.1 KB
首先,根据IDT中任务门描述符的TSS Segment  Selector ,我们在GDT中找出这个选择子。在这个选择子中,对应一个tss描述符,即:任务状态段描述符。这个描述符大小为068h, 即104字节。
下面是这个任务状态段描述符的格式。
名称:  5.JPG
查看次数: 830
文件大小:  14.8 KB
我们看到在这个描述符中记录了任务状态段的位置和大小。
我们根据任务状态段描述符中的base Address, 找到TSS的内存位置。然后我们就可以进行任务切换。所谓任务切换是指,挂起当前正在执行的任务,恢复或启动另一任务的执行。在任务切换过程中,首先,处理器中各寄存器的当前值被自动保存到TR所指定的TSS中;然后,下一任务的TSS的选择子被装入TR;最后,从TR所指定的TSS中取出各寄存器的值送到处理器的各寄存器中。由此可见,通过在TSS中保存任务现场各寄存器状态的完整映象,实现任务的切换。 TR寄存器可见部分保存了tss selector, 不可见部分,保存了任务状态段的位置和大小.如下图所示。
任务状态段TSS的基本格式如下图所示。 

此图已经缩小,点击察看原图。
从图中可见,TSS的基本格式由104字节组成。这104字节的基本格式是不可改变的,但在此之外系统软件还可定义若干附加信息。
名称:  6.JPG
查看次数: 834
文件大小:  17.7 KB

理论的部分,我们简单介绍这么多。接下来,我们透过几个例子来说明下,IDT HOOK。

一。透过一个简单的代码,看看256个中断向量对应的ISR., 其中任务门的ISR没有,由于整个IDT中只有3个任务门,我们忽略这部分。代码如下:

#include "ntddk.h"
#include <stdio.h>
#define MAKELONG(a, b) ((unsigned long) (((unsigned short) (a)) | ((unsigned long) ((unsigned short) (b))) << 16)) 

#define MAX_IDT_ENTRIES 0xFF
#pragma pack(1)

// entry in the IDT, this is sometimes called
// an "interrupt gate"
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()

VOID OnUnload( IN PDRIVER_OBJECT DriverObject )
{  
  DbgPrint("ROOTKIT: OnUnload called/n");
}

NTSTATUS DriverEntry( IN PDRIVER_OBJECT theDriverObject, IN PUNICODE_STRING theRegistryPath )
{
  IDTINFO    idt_info;    
  IDTENTRY*  idt_entries;     
  unsigned long  count;

  theDriverObject->DriverUnload  = OnUnload; 

  // load idt_info
  __asm  sidt  idt_info
  
  idt_entries = (IDTENTRY*) MAKELONG(idt_info.LowIDTbase,idt_info.HiIDTbase);

  for(count=0;count < MAX_IDT_ENTRIES;count++)
  {
    char _t[255];
    IDTENTRY *i = &idt_entries[count];
    unsigned long addr = 0;
    addr = MAKELONG(i->LowOffset, i->HiOffset);
    
    _snprintf(_t, 253, "Interrupt %d: ISR 0x%08X", count, addr);
    DbgPrint(_t);
  }

  return STATUS_SUCCESS;
}

我们使用DebugView工具软件,就可以看到打印出来的信息。

二、直接替换idt中某个中断向量的ISR.
 这里采用的办法是,首先保存出中断向量0x30的ISR, 然后直接修改中断向量0x30的ISR为我们自定义的函数 my_interrupt_hook,每当0x30号中断产生,就会调用我们自定义的函数。
由于我们自定义的函数里面执行完我们的功能后再跳转到原isr函数处执行。因此这种hook用户感觉不到,不影响原有功能。在OnUnload时,恢复原有的中断向量ISR.

#include "ntddk.h"
#include <stdio.h>

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

#define MAX_IDT_ENTRIES 0xFF
#define NT_INT_TIMER        0x30

unsigned long g_i_count = 0;

///////////////////////////////////////////////////
// IDT structures
///////////////////////////////////////////////////
#pragma pack(1)

// entry in the IDT, this is sometimes called
// an "interrupt gate"
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()

unsigned long old_ISR_pointer;  // better save the old one!!


VOID OnUnload( IN PDRIVER_OBJECT DriverObject )
{  
  IDTINFO    idt_info;    // this structure is obtained by calling STORE IDT (sidt)
  IDTENTRY*  idt_entries;  // and then this pointer is obtained from idt_info
  char _t[255];

  // load idt_info
  __asm  sidt  idt_info  
  idt_entries = (IDTENTRY*) MAKELONG(idt_info.LowIDTbase,idt_info.HiIDTbase);

  DbgPrint("ROOTKIT: OnUnload called/n");

  _snprintf(_t, 253, "called %d times", g_i_count);
  DbgPrint(_t);
  
  DbgPrint("UnHooking Interrupt...");

  // restore the original interrupt handler
  __asm cli
  idt_entries[NT_INT_TIMER].LowOffset = (unsigned short) old_ISR_pointer;
  idt_entries[NT_INT_TIMER].HiOffset = (unsigned short)((unsigned long)old_ISR_pointer >> 16);
  __asm sti

  DbgPrint("UnHooking Interrupt complete.");
}

// using stdcall means that this function fixes the stack before returning (opposite of cdecl)
void __stdcall count_syscall( unsigned long system_call_number )
{
  g_i_count++;
}

// naked functions have no prolog/epilog code - they are functionally like the 
// target of a goto statement
__declspec(naked) my_interrupt_hook()
{
  __asm
  {
    push  eax
    call  count_syscall
    jmp    old_ISR_pointer
  }
}

NTSTATUS DriverEntry( IN PDRIVER_OBJECT theDriverObject, IN PUNICODE_STRING theRegistryPath )
{
  IDTINFO    idt_info;    // this structure is obtained by calling STORE IDT (sidt)
  IDTENTRY*  idt_entries;  // and then this pointer is obtained from idt_info
  IDTENTRY*  i;
  unsigned long   addr;
  unsigned long  count;
  char _t[255];
  
  theDriverObject->DriverUnload  = OnUnload; 

  // load idt_info
  __asm  sidt  idt_info
  
  idt_entries = (IDTENTRY*) MAKELONG(idt_info.LowIDTbase,idt_info.HiIDTbase);

  for(count=0;count < MAX_IDT_ENTRIES;count++)
  {
    i = &idt_entries[count];
    addr = MAKELONG(i->LowOffset, i->HiOffset);
    
    _snprintf(_t, 253, "Interrupt %d: ISR 0x%08X", count, addr);
    DbgPrint(_t);
  }

  DbgPrint("Hooking Interrupt...");
  // lets hook an interrupt
  // exercise - choose your own interrupt
  old_ISR_pointer = MAKELONG(idt_entries[NT_INT_TIMER].LowOffset,idt_entries[NT_INT_TIMER].HiOffset);
  
// debug, use this if you want some additional info on what is going on
#if 0
  _snprintf(_t, 253, "old address for ISR is 0x%08x", old_ISR_pointer);
  DbgPrint(_t);
  _snprintf(_t, 253, "address of my function is 0x%08x", my_interrupt_hook);
  DbgPrint(_t);
#endif
  
  // remember we disable interrupts while we patch the table
  __asm cli
  idt_entries[NT_INT_TIMER].LowOffset = (unsigned short)my_interrupt_hook;
  idt_entries[NT_INT_TIMER].HiOffset = (unsigned short)((unsigned long)my_interrupt_hook >> 16);
  __asm sti

// debug - use this if you want to check what is now placed in the interrupt vector
#if 0
  i = &idt_entries[NT_INT_TIMER];
  addr = MAKELONG(i->LowOffset, i->HiOffset);
  _snprintf(_t, 253, "Interrupt ISR 0x%08X", addr);
  DbgPrint(_t);  
#endif

  DbgPrint("Hooking Interrupt complete");

  return STATUS_SUCCESS;
}

三、这个示例中hook 了整个idt表,采用的方式是:
1)首先保留出每个中断向量的ISR. 为每一个中断向量的调用设置了一个计数器,并将计数器清零。
2)为整个IDT建立一个detour内存表,内存表中的每一项对应于每个中断向量。每一项的空间中保存了一个函数,在这个函数中,会调用一个公共的计数函数,用于统计每个中断ISR调用的次数,函数的最后会调用该中断向量原ISR.
3)修改IDT表中的每一个中断向量ISR为detour内存表中相应项的函数。
4)OnUnload中打印出每个中断向量ISR调用的次数,并恢复原ISR.


#include "ntddk.h"
#include <stdio.h>

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

// set this to the max int you want to hook
#define MAX_IDT_ENTRIES 0xFF

// the starting interrupt for patching
// to 'skip' some troublesome interrupts
// at the beginning of the table (TODO, find out why)
#define START_IDT_OFFSET 0x00

unsigned long g_i_count[MAX_IDT_ENTRIES];
unsigned long old_ISR_pointers[MAX_IDT_ENTRIES];  // better save the old one!!

#ifdef _DEBUG
// debuggering version nops out our 'hook'
// this works w/ no crashes
char jump_template[] = { 
  0x90,                    //nop, debug
  0x60,                    //pushad
  0x9C,                    //pushfd
  0xB8, 0xAA, 0x00, 0x00, 0x00,            //mov eax, AAh
  0x90,                    //push eax
  0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,          //call 08:44332211h
  0x90,                    //pop eax
  0x9D,                    //popfd
  0x61,                    //popad
  0xEA, 0x11, 0x22, 0x33, 0x44, 0x08, 0x00          //jmp 08:44332211h
};
#else
char jump_template[] = { 
  0x90,                    //nop, debug
  0x60,                    //pushad
  0x9C,                    //pushfd
  0xB8, 0xAA, 0x00, 0x00, 0x00,            //mov eax, AAh
  0x50,                    //push eax
  0x9A, 0x11, 0x22, 0x33, 0x44, 0x08, 0x00,        //call 08:44332211h
  0x58,                    //pop eax
  0x9D,                    //popfd
  0x61,                    //popad
  0xEA, 0x11, 0x22, 0x33, 0x44, 0x08, 0x00          //jmp 08:44332211h
};
#endif

char * idt_detour_tablebase;
  

///////////////////////////////////////////////////
// IDT structures
///////////////////////////////////////////////////
#pragma pack(1)

// entry in the IDT, this is sometimes called
// an "interrupt gate"
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()



VOID OnUnload( IN PDRIVER_OBJECT DriverObject )
{  
  int i;
  IDTINFO    idt_info;    // this structure is obtained by calling STORE IDT (sidt)
  IDTENTRY*  idt_entries;  // and then this pointer is obtained from idt_info
  char _t[255];

  // load idt_info
  __asm  sidt  idt_info  
  idt_entries = (IDTENTRY*) MAKELONG(idt_info.LowIDTbase,idt_info.HiIDTbase);

  DbgPrint("ROOTKIT: OnUnload called/n");

  for(i=START_IDT_OFFSET;i<MAX_IDT_ENTRIES;i++)
  {
    _snprintf(_t, 253, "interrupt %d called %d times", i, g_i_count[i]);
    DbgPrint(_t);
  }

  DbgPrint("UnHooking Interrupt...");

  for(i=START_IDT_OFFSET;i<MAX_IDT_ENTRIES;i++)
  {
    // restore the original interrupt handler
    __asm cli
    idt_entries[i].LowOffset = (unsigned short) old_ISR_pointers[i];
    idt_entries[i].HiOffset = (unsigned short)((unsigned long)old_ISR_pointers[i] >> 16);
    __asm sti
  }

  
  DbgPrint("UnHooking Interrupt complete.");
}


// using stdcall means that this function fixes the stack before returning (opposite of cdecl)
// interrupt number passed in EAX
void __stdcall count_interrupts(unsigned long inumber)
{
  //todo, may have collisions here?
  unsigned long *aCountP; 
  unsigned long aNumber;

  // due to far call, we need to correct the base pointer
  // the far call pushes a double dword as the return address
  // and I don't know how to make the compiler understand this
  // is a __far __stdcall (or whatever it's called)
  // anyway:
  //
  // [ebp+0Ch] == arg1
  //
  __asm mov eax, [ebp+0Ch]
  __asm mov aNumber, eax
  
  //__asm int 3

  aNumber = aNumber & 0x000000FF;
  aCountP = &g_i_count[aNumber]; 
  InterlockedIncrement(aCountP);
}

NTSTATUS DriverEntry( IN PDRIVER_OBJECT theDriverObject, IN PUNICODE_STRING theRegistryPath )
{
  IDTINFO    idt_info;    // this structure is obtained by calling STORE IDT (sidt)
  IDTENTRY*  idt_entries;  // and then this pointer is obtained from idt_info
  IDTENTRY*  i;
  unsigned long   addr;
  unsigned long  count;
  char _t[255];
  
  theDriverObject->DriverUnload  = OnUnload; 

  for(count=START_IDT_OFFSET;count<MAX_IDT_ENTRIES;count++)
  {
    g_i_count[count]=0;
  }

  // load idt_info
  __asm  sidt  idt_info
  idt_entries = (IDTENTRY*) MAKELONG(idt_info.LowIDTbase,idt_info.HiIDTbase);

  ////////////////////////////////////////////
  // save old idt pointers
  ////////////////////////////////////////////
  for(count=START_IDT_OFFSET;count < MAX_IDT_ENTRIES;count++)
  {
    i = &idt_entries[count];
    addr = MAKELONG(i->LowOffset, i->HiOffset);
    
    _snprintf(_t, 253, "Interrupt %d: ISR 0x%08X", count, addr);
    DbgPrint(_t);
  
    old_ISR_pointers[count] = MAKELONG(idt_entries[count].LowOffset,idt_entries[count].HiOffset);
  }

  
  ///////////////////////////////////////////
  // setup the detour table
  ///////////////////////////////////////////
  idt_detour_tablebase = ExAllocatePool(NonPagedPool, sizeof(jump_template)*256);

  for(count=START_IDT_OFFSET;count<MAX_IDT_ENTRIES;count++)
  {
    int offset = sizeof(jump_template)*count;  
    char *entry_ptr = idt_detour_tablebase + offset;

    // entry_ptr points to the start of our jump code in the detour_table

    // copy the starter code into the template location
    memcpy(entry_ptr, jump_template, sizeof(jump_template));

#ifndef _DEBUG

    // stamp the interrupt number
    entry_ptr[4] = (char)count;

    // stamp the far call to the hook routine
    *( (unsigned long *)(&entry_ptr[10]) ) = (unsigned long)count_interrupts;
#endif

    // stamp the far jump to the original ISR
    *( (unsigned long *)(&entry_ptr[20]) ) = old_ISR_pointers[count];

    // finally, make the interrupt point to our template code
    __asm cli
    idt_entries[count].LowOffset = (unsigned short)entry_ptr;
    idt_entries[count].HiOffset = (unsigned short)((unsigned long)entry_ptr >> 16);
    __asm sti
  }

  DbgPrint("Hooking Interrupt complete");

  return STATUS_SUCCESS;
}

后面再附上一个Greg Hoglund的例子,请大家欣赏。
上传的附件
文件类型: rarbhwin_keysniff.rar (2008-03-30 13:04, 2.9 KB, 177 次下载)
ZYNQ基础系列(七) LWIP数据通路 -- PL数据->PS->PC机(TCP) LWIP数据通路 实验准备: 基础概念 以太网MAC是一个基础模块,它使得我们可以实现一个TCP/IP协议栈,协议使得应用可以基于网络来通信。如果想要解析一个TCP/IP协议栈,需要了解以下层次: • 第一层——物理层:(描述物理连接)主要由外部物理层芯片实现 • 第二层——数据链路层:(描述物理层上数据传输的途径)可以由PS的MAC实现 • 第三层——网络层:(描述不... 阅读详情

相关推荐

IDT Hook深度解析:从硬件机制到内核Rootkit攻防实战

中断描述符表(IDT)是x86架构管理中断处理的核心数据结构,其条目直接决定CPU响应硬件中断时的控制流跳转。通过修改IDT条目中的处理函数地址,可在硬件与操作系统之间插入拦截逻辑,实现对中断路径的深度控制。这种内核态Hook技术既是理解操作系统底层运行机制的关键切入点,也是内核安全攻防领域的重要基础。在系统安全研究、Rootkit检测与防御、内核完整性监控等场景中,掌握IDT Hook的原理与实现路径,有助于构建更底层的安全防护能力。

weixin_32244597的博客 191

【ZYNQ】裸机 PS + PL 双网口实现之 LWIP 库文件修改

Zynq 裸机 PS + PL 双网口实现之 lwip 库文件修改

嵌入式小菜鸟一枚~ 7559

Windows内核安全工具KswordARK实战:从编译部署到Rootkit检测

系统内核是操作系统的核心,负责管理进程、内存、驱动等底层资源。其安全机制通过内核对象、系统调用表等数据结构实现,确保系统稳定运行。然而,Rootkit等高级威胁通过挂钩系统调用、篡改内核数据结构实现深度隐藏,传统安全工具难以检测。反内核级恶意软件工具(ARK)的价值在于以内核态权限直接遍历进程活动链表、检测SSDT钩子,从而发现隐藏进程和驱动模块。这类工具在恶意软件分析、系统安全审计等场景中至关重要。KswordARK作为开源ARK工具,其编译部署涉及Windows Driver Kit和驱动签名机制,实战

weixin_34246551的博客 365

两种HOOK IDT方法

IDT :就是系统中断表,是存放Windows的中断和异常的处理函数的表 IDT的数据结构:   typedef struct _IDTENTRY { unsigned short LowOffset; //处理函数的低2字节 unsigned short selector; //处理函数所在的段选择子 unsigned char retent...

2028

Rootkit原理——ROOTKIT ON LINUX X86 V2.6

Linux2.6内核的LKM Rootkit原理LKM Rootkit之HOOK系统调用表一、修改系统调用表的地址二、path系统调用过程的二进制代码三、滥用DR寄存器非LKM RootkitRootkit的常见功能Rootkit的主要技术参考文献 LKM Rootkit之HOOK系统调用表 一、修改系统调用表的地址 Linux机制 HOOK系统调用表方式 sys_call_table[]导出 sys_call_table[__NR_open] = (void *) my_func_ptr;

摔不死的笨鸟的博客 460

ZYNQ PL与PS通信实战:AXI DMA+LWIP TCP数据链路搭建指南

在FPGA嵌入式系统开发中,PL与PS之间的高效数据交互一直是工程实现的关键难点。ZYNQ作为ARM与FPGA融合的典型平台,通过AXI总线协议打通了硬件逻辑与处理器系统之间的数据通道。其中AXI DMA技术能够在无需CPU逐字节干预的前提下,完成PL侧到DDR内存的大批量数据搬运,配合轻量级TCP/IP协议栈lwIP,即可构建一条从硬件采集到网络传输的完整链路。这种方案兼顾了传输效率与可靠性,特别适用于图像采集、高速数据记录、软件无线电等对数据吞吐有较高要求的场景。本文围绕实际项目经验,详细梳理了从AXI

weixin_29170327的博客 224

【原创】rootkit hook之[四]-- IDT Hook

标 题: 【原创】rootkit hook之[四]-- IDT Hook 作 者: combojiang 时 间: 2008-02-19,17:05:37 链 接: http://bbs.pediy.com/showthread.php?t=59867 今天我们一起来学习下Rootkit里面的IDT hook. 由于涉及到一些基本概念,在这里也顺便提一下。呵呵,帖子比较长,慢慢看。闲话

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 1020

WSL2+Docker+Ollama:解锁Windows本地GPU加速运行DeepSeek-R1模型

本文详细介绍了在Windows系统上,通过WSL2、Docker和Ollama的组合方案,实现本地GPU加速运行DeepSeek-R1模型的全过程。该方案解决了Windows环境下Ollama默认无法调用NVIDIA显卡的痛点,通过配置Docker的GPU支持,强制将计算任务分配给GPU,从而显著提升文本生成速度与效率,为开发者提供了一个便捷的本地AI测试环境。

weixin_28452161的博客 356

RootKit学习之 IDT Hook

0x00 前言 IDT(Interrupt Descriptor Table)中断描述符表,中断就是停下现在的活动,去完成新的任务。一个中断可以起源于软件或硬件。比如,出现页错误,调用IDT中的0x0E。或用户进程请求系统服务(SSDT)时,调用IDT中的0x2E。而系统服务的调用是经常的,这个中断就能触发。我们现在就想办法,先在系统中找到IDT,然后确定0x2E在IDT中的地址,最后...

afsafs1231的博客 241

高速SerDes均衡技术解析

均衡技术是高速SerDes链路中补偿信道损耗和失真的核心技术,通过FFE、CTLE和DFE三种主要方法对抗码间干扰(ISI)。FFE在发射端预补偿前光标干扰,CTLE通过提升高频增益补偿信道损耗,DFE则精准消除后光标干扰。三种技术各具优势:FFE实现简单且不放大噪声,CTLE功耗低易于集成,DFE能自适应调整且保持信噪比。这些技术协同工作可有效提升系统传输速率和可靠性。

一只豌豆象的博客 1947

C#实现跨域访问共享文件夹的账号密码验证方案

本文详细介绍了在C#中实现跨域访问共享文件夹的账号密码验证方案。通过调用Windows API LogonUser函数,结合LOGON32_LOGON_NEW_CREDENTIALS登录类型,可安全模拟指定用户身份,有效解决工作组与域环境间的文件共享访问难题。文章提供了完整的工具类封装、多种实战场景示例及详细的错误排查指南。

pea55的博客 538

[内核安全4]内核态Rootkit之IDT Hook

IDT Hook是通过挂钩中断描述符表的一种Ring0挂钩形式。在保护模式下和实模式下的中断机制是完全不同的。实模式下有256个中断例程以供调用,可以通过对应的中断号来调用。在保护模式下中断机制变得相对复杂了,但更好用。保护模式下中断由对应的门描述符来描述,其中有三种格式,分别为: 任务门描述符 中断门描述符 陷阱门描述符 任务门描述符一般用于不同特权级的非一致代码段间跳转。和IDT HOOK没有什么关系,因为IDT HOOK是通过挂钩中断门 比如希望低特权级代码段跳转至高特权级的代码段运行就一般需

輚至消亡 1093

RK3568平台 麦克风PDM接口录音_rk pdm配置

在RK平台,Android的Audio HAL层中一般会都会有导出录音播放数据的功能。如播放的,是会直接送到声卡中的,对于播放出现问题的情况,可以从分析导出的音频数据是否正常,可以基本知道,是在应用、解码出现的问题,还是送到声卡过程中出现问题。当点开app进行录音的时候会调用到static int start_input_stream(struct stream_in *in)。音频在PDM接口输入,不经过编解码芯片直接到RK主芯片,RK主芯片自带PCM编解码功能。以下软件能播放保存下来的pdm文件。

2401_83817122的博客 2343

内核态Rootkit攻防:IDT Hook原理与实现详解

中断描述符表(IDT)是x86架构中CPU响应中断和异常的核心数据结构,其安全直接关系到操作系统内核的完整性。IDT Hook通过替换表项中的处理函数地址,使攻击者代码能够拦截系统中断流程,是内核Rootkit的经典隐蔽技术。理解IDT的硬件级结构、写保护绕过机制以及多核同步问题,不仅有助于掌握内核安全攻防的核心原理,也能为设计有效的检测方案提供基础。在虚拟机隔离环境中进行内核模块开发实验,结合SIDT指令读取IDTR、CR0寄存器操作和IPI同步等技术,可以深入理解中断机制与Rootkit检测思路。

weixin_32325225的博客 243

【Pytorch】DCGAN实战(三):二次元动漫头像生成

文章目录1.实现效果2.环境配置2.1Python2.2Pytorch、CUDA2.3Python IDE3.具体实现3.1数据预处理(data.py)(1)导入包(2)定义数据类3.2模型Generator,Discriminator,权重初始化(model.py)(1)导入包(2)Generator(3)Discriminator(4)权重初始化3.3网络训练(net.py)(1)导入包(2)创建类3.4 主函数(main.py)(1)导入文件(2)定义超参数(3)实例化(4)进行训练4.训练过程4.1

qq_44031210的博客 4916

使用Matlab进行IEEE 33节点潮流计算的NR法实现详解及应用实例

IEEE 33节点系统是一个标准的配电系统模型,广泛用于学术研究和工程应用。该系统由33个节点和37条线路组成,结构复杂,具有代表性。其潮流计算结果可用于验证各种潮流计算方法的准确性和效率。NR法是一种基于迭代求解的潮流计算方法,通过不断迭代求解非线性方程组,直到达到预定的收敛条件。NR法具有收敛速度快、计算精度高的优点,适用于大规模复杂电力系统的潮流计算。

m0_57781768的博客 2070

RootKit hook 之[一] object hook

作 者: combojiang时 间: 2008-01-08,11:43链 接: http://bbs.pediy.com/showthread.php?t=57900今天是2008年1月8号,一个非常响亮的日子,今天我们将开始rootkit实战之旅。第一篇是object hook.这篇文章来源于前段时间我逆向的机器狗代码,前段时间我只是贴出了应用的部分,对于内核的部分,我没有贴出来,主要是害怕他

912

【自动驾驶】汽车智能驾驶计算芯片

本文介绍汽车智能驾驶计算芯片的软硬件要求、 可靠性和安全性要求、 性能要求,和相应的试验方法。除了用于汽车智能驾驶, 其他领域的计算芯片可参照执行。

Mr.Cssust的博客 2631

在Linux上Hook系统函数execve获取执行参数-Rootkit

在Linux上Hook系统函数execve获取执行参数 根据linux系统在32位平台还是64位平台分别进行了hook代码的编写和测试,该功能是常见的rootkit技术 针对32位平台的Hook代码如下,已经在ubuntu12.04上测试过: /* * This kernel module locates the sys_call_table by scanning * the syste...

daizhongyin的专栏 3114

用miniconda建立PyTorch、Keras、TensorFlow三个环境

如果还没有安装Miniconda,请从[Miniconda官网](https://docs.conda.io/en/latest/miniconda.html)下载合适的版本并进行安装。如果遇到问题,可以通过编辑`~/.condarc`文件来临时禁用某个源,或者通过`conda config --remove channels`命令来移除配置的镜像源。要切换到不同的环境,先使用`conda deactivate`命令退出当前环境,再用`conda activate 环境名称`命令激活另一个环境。

数字人生 2464

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

RootKit hook之[二] SSDT hook

标 题: 【原创】rootkit hook之[四]-- IDT Hook 作 者: combojiang 时 间: 2008-02-19,17:05:37 链 接: http://bbs.pediy.com/showthread.php?t=59867 今天我们一起来学习下Rootkit里面的IDT hook. 由于涉及到一些基本概念,在这里也顺便提一下。呵呵,帖子比较长,慢慢看。闲话

坦然 1118

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

内核态Rootkit中IDT Hook技术:原理、实现与检测

中断描述符表(IDT)是x86架构中CPU响应硬件中断和异常的核心机制,通过门描述符将中断向量号映射到处理函数。IDT Hook通过修改门描述符中的目标地址,劫持中断处理流程,实现内核态Rootkit的隐身与行为监控。该技术价值在于拦截层级极低、覆盖面广,常用于键盘输入监控、系统调用拦截等场景。然而,IDT Hook易被SIDT指令检测,且64位模式下地址字段分散,操作复杂。本文深入剖析IDT Hook的完整实现路径,包括定位IDT基址、构造门描述符、关闭写保护等关键步骤,并结合实战经验总结检测思路与常见问

weixin_33646989的博客 160

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Rootkit与后门隐藏

文章目录简介Linux权限管理查看权限目录的权限:权限管理权限操作函数获取root shell防止拷贝linux虚拟文件系统VFS隐藏文件hook 系统调用sys_getdentsgetdents的系统调用树系统调用流程hook getdents隐藏进程日志修改 简介 Rootkit是一套工具,用于长期获取root权限以及隐藏自己和后门程序。攻击者通过漏洞临时获得terget的root权限后,一般...

城志的学习笔记 1810

必备绝技——hook大法(中)

 【文章标题】: 必备绝技——hook大法( 中 )【文章作者】: LvG【作者邮箱】: LvG2008@gmail.com【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!--------------------------------------------------------------------------------【详细过程】  这次主要说说核心层的hook。包

1678
上一篇: rootkit hook之[三] inline hook
下一篇: rootkit hook 之[七]--- IAT Hook
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值