看流星社区

 找回密码
 注册账号
查看: 4241|回复: 0

[科普]SSDT/SSSDT那些事

[复制链接]

该用户从未签到

发表于 2017-6-1 12:17:13 | 显示全部楼层 |阅读模式


哇,看到很多人找SSDT/SSSDT名称很蛋疼,读ntdll啊什么的,最后index还很乱,github上也有相关的工具,关键字是syscall,也是用ntdll的方式..
这里科普下吧
以win10为例
x86下
找到ssdt表很简单,ida打开找到后交叉下 会找到KiInitSystem
INIT:00998E8E A3 48 93 64 00                                mov     ds:dword_649348, eax
INIT:00998E93 B8 40 93 64 00                                mov     eax, offset _KeServiceDescriptorTable
INIT:00998E98 59                                            pop     ecx
INIT:00998E99 6A 08                                         push    8
INIT:00998E9B C7 05 40 93 64 00 B0 73 52 00                 mov     ds:_KeServiceDescriptorTable, offset _KiServiceTable
INIT:00998EA5 8B F0                                         mov     esi, eax
INIT:00998EA7 C7 05 4C 93 64 00 BC 7A 52 00                 mov     ds:dword_64934C, offset _KiArgumentTable
INIT:00998EB1 89 1D 58 93 64 00                             mov     ds:dword_649358, ebx
INIT:00998EB7 F3 A5                                         rep movsd
INIT:00998EB9 59                                            pop     ecx
INIT:00998EBA 8B F0                                         mov     esi, eax[/code]看下KiServiceTable 哇,这不就是名字吗,index都给我们摆好了~
.text:005273B0 6C 1B 47 00                   _KiServiceTable dd offset _NtAccessCheck@32
.text:005273B0                                                                       ; DATA XREF: KiInitSystem

()+9Do
.text:005273B0                                                                       ; NtAccessCheck

(x,x,x,x,x,x,x,x)
.text:005273B4 04 E8 4D 00                                   dd offset _NtWorkerFactoryWorkerReady@4 ;

NtWorkerFactoryWorkerReady(x)
.text:005273B8 32 AF 74 00                                   dd offset _NtAcceptConnectPort@24 ;

NtAcceptConnectPort(x,x,x,x,x,x)
.text:005273BC D0 1C 43 00                                   dd offset _NtYieldExecution@0 ; NtYieldExecution()
.text:005273C0 EA 30 71 00                                   dd offset _NtWriteVirtualMemory@20 ;

NtWriteVirtualMemory(x,x,x,x,x)
.text:005273C4 68 6F 88 00                                   dd offset _NtWriteRequestData@24 ;

NtWriteRequestData(x,x,x,x,x,x)
.text:005273C8 6A 36 73 00                                   dd offset _NtWriteFileGather@36 ; NtWriteFileGather

(x,x,x,x,x,x,x,x,x)
.text:005273CC 10 7F 71 00                                   dd offset _NtWriteFile@36 ; NtWriteFile

(x,x,x,x,x,x,x,x,x)
.text:005273D0 86 8E 7A 00                                   dd offset _NtSetHighWaitLowEventPair@4 ;

NtSetHighWaitLowEventPair(x)
.text:005273D4 86 8E 7A 00                                   dd offset _NtSetHighWaitLowEventPair@4 ;

NtSetHighWaitLowEventPair(x)
.text:005273D8 50 BD 44 00                                   dd offset _NtWaitForWorkViaWorkerFactory@20 ;

NtWaitForWorkViaWorkerFactory(x,x,x,x,x)
.text:005273DC 20 0D 6A 00                                   dd offset _NtWaitForSingleObject@12 ;

NtWaitForSingleObject(x,x,x)
.text:005273E0 F9 59 89 00                                   dd offset _NtWaitForMultipleObjects32@20 ;

NtWaitForMultipleObjects32(x,x,x,x,x)
.text:005273E4 00 B7 69 00                                   dd offset _NtWaitForMultipleObjects@20 ;

NtWaitForMultipleObjects(x,x,x,x,x)
.text:005273E8 54 D9 74 00                                   dd offset _NtWaitForKeyedEvent@16 ;

NtWaitForKeyedEvent(x,x,x,x)
.text:005273EC E3 69 85 00                                   dd offset _NtWaitForDebugEvent@16 ;

NtWaitForDebugEvent(x,x,x,x)
.text:005273F0 98 21 73 00                                   dd offset _NtWaitForAlertByThreadId@8 ;

NtWaitForAlertByThreadId(x,x)
.text:005273F4 90 49 8C 00                                   dd offset _NtVdmControl@8 ; NtVdmControl(x,x)
.text:005273F8 2C 50 73 00                                   dd offset _NtUnsubscribeWnfStateChange@4 ;

NtUnsubscribeWnfStateChange(x)
.text:005273FC 6A 8C 70 00                                   dd offset _NtUpdateWnfStateData@28 ;

NtUpdateWnfStateData(x,x,x,x,x,x,x)
.text:00527400 76 49 71 00                                   dd offset _NtUnmapViewOfSection@8 ;

NtUnmapViewOfSection(x,x)
.text:00527404 B0 4C 71 00                                   dd offset _NtUnmapViewOfSectionEx@12 ;

NtUnmapViewOfSectionEx(x,x,x)
.text:00527408 80 0D 49 00                                   dd offset _NtUnlockVirtualMemory@16 ;

NtUnlockVirtualMemory(x,x,x,x)
.text:0052740C E2 AC 73 00                                   dd offset _NtUnlockFile@20 ; NtUnlockFile(x,x,x,x,x)
.text:00527410 DC 99 6F 00                                   dd offset _NtUnloadKeyEx@8 ; NtUnloadKeyEx(x,x)
.text:00527414 A2 80 77 00                                   dd offset _NtUnloadKey2@8 ; NtUnloadKey2(x,x)
.text:00527418 DA 89 7A 00                                   dd offset _NtUnloadKey@4 ; NtUnloadKey(x)
.text:0052741C 4C 2B 86 00                                   dd offset _NtUnloadDriver@4 ; NtUnloadDriver(x)
.text:00527420 61 4C 88 00                                   dd offset _NtUmsThreadYield@4 ; NtUmsThreadYield(x)
.text:00527424 FE EC 8D 00                                   dd offset _NtTranslateFilePath@16 ;

NtTranslateFilePath(x,x,x,x)
.text:00527428 80 0B 43 00                                   dd offset _NtTraceEvent@16 ; NtTraceEvent(x,x,x,x)
.text:0052742C 30 28 69 00                                   dd offset _NtTraceControl@24 ; NtTraceControl

(x,x,x,x,x,x)
.text:00527430 62 28 42 00                                   dd offset _NtThawTransactions@0 ; NtThawTransactions

()
.text:00527434 8D E4 58 00                                   dd offset _NtThawRegistry@0 ; NtThawRegistry()

[/code]
看下KiArgumentTable ,跟函数的参数个数对一下~哇
text:00527ABC 20                            _KiArgumentTable db 20h                 ; DATA XREF: KiInitSystem

()+A9o
.text:00527ABD 04                                            db    4
.text:00527ABE 18                                            db  18h
.text:00527ABF 00                                            db    0
.text:00527AC0 14                                            db  14h
.text:00527AC1 18                                            db  18h
.text:00527AC2 24                                            db 24h
.text:00527AC3 24                                            db  24h ; $
.text:00527AC4 04                                            db 4
.text:00527AC5 04                                            db    4
.text:00527AC6 14                                            db 14h
.text:00527AC7 0C                                            db  0Ch
.text:00527AC8 14                                            db 14h
.text:00527AC9 14                                            db  14h
.text:00527ACA 10                                            db 10h
.text:00527ACB 10                                            db  10h
.text:00527ACC 08                                            db 8
.text:00527ACD 08                                            db    8
.text:00527ACE 04                                            db 4
.text:00527ACF 1C                                            db  1Ch
.text:00527AD0 08                                            db 8
.text:00527AD1 0C                                            db  0Ch
[/code]
x86 win32k
找到W32pServiceTable
  1. .data:00030000 _W32pServiceTable dd offset _NtUserGetOwnerTransformedMonitorRect@16
  2. .data:00030000                                         ; DATA XREF: SysEntryGetW32pServiceTable()o
  3. .data:00030000                                         ; NtUserGetOwnerTransformedMonitorRect(x,x,x,x)
  4. .data:00030004                 dd offset _NtUserYieldTask@0 ; NtUserYieldTask()
  5. .data:00030008                 dd offset _NtUserSetSensorPresence@4 ; NtUserSetSensorPresence(x)
  6. .data:0003000C                 dd offset _NtGdiWidenPath@4 ; NtGdiWidenPath(x)
  7. .data:00030010                 dd offset _NtGdiUpdateColors@4 ; NtGdiUpdateColors(x)
  8. .data:00030014                 dd offset _NtGdiUnrealizeObject@4 ; NtGdiUnrealizeObject(x)
  9. .data:00030018                 dd offset _NtGdiUnmapMemFont@4 ; NtGdiUnmapMemFont(x)
  10. .data:0003001C                 dd offset _NtGdiUnloadPrinterDriver@8 ; NtGdiUnloadPrinterDriver(x,x)
  11. .data:00030020                 dd offset _NtGdiTransparentBlt@44 ; NtGdiTransparentBlt(x,x,x,x,x,x,x,x,x,x,x)
  12. .data:00030024                 dd offset _NtGdiTransformPoints@20 ; NtGdiTransformPoints(x,x,x,x,x)
  13. .data:00030028                 dd offset _NtGdiScaleRgn@8 ; NtGdiScaleRgn(x,x)
  14. .data:0003002C                 dd offset _NtGdiScaleValues@12 ; NtGdiScaleValues(x,x,x)
  15. .data:00030030                 dd offset _NtGdiGetDCDpiScaleValue@4 ; NtGdiGetDCDpiScaleValue(x)
  16. .data:00030034                 dd offset _NtGdiGetBitmapDpiScaleValue@4 ; NtGdiGetBitmapDpiScaleValue(x)
  17. .data:00030038                 dd offset _NtGdiSwapBuffers@4 ; NtGdiSwapBuffers(x)
  18. .data:0003003C                 dd offset _NtGdiStrokePath@4 ; NtGdiStrokePath(x)
  19. .data:00030040                 dd offset _NtGdiStrokeAndFillPath@4 ; NtGdiStrokeAndFillPath(x)
  20. .data:00030044                 dd offset _NtGdiStretchDIBitsInternal@64 ; NtGdiStretchDIBitsInternal
  21. (x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x)
  22. .data:00030048                 dd offset _NtGdiStretchBlt@48 ; NtGdiStretchBlt(x,x,x,x,x,x,x,x,x,x,x,x)
  23. .data:0003004C                 dd offset _NtGdiStartPage@4 ; NtGdiStartPage(x)
  24. .data:00030050                 dd offset _NtGdiStartDoc@16 ; NtGdiStartDoc(x,x,x,x)
  25. .data:00030054                 dd offset _NtGdiSetSizeDevice@12 ; NtGdiSetSizeDevice(x,x,x)
  26. .data:00030058                 dd offset _NtGdiSetVirtualResolution@20 ; NtGdiSetVirtualResolution(x,x,x,x,x)
复制代码

W32pArgumentTable:
  1. .data:00031628 _W32pArgumentTable db 10h               ; DATA XREF: SysEntryGetW32pArgumentTable()o
  2. .data:00031629                 db 0
  3. .data:0003162A                 db 4
  4. .data:0003162B                 db 4
  5. .data:0003162C                 db 4
  6. .data:0003162D                 db 4
  7. .data:0003162E                 db 4
  8. .data:0003162F                 db 8
  9. .data:00031630                 db 2Ch
  10. .data:00031631                 db 14h
  11. .data:00031632                 db    8
  12. .data:00031633                 db  0Ch
  13. .data:00031634                 db 4
  14. .data:00031635                 db    4
  15. .data:00031636                 db    4
  16. .data:00031637                 db    4
  17. .data:00031638                 db 4
  18. .data:00031639                 db  40h ; @
  19. .data:0003163A                 db  30h ; 0
  20. .data:0003163B                 db    4
  21. .data:0003163C                 db  10h
  22. .data:0003163D                 db  0Ch
复制代码
x64下:
  1. KiInitSystem:
  2. INIT:000000014075DC47                 mov     cs:KiSwapEvent.Header.WaitListHead.Flink, rax
  3. INIT:000000014075DC4E                 lea     rax, KiServiceTable
  4. INIT:000000014075DC55                 mov     qword ptr cs:KeServiceDescriptorTable, rax
  5. INIT:000000014075DC5C                 mov     eax, cs:KiServiceLimit
  6. INIT:000000014075DC62                 movaps  xmm0, cs:KeServiceDescriptorTable
  7. INIT:000000014075DC69                 mov     cs:dword_14037F790, eax
  8. INIT:000000014075DC6F                 lea     rax, KiArgumentTable
  9. INIT:000000014075DC76                 mov     cs:qword_14037F798, rax
  10. INIT:000000014075DC7D                 lea     rax, KiBalanceSetManagerDeferredRoutine
  11. INIT:000000014075DC84                 movaps  xmm1, xmmword ptr cs:dword_14037F790
  12. KiServiceTable:
  13. .rdata:00000001402C2310 KiServiceTable  dq offset NtAccessCheck ; DATA XREF: KiInitializeKernel+5F1o
  14. .rdata:00000001402C2310                                         ; KiInitSystem+BEo
  15. .rdata:00000001402C2318                 dq offset NtWorkerFactoryWorkerReady
  16. .rdata:00000001402C2320                 dq offset NtAcceptConnectPort
  17. .rdata:00000001402C2328                 dq offset NtMapUserPhysicalPagesScatter
  18. .rdata:00000001402C2330                 dq offset NtWaitForSingleObject
  19. .rdata:00000001402C2338                 dq offset NtCallbackReturn
  20. .rdata:00000001402C2340                 dq offset NtReadFile
  21. .rdata:00000001402C2348                 dq offset NtDeviceIoControlFile
  22. .rdata:00000001402C2350                 dq offset NtWriteFile
  23. .rdata:00000001402C2358                 dq offset NtRemoveIoCompletion
  24. .rdata:00000001402C2360                 dq offset NtReleaseSemaphore
  25. .rdata:00000001402C2368                 dq offset NtReplyWaitReceivePort
  26. .rdata:00000001402C2370                 dq offset NtReplyPort
  27. .rdata:00000001402C2378                 dq offset NtSetInformationThread
  28. .rdata:00000001402C2380                 dq offset NtSetEvent
  29. .rdata:00000001402C2388                 dq offset NtClose
  30. .rdata:00000001402C2390                 dq offset NtQueryObject
  31. .rdata:00000001402C2398                 dq offset NtQueryInformationFile
  32. .rdata:00000001402C23A0                 dq offset NtOpenKey
  33. .rdata:00000001402C23A8                 dq offset NtEnumerateValueKey
  34. .rdata:00000001402C23B0                 dq offset NtFindAtom
  35. .rdata:00000001402C23B8                 dq offset NtQueryDefaultLocale
  36. .rdata:00000001402C23C0                 dq offset NtQueryKey
  37. .rdata:00000001402C23C8                 dq offset NtQueryValueKey
  38. KiArgumentTable
  39. .rdata:00000001402C30F4 KiArgumentTable db  10h                 ; DATA XREF: KiInitializeKernel+5EAo
  40. .rdata:00000001402C30F4                                         ; KiInitSystem+DFo
  41. .rdata:00000001402C30F5                 db    0
  42. .rdata:00000001402C30F6                 db    8
  43. .rdata:00000001402C30F7                 db    0
  44. .rdata:00000001402C30F8                 db    0
  45. .rdata:00000001402C30F9                 db    0
  46. .rdata:00000001402C30FA                 db  14h
  47. .rdata:00000001402C30FB                 db  18h
  48. .rdata:00000001402C30FC                 db  14h
  49. .rdata:00000001402C30FD                 db    4
  50. .rdata:00000001402C30FE                 db    0
  51. .rdata:00000001402C30FF                 db    0
  52. .rdata:00000001402C3100                 db    0
  53. .rdata:00000001402C3101                 db    0
  54. .rdata:00000001402C3102                 db    0
  55. .rdata:00000001402C3103                 db    0
  56. .rdata:00000001402C3104                 db    4
  57. .rdata:00000001402C3105                 db    4
  58. .rdata:00000001402C3106                 db    0
  59. .rdata:00000001402C3107                 db    8
  60. .rdata:00000001402C3108                 db    0
复制代码


看下表定义 SSPT就是参数个数表啦~
  1. #pragma pack(1)     //SSDT表的结构
  2. typedef struct ServiceDescriptorEntry {
  3.      // SSDT
  4.      unsigned int *ServiceTableBase;
  5.      unsigned int *ServiceCounterTableBase; //Used only in checked build
  6.      unsigned int NumberOfServices; //ServiceLimit
  7.      unsigned char *ParamTableBase; //SSPT
  8.      /*
  9.      SSSDT....
  10.      */
  11. } ServiceDescriptorTableEntry_t, *PServiceDescriptorTableEntry_t;
  12. #pragma pack()
复制代码
  1. for (i = 0; i< SSDT_FUNC_COUNT; i++)
  2.             {
  3.                 g_aCurrentKiServiceTable[i] = ((PULONG)(pServiceTable[0]))[i];
  4.                
  5.                 //获得ssdt 参数个数
  6.                 g_KiArgumentTable[i] = ( ((BYTE *)(pServiceTable[0+3]))[i] ) / 4;
  7.             }
  8.             ULONG j;
  9.             for (j = 0; j < SSDTSHADOW_FUNC_COUNT; j++)
  10.             {
  11.                 g_aCurrentW32pServiceTable[j] = ((PULONG)(pServiceTable[4]))[j];
  12.                 //获得shadow 参数个数
  13.                 g_W32pArgumentTable[j] = ( ((BYTE *)(pServiceTable[4+3]))[j] ) / 4;
  14.             }
  15.             KeUnstackDetachProcess(&sExplorerApcState);
  16.             //获得ssdt的地址  获得ssdtshadow的地址
  17.             g_dwKiServiceTable = pServiceTable[0];
  18.             g_dwW32pServiceTable = pServiceTable[4];
复制代码

   





点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-4-26 04:18

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

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