挂海论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[转载] rootkit ring3进ring0之门---调用门--(一)

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

786

积分

260

主题

12

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

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


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

今天我们来谈谈保护模式下的调用门。从而开始了我们的门系列内容。
先谈谈程序转移.,程序转移分为两种: 近转移和远转移 ,其中近转移中又分为相对地址转移和绝对地址转移. 而远转移只有绝对地址转移.。可以通俗的讲,cs发生变化的转移称为远转移,cs不变的转移,我们称为近转移。例如:windows  ring3下cs是0x1b , ring0下cs通常是0x08.。 对于近转移,我们不需要进行特权级检查。由于windows是保护模式的操作系统,对于远转移如果跨层则需要进行特权级检查,看是否允许其调用。

为了在不同特权级的代码段之间进行控制访问,处理器特别提供了一组称为门描述符的描述符。我们可以通过这组门描述符中的任何一个进行远转移。门提供了受保护的间接调用,为任务内的特权转移提供了安全可靠的方法。

今天我们讲的调用门,就是这组门描述符中的一个。为了搞清楚调用门,我们需要看下调用门描述符的结构:


对应的结构体是:
    typedef struct
    {
        unsigned short  offset_0_15;
        unsigned short  selector;

        unsigned char    param_count : 4;
        unsigned char    some_bits   : 4;

        unsigned char    type        : 4;
        unsigned char    app_system  : 1;
        unsigned char    dpl         : 2;
        unsigned char    present     : 1;
     
        unsigned short  offset_16_31;
    } CALLGATE_DESCRIPTOR;  


调用门描述符可以放在GDT、LDT中,但是不能放在IDT中。在WINDOWS XP中,没有LDT.
在这里,我们举例说明其在GDT中的情况。尽管windows提供了多种不同的描述符,但是每种描述符中都有present位代表该描述符是否存在。它在每个描述符中的位置都是一样的,因此我们可以根据这个present位来在GDT中找出一个空白位置,在这个位置里面添加我们自己定义的描述符。内核中GDT的位置,我们可以用WINDBG看下:
lkd> !PCR
KPCR for Processor 0 at ffdff000:
    Major 1 Minor 1
  NtTib.ExceptionList: b1fa5c7c
      NtTib.StackBase: b1fa5df0
     NtTib.StackLimit: b1fa2000
   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: 88899020
           NextThread: 00000000
           IdleThread: 80552d20

可以看到我本机GDT的位置是 GDT: 8003f000

调用门的工作原理如图所示。
首先进行特权检查
根据selector,在GDT中找出CS段的范围。
根据offset_0_15和offset_16_31求出段中的偏移。
跳转到地址中执行。

特权检查需要检查的内容包括:CPL,RPL,调用门DPL和目标段描述符DPL.

特权检查的规则:

最后简单介绍下demo的做法:
1)根据present位是否为0,我们遍历GDT中的表,找到一个present为0的位置。
2)在该位置添加调用门。
3)记下该位置对应的选择子。由于需要在ring3下调用,
    因此选择子CallGate_Sel = 索引值 or 0x03. 其中0x03代表我们设置的RPL.
4) 通过指令call FWORD ptr CallGate_Sel 执行调用门。

本例中,我们添加的调用门在gdt中的偏移值是0x48, 我们设置RPL = 3,因此对应的选择子应该是CallGate_Sel = 0x48 | 0x03 = 0x4b.

代码附上:
.386
.model flat, stdcall
option casemap:none

include myCallGate.inc
.const
CCOUNTED_UNICODE_STRING  "\\Device\\MYCALLGATE",g_usDeviceName,4
CCOUNTED_UNICODE_STRING  "\\??\\MYCALLGATE",g_usSymbolicLinkName,4

GDT_LIMIT  = 03ffh
GATE_TYPE  = 0ECH


.code
Ring0Fun proc
  pushad
  pushfd
  cli
  invoke DbgPrint, $CTA0("mycallgate function executed\n")
  ;add your code here, you can do anything if you like.  
  sti
  popfd
  popad
  retf
Ring0Fun endp

AddCallGate proc FuncAddr:ULONG
    pushfd
    pushad
     
  push esi
  sgdt [esp-2]
  pop esi
   
  mov eax,8
  .while eax < GDT_LIMIT
       lea edx,[esi+eax]
       assume edx:ptr CALLGATE
       test [edx].GTYPE,80h
      .if ZERO?
         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      
          .break
     .endif   
      assume edx:nothing
     add eax,8
  .endw
      
  popad
    popfd
  ret

AddCallGate endp

DispatchControl proc uses esi edi pDeviceObject:PDEVICE_OBJECT,pIrp:PIRP
   
  mov esi,pIrp
  assume esi:ptr _IRP
  mov [esi].IoStatus.Status ,STATUS_SUCCESS
  and [esi].IoStatus.Information,0
  invoke IoCompleteRequest,pIrp,0
  mov eax,[esi].IoStatus.Status
  assume esi:nothing
  ret

DispatchControl endp

DriverUnload proc pDriverObject:PDRIVER_OBJECT
   
  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 status:NTSTATUS
    LOCAL pDeviceObject:PDEVICE_OBJECT
     
    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 ecx,IRP_MJ_MAXIMUM_FUNCTION + 1
        .while ecx
            dec ecx
            mov [eax].MajorFunction[ecx * (sizeof PVOID)],offset DispatchControl
        .endw  
        mov [eax].DriverUnload,offset DriverUnload
        assume eax:nothing
             invoke AddCallGate,offset Ring0Fun
            mov status,STATUS_SUCCESS
        .else
          invoke IoDeleteDevice,pDeviceObject
        .endif
    .endif
   
    mov eax,status
    ret

DriverEntry endp

end DriverEntry

最后友情提示:
    由于添加调用门的位置,我们事先并不知道,如果你想做的智能些的话,可以通过注册表,共享区,或者直接deviceiocontrol等等的方式通知ring3程序选择子是多少。

myCallGate.rar (4.16 KB, 下载次数: 35)

test.rar (5.44 KB, 下载次数: 24)



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



上一篇:教你如何编写 OD 插件 (附VC++例子一个)
下一篇:rootkit ring3进ring0之门--- 中断门(二)
免责声明:
1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关。一切关于该内容及资源商业行为与www.52ghai.com无关。

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

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

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

6高级会员
1050/1100

1050

积分

346

主题

9

听众
已帮网友解决0 个问题
好评
0
贡献
704
海币
3347
交易币
0
沙发
发表于 2015-6-26 01:10:58 | 只看该作者
回复就能得海币,我爱你!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-4-5 06:02 , Processed in 0.117893 second(s), 34 queries , Gzip On.

Powered by Discuz! X3.2

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

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