挂海论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
 友情提示:文字/图片广告均非网站意见,请担保交易勿直接付款,由此产生的责任自负
玩游戏来117游戏网(H5不下载也能玩手游传奇,吃鸡,竞技都有)不懂社区·好资源不错过·各位资源站大佬欢迎来采集搬运IOS签名/udid证书出售/送证书加群1040456405 ██【我要租此广告位】██
... .
查看: 3615|回复: 1
打印 上一主题 下一主题

[转载] rootkit ring3进ring0之门--- 中断门(二)

[复制链接]
6高级会员
786/1100

786

积分

260

主题

12

听众
已帮网友解决0 个问题
好评
0
贡献
526
海币
5853
交易币
0
跳转到指定楼层
楼主
发表于 2015-2-9 22:34:47 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
提醒:若下载的软件是收费的"请不要付款",可能是骗子,请立即联系本站举报,执意要付款被骗后本站概不负责。(任何交易请走第三方中介,请勿直接付款交易以免被骗!切记).

友情提示:文字/图片广告均非本站意见,请担保交易勿直接付款,由此产生的责任自负!!!↑↑


本帖最后由 fengjikou 于 2015-2-9 22:51 编辑

接上篇续,我们继续谈谈386保护模式中的门,今天一起学习下中断门。

386实模式下的中断和异常的转移方法与8086相同。这里介绍的中断和异常的转移方法是指 80386在保护模式下响应中断和处理异常时所采用的转移方法。  
1.中断描述符表IDT
    象全局描述符表GDT一样,在整个系统中,中断描述符表IDT只有一个。中断描述符表寄存器IDTR指示IDT在内存中的位置。由于80386只识别256个中断向量号,所以IDT最大长度是2K。  
    中断描述符表IDT所含的描述符只能是中断门、陷阱门和任务门。也就是说,在保护模式下,80386只有通过中断门、陷阱门或任务门才能转移到对应的中断或异常处理程序。  

我们直观的看看IDT的内存位置,在本机 IDT: 8003f400
lkd> !pcr
KPCR for Processor 0 at ffdff000:
    Major 1 Minor 1
  NtTib.ExceptionList: b2c3fc7c
      NtTib.StackBase: b2c3fdf0
     NtTib.StackLimit: b2c3c000
   NtTib.SubSystemTib: 00000000
        NtTib.Version: 00000000
    NtTib.UserPointer: 00000000
        NtTib.SelfTib: 7ffde000

              SelfPcr: ffdff000
                 Prcb: ffdff120
                 Irql: 00000000
                  IRR: 00000000
                  IDR: ffffffff
        InterruptMode: 00000000
                  IDT: 8003f400
                  GDT: 8003f000
                  TSS: 80042000

        CurrentThread: 873dd1e8
           NextThread: 00000000
           IdleThread: 80552d20
前面我们讲过80386只识别256个中断向量号,每个中断向量号占8个字节,对应着一个描述符。因此,中断描述表IDT共占 256 * 8 = 2048字节。
下面是中断描述符的结构。


在IDT中,并不是这256个中断向量都被系统占用了,系统紧紧占用了一小部分,大部分是空闲的,因此用户可以在其中添加自己的中断描述符,即中断门。

2.中断响应和异常处理的步骤
    由硬件自动实现的中断响应和异常处理的步骤如下:  
    首先,判断中断向量号要索引的门描述符是否超出IDT的界限。若超出界限,就引起通用保护故障,出错码为中断向量号乘8再加2。  
    其次,从IDT中取得对应的门描述符,分解出选择子、偏移量和描述符属性类型,并进 行有关检查。描述符只能是任务门、286中断门、286陷阱门、386中断门或386陷阱门,否则就引起通用保护故障,出错码是中断向量号乘8再加2。如果是由INT n指令或INTO指令引起转移,还要检查中断门、陷阱门或任务门描述符中的DPL是否满足CPL<=DPL(对于其它的异常或中断,门中的DPL被 忽略)。这种检查可以避免应用程序执行INT n指令时,使用分配给各种设备用的中断向量号。如果检查不通过,就引起通用保护故障,出错码是中断向量号乘8再加2。门描述符中的P位必须是1,表示门描述符是一个有效项,否则就引起段不存在故障,出错码是中断向量号乘8再加2。  
    最后,根据门描述符类型,分情况转入中断或异常处理程序。 如下图:

   
3.通过中断门的转移
     如果中断向量号所指示的门描述符是386中断门,那么控制转移到当前任务的一个处理程序过程,并且可以变换特权级。与其它调用门的CALL指令一样,从中断门中获取指向处理程序的48位全指针。其中16位 选择子是对应处理程序或代码段的选择子,它指示全局描述符表GDT或局部描述符表LDT中的代码段描述符;32位偏移指示处理程序入口点在代码段内的偏移量。  
    通过中断门的转移过程如下所示,该过程由硬件自动进行,简单了解下。
    (1)若选择子为空,则产生通用保护故障;
    (2)取对应的描述符;
    (3)若非存储段描述符,则产生通用保护故障;
    (4)若非一致代码段且DPL且段存在,则切换到内层堆栈;
    (5)调整RPL=0;
    (6)把描述符装入CS;
    (7)若入口偏移越界,则产生通用保护故障;
    (8)EFLAGS压入堆栈;
    (9)CS压入堆栈;
    (10)EIP压入堆栈;
    (11)使TF=0,NT=0;
    (12)若为中断门,则使IF=0;
    (13)若有出错码,则把出错码压入堆栈;
    (14)转入处理程序。
    由上述转移过程可见,中断门中指示处理程序的选择子必须指向描述一个可执行的代码段的描述符。如果选择子为空,就引起通用保护故障,出错码是0。如果描述符不是代码段描述符,就引起通用保护故障,出错码含选择子。  
    中断或异常可以转移到同一特权级或内层特权级。上述指定处理程序代码段的描述符中的类型及DPL字段,决定了这种同一任务内的转移是否要发生特权级变换。如果是一个非一致代码段,并且DPL<CPL则产生通用保护异常。  
    上述转移过程中的第六步,也就是“把描述符装入CS”,是指把上述指定处理 程序段的描述符装入CS的高速缓冲寄存器中,在这一步骤中要对描述符进行类似通过调用门进行转移的其它检查,包括是否代码段描述符和代码段描述符是否存在 等,因此可能再发生异常。在对该描述符进行检查时,通过调整门中选择子的RPL=0(在处理器内部调整,而不影响存储器中的选择子的RPL字段)的方法, 实现只考虑代码段的DPL,而不考虑门中选择子的RPL。把描述符装入CS之后,还要检查门描述符中给出的表示处理程序代码段入口的偏移是否越界,即是否 超出段界限。如果越界,就引起出错码为0的通用保护故障。
    把TF置成0,表示不允许处理程序单步执行。把NT置成0,表示处理程序在利用中断返回指令IRET返回时,返回到同一任务而不是一个嵌套任务。
    通过中断门的转移和通过陷阱门的转移之间的差别只是对IF标志的处理。对于中断门,在转移过程中把IF置为0,使得在处理程序执行期间屏蔽掉INTR中断。

4.中断或异常处理后的返回
     中断返回指令IRET用于从中断处理程序的返回。该指令的执行根据任务嵌套标志NT位是否为1分为两种情形。 该过程由硬件自动进行,简单了解下。
    NT位为1,表示是嵌套任务的返回。
    NT位为0,表示当前任务内的返回。

后面跟上我们的代码:
.386
.model flat, stdcall
option casemap:none

include myIntGate.inc
.const
CCOUNTED_UNICODE_STRING "\\Device\\MyIntGate",g_usDeviceName,4
CCOUNTED_UNICODE_STRING "\\??\\MyIntGate",g_usSymbolicLinkName,4
IDT_LIMIT = 256 * 8
GATE_TYPE = 0eeh

.data?
g_myInt dd ?
g_myIntoffset dd ?
g_IsAddMyGate dd ?

.code
;中断执行函数
MyIntGateFunction proc
   invoke DbgPrint,$CTA0("MyIntGate calling...\n")
   iretd
MyIntGateFunction endp

;在IDT中添加中断门,返回中断号
AddMyIntGate proc FuncAddr:DWORD
    push ebx
  push ecx
  sidt [esp-2]
  pop ecx
   
  mov eax,0
  .while eax < IDT_LIMIT
       lea edx,[ecx+eax]
       assume edx:ptr GATE
       test [edx].GTYPE,80h
      .if ZERO?
         cli
         mov ebx,FuncAddr
         mov [edx].OFFSETL,bx
         mov [edx].SELECTOR,08h
         mov [edx].DCOUNT,0
         mov [edx].GTYPE,GATE_TYPE
         shr ebx,16
         mov [edx].OFFSETH,bx   
         sti   
          .break
     .endif   
      assume edx:nothing
     add eax,8
  .endw
  pop ebx
  mov g_myInt,eax
  ret
AddMyIntGate endp

;去掉添加的中断门
RemoveMyIntGate proc
  push ebx
  push ecx
  sidt [esp-2]
  pop ecx
  mov eax,g_myIntoffset
  lea edx,[ecx+eax]
  assume edx:ptr GATE
  cli
  mov [edx].OFFSETL,0
  mov [edx].SELECTOR,08h
  mov [edx].DCOUNT,0
  mov [edx].GTYPE,0
  mov [edx].OFFSETH,0  
  sti  
  assume edx:nothing
  pop ebx
  ret

RemoveMyIntGate endp

DispatchControl proc uses esi edi pDeviceObject:PDEVICE_OBJECT,pIrp:PIRP
  mov esi,pIrp
  assume esi:ptr _IRP
  mov [esi].IoStatus.Status,STATUS_UNSUCCESSFUL
  and [esi].IoStatus.Information,0
   
  IoGetCurrentIrpStackLocation esi
  mov edi,eax
  assume edi:ptr IO_STACK_LOCATION
  .if [edi].Parameters.DeviceIoControl.IoControlCode == IOCTL_MYINTGATE && !g_IsAddMyGate
    invoke AddMyIntGate,offset MyIntGateFunction
    mov g_myIntoffset,eax
    xor edx,edx
    cdq
    mov ecx,8
    div ecx
    mov g_myInt,eax
    mov edx,[esi].AssociatedIrp.SystemBuffer
    mov [edx],eax
     
    mov [esi].IoStatus.Status, STATUS_SUCCESS
    mov [esi].IoStatus.Information,4
    mov g_IsAddMyGate,1
  .else
    mov [esi].IoStatus.Status,STATUS_INVALID_DEVICE_REQUEST
  .endif
   
  push [esi].IoStatus.Status
  assume edi:nothing
  assume esi:nothing
  invoke IoCompleteRequest,esi,IO_NO_INCREMENT
  pop eax
   
  ret

DispatchControl endp
DispatchCreateClose proc pDeviceObject:PDEVICE_OBJECT,pIrp:PIRP
   mov eax,pIrp
   assume eax:ptr _IRP
   mov [eax].IoStatus.Status,STATUS_SUCCESS
   and [eax].IoStatus.Information,0
   fastcall IofCompleteRequest,pIrp,IO_NO_INCREMENT
   assume eax:nothing
   mov eax,STATUS_SUCCESS
   ret
DispatchCreateClose endp
DriverUnload proc pDriverObject:PDRIVER_OBJECT
    .if g_IsAddMyGate
     invoke RemoveMyIntGate
  .endif
  invoke IoDeleteSymbolicLink,addr g_usSymbolicLinkName
  mov eax,pDriverObject
  invoke IoDeleteDevice,(DRIVER_OBJECT PTR[eax]).DeviceObject
  ret

DriverUnload endp


DriverEntry proc pDriverObject:PDRIVER_OBJECT,pusRegistryPath:PUNICODE_STRING
    LOCAL pDeviceObject:PDEVICE_OBJECT
    LOCAL status:NTSTATUS
     
    mov status,STATUS_DEVICE_CONFIGURATION_ERROR
    invoke IoCreateDevice,pDriverObject,0,addr g_usDeviceName,FILE_DEVICE_UNKNOWN,0,FALSE,addr pDeviceObject
    .if eax == STATUS_SUCCESS
        invoke IoCreateSymbolicLink,addr g_usSymbolicLinkName,addr g_usDeviceName
        .if eax == STATUS_SUCCESS
            mov eax,pDriverObject
            assume eax:ptr DRIVER_OBJECT
            mov [eax].MajorFunction[IRP_MJ_CREATE * (sizeof PVOID)],offset DispatchCreateClose
            mov [eax].MajorFunction[IRP_MJ_CLOSE * (sizeof PVOID)],offset DispatchCreateClose
            mov [eax].MajorFunction[IRP_MJ_DEVICE_CONTROL *(sizeof PVOID)],offset DispatchControl
            mov [eax].DriverUnload,offset DriverUnload
            assume eax:nothing
            mov g_IsAddMyGate,0
            mov status,STATUS_SUCCESS
        .else
          invoke IoDeleteDevice,pDeviceObject
        .endif
    .endif
    mov eax,status
    ret

DriverEntry endp

end DriverEntry

最后友情提示:
在我的本机返回添加的中断向量是0x20, 调用方法是:
         __asm int 0x20;
     
当然,如果你有参数传递的话,可以使用寄存器进行传递,在MyIntGateFunction中断响应函数中可以得到这个参数。例如:
        _asm
        {
              mov eax, 100
              int 0x20
        }


myIntGate.rar (12.15 KB, 下载次数: 34)


联系我时,请说是在 挂海论坛 上看到的,谢谢!



上一篇:rootkit ring3进ring0之门---调用门--(一)
下一篇:rootkit ring3进ring0之门系列[四] -- 陷阱门
免责声明:
1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关。一切关于该内容及资源商业行为与www.52ghai.com无关。

2、本站提供的一切资源内容信息仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。

3、本站信息来自第三方用户,非本站自制,版权归原作者享有,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。

4、如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵犯你版权的,请邮件与我们联系删除(邮箱:xhzlw@foxmail.com),本站将立即改正。

22

积分

16

主题

5

听众
已帮网友解决0 个问题
好评
0
贡献
6
海币
526
交易币
0
沙发
发表于 2015-2-10 22:16:47 | 只看该作者
感恩无私的分享与奉献 :)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

免责声明|Archiver|手机版|小黑屋|挂海论坛

GMT+8, 2025-4-5 05:56 , Processed in 0.110713 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.2

本站资源来自互联网用户收集发布,如有侵权请邮件与我们联系处理。xhzlw@foxmail.com

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