SSDT笔记。(System Services Descriptor Table)

摘要:
说完这些废话,读一下你的笔记。事实上,r0的内联挂钩在理论上与r3的类似。OpenProcess-˃NtOpenProcess-˃NtOpenProcess-˃realNtOpenProcessAddress是第一个SSDT结构类型defstruct_SYSTEM_SERVICE_TABLE{PVOIDServiceTableBase;//这指向系统服务函数地址表PULONGServiceCounterTableBase;ULONGNumberOfService;//服务函数的数量ULONGParamTableBase;这里我们以OpenProcess为例。OD调试Ctrl+G直接跳转到OpenProcess。7C830A2CFF151C11807CCALLDWORDPTRDS:[];ntdll。输入ZwOpenProcess以输入7C92D5FE˃B87A9000000MOVEAX、7A7C92D603BA0003FE7FMOVEDX、7FFE03007C92D608FF12CALLDWORDPTRDS:[EDX]第一项。7A是SSDT表中ZwOpenProcess的索引号。SSDT总共具有11cH服务功能。让我们看看工具。KeServiceDescriptor表8055d700805054940000000000011c805059088055d71000000000000000000000000000000000000000000008055d720000000000000000000000000008055d730000000000000000000000000000000000000000000000000008055d740000000200002710bf80c321000000008055d750b9598a80b8f0db608a514538806f80c08055d7600000000000000受影响30ffff8055d77002299df001cd34b10000000000000000000805549000000011c80505908结构。ServiceTableBase==80505494NumberOfService==11cParamTableBase==805059087A是NtOpenProcess的索引编号。80505494是指向函数表地址的指针。然后使用dd80505494+0x7a*4lkd˃dd80505492+0x7a*48050567c805cc456805eef26805eb8a805ab3f48050568c80616046805c4be8805cc6e2805eef448050569c805eecfa80617f8080646c0e805ca50880505566ac805f930a805f4f30805f511c805b9426805056bc806100048057ef480617e080617e08080617e50 805056cc80540c2e80611bf68068568057a e82805056dc805bf65a8057b1d0806100cc805780488805056ec806170ca8057ba3c805d6cbc805a63ec805cc456是ZwOpenProcess入口地址。

本人只是业余爱好,勿喷,有兴趣的看。懂的也就没必要看了。

希望能结交更多的朋友,不论技术如何,在下都愿意一起分享学习。

肯定有错的地方,希望大家指出,下面只是概念性东西。希望能给和我一样菜的朋友看下。看书上或者资料介绍的很繁琐感觉,我这算大白话吧。因为业余也没想系统学习,所以朋友给我科普了下,在这里谢谢下他。

说了这么多废话看笔记吧。

r0的inline hook 其实理论上和 r3的 我感觉差不多。(自己的看法)

OpenProcess(kernel32.dll)->NtOpenProcess(ntdll.dll)->NtOpenProcess(ssdt kernel api address)->real NtOpenProcess Address

首先是SSDT的结构

 typedef struct _SYSTEM_SERVICE_TABLE

  {

  PVOID ServiceTableBase; //这个指向系统服务函数地址表

  PULONG ServiceCounterTableBase;

  ULONG NumberOfService; //服务函数的个数

  ULONG ParamTableBase;//参数表 

  }SYSTEM_SERVICE_TABLE,*PSYSTEM_SERVICE_TABLE;

这里使用OpenProcess做例子。

OD调试 Ctrl+G 直接跳到 OpenProcess。

7C830A2C FF15 1C11807C CALL DWORD PTR DS:[<&ntdll.NtOpenProcess>] ; ntdll.ZwOpenProcess

 回车进入

7C92D5FE > B8 7A000000 MOV EAX,7A
7C92D603 BA 0003FE7F MOV EDX,7FFE0300
7C92D608 FF12 CALL DWORD PTR DS:[EDX]

第一条。7A是ZwOpenProcess在 SSDT表里面的索引号。  SSDT 一共有 11c H个服务函数。(0-283)

咱们用工具看下。

SSDT笔记。(System Services Descriptor Table)第1张

没错吧?知道了索引号 然后使用Windbg。

Open- Kernel debug- local 挂上本机。

在命令行输入 dd nt!KeServiceDescriptorTable

lkd> dd nt!KeServiceDescriptorTable
8055d700  80505494 00000000 0000011c 80505908
8055d710  00000000 00000000 00000000 00000000
8055d720  00000000 00000000 00000000 00000000
8055d730  00000000 00000000 00000000 00000000
8055d740  00000002 00002710 bf80c321 00000000
8055d750  b9598a80 b8f0db60 8a514538 806f80c0
8055d760  00000000 00000000 ffeced30 ffffffff
8055d770  02299df0 01cd34b1 00000000 00000000

80505494 00000000 0000011c 80505908 找四个值就是 SSDT结构的值了。

ServiceTableBase==80505494 

NumberOfService==11c

ParamTableBase==80505908

7A是NtOpenProcess的索引号。80505494是指针,指向函数表的地址.

然后使用dd 80505494+0x7a*4 (*4 是因为 表里面的地址存放是 11cH个dword)

lkd> dd 80505494+0x7a*4
8050567c  805cc456 805eef26 805eeb8a 805ab3f4
8050568c  80616046 805c4be8 805cc6e2 805eef44
8050569c  805eecfa 80617f80 80646c0e 805ca508
805056ac  805f930a 805f4f30 805f511c 805b9426
805056bc  80610004 80577ef4 80617e50 80617e50
805056cc  80540c2e 80611bf6 80612856 8057ae82
805056dc  805bf65a 8057b1d0 806100cc 80578048
805056ec  806170ca 8057ba3c 805d6cbc 805a63ec

805cc456就是ZwOpenProcess 入口地址了。

lkd> u 805cc456 
nt!NtOpenProcess:
805cc456 68c4000000      push    0C4h
805cc45b 68c0b44d80      push    offset nt!FsRtlLegalAnsiCharacterArray+0x2010 (804db4c0)
805cc460 e88b07f7ff      call    nt!wctomb+0x45 (8053cbf0)
805cc465 33f6            xor     esi,esi
805cc467 8975d4          mov     dword ptr [ebp-2Ch],esi
805cc46a 33c0            xor     eax,eax
805cc46c 8d7dd8          lea     edi,[ebp-28h]
805cc46f ab              stos    dword ptr es:[edi]

如果需要inline hook这里5字节就可以了。

805cc456 68c4000000      push    0C4h

免责声明:文章转载自《SSDT笔记。(System Services Descriptor Table)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇(办公)TOKENSelenium Grid + Maven + TestNG + Jenkins 完成Selenium 分布式并发测试下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

windows下C语言编程获取磁盘(分区)使用情况

windows下编程获取磁盘(分区)使用情况 windows下编程获取磁盘(分区)使用情况 GetLogicalDriveStrings函数 使用示例 获取需要的缓冲区长度示例 获取所有驱动器号示例 GetDriveType函数使用示例 GetDiskFreeSpaceEx 函数使用示例 linux下可以使用命令df -h来获取各个(...

PE注入

1 // PE注入.cpp : 定义控制台应用程序的入口点。 2 // 3 4 #include "stdafx.h" 5 6 #include <windows.h> 7 8 #include <tlhelp32.h> 9 10 #include <process.h>...

WIN32API获取进程句柄的2种方式

0x00 相关说明:Windows系统中,进程句柄是进程最重要的属性之一,在应用层可以通过进程句柄直接对指定进程的内存空间进行读写。 0x01 通过进程名获取进程句柄:首先通过进程名得到进程ID: 1、 通过 CreateToolhelp32Snapshot 获得当前系统中所有进程的快照 2、 通过 Process32First 判断第一个进程的信息是否...

C++里大写TRUE和小写true区别

1.C++里有区别true是bool型的;TRUE是int型的,VC里这个是ms自己定义的; C++规定不允许只通过返回类型不同区别两个函数================================================你写错了吧……原函数声明是virtual BOOL InitInstance( );你函数声明是bool,麻烦把它写成...

DLL劫持 LPK.dll

/ 上次写了USP10的,这次把LPK的代码贴出来. //以下文件在 lpk.cpp 中,头文件和上次USP10的相同 // lpk.cpp : Defines the entry point for the DLL application. // //////////////////////////////////////////////////////...

MFC录制音频和播放音频

一、录制音频   在windows中提供了相应的API函数(waveIn这个族的函数)实现录音功能;在使用这些函数时,一定要引入相应的头文件 #include <windows.h> #include <Mmsystem.h> #pragram comment(lib, "Winmm.lib") 1、在开始录音之前,需要首先定义音频...