ShadowSSDT Hook

2023-05-16

ShadowSSDT表的获取

这里的ShadowSSDT表的获取是通过函数KeAddSystemServiceTable来获取的。
使用这个函数的原因:
1、这个函数是已经导出的,可以在代码中直接使用。
2、这个函数里面使用了ShadowSSDT,包含了ShadowSSDT的地址。
可以使用WinDbg查看该函数代码,如下:

kd> u KeAddSystemServiceTable l 30
nt!KeAddSystemServiceTable:
83fa3008 8bff            mov     edi,edi
83fa300a 55              push    ebp
83fa300b 8bec            mov     ebp,esp
83fa300d 837d1801        cmp     dword ptr [ebp+18h],1
83fa3011 7760            ja      nt!KeAddSystemServiceTable+0x6b (83fa3073)
83fa3013 8b4518          mov     eax,dword ptr [ebp+18h]
83fa3016 c1e004          shl     eax,4
83fa3019 83b8c009f88300  cmp     dword ptr nt!KeServiceDescriptorTable (83f809c0)[eax],0
83fa3020 7551            jne     nt!KeAddSystemServiceTable+0x6b (83fa3073)
83fa3022 8d88000af883    lea     ecx,nt!KeServiceDescriptorTableShadow (83f80a00)[eax]
83fa3028 833900          cmp     dword ptr [ecx],0
83fa302b 7546            jne     nt!KeAddSystemServiceTable+0x6b (83fa3073)
83fa302d 837d1801        cmp     dword ptr [ebp+18h],1
83fa3031 8b5508          mov     edx,dword ptr [ebp+8]
83fa3034 56              push    esi
83fa3035 8b7510          mov     esi,dword ptr [ebp+10h]
83fa3038 57              push    edi
83fa3039 8b7d14          mov     edi,dword ptr [ebp+14h]
83fa303c 8911            mov     dword ptr [ecx],edx
83fa303e 8b4d0c          mov     ecx,dword ptr [ebp+0Ch]
83fa3041 8988040af883    mov     dword ptr nt!KeServiceDescriptorTableShadow+0x4 (83f80a04)[eax],ecx
83fa3047 89b0080af883    mov     dword ptr nt!KeServiceDescriptorTableShadow+0x8 (83f80a08)[eax],esi
83fa304d 89b80c0af883    mov     dword ptr nt!KeServiceDescriptorTableShadow+0xc (83f80a0c)[eax],edi
83fa3053 7418            je      nt!KeAddSystemServiceTable+0x65 (83fa306d)  

在代码中获取ShadowSSDT的方式是暴力搜索,代码如下:

ULONG GetShadowTableAddress()
{
	ULONG dwordatbyte, i;
	PUCHAR p = (PUCHAR)KeAddSystemServiceTable;
	for(i = 0; i < 0x1024; i++, p++)
	{
		__try
		{
			dwordatbyte = *(PULONG)p;
		}
		__except(EXCEPTION_EXECUTE_HANDLER)
		{
			return NULL;
		}
		if(MmIsAddressValid((PVOID)dwordatbyte))
		{
			//这里得到的以dwordatbyte为首地址的数据是否与KeServiceDescriptorTable的前16字节相同
			if(memcmp((PVOID)dwordatbyte, KeServiceDescriptorTable, 16) == 0)
			{
				//地址相同,则排除,因为要找到的是ShadowSSDT,而不是SSDT。
				if((PVOID)dwordatbyte == KeServiceDescriptorTable)
					continue;
				return dwordatbyte;
			}
		}
	}
	return NULL;
}  

ShadowSSDT Hook

ShadowSSDT的Hook方法与SSDT的Hook方法基本一样,不同的地方是以下几点:
1、ShadowSSDT Hook之前需要先KeAttachProcess一个有界面的进程,一般会操作explorer.exe
2、由于KeAttachProcess需要传入一个类型为PEPROCESS的参数,需要通过进程名获取该进程的PEPROCESS结构体。
3、Hook完成之后使用KeDetachProcess获取Attach的进程。
简单说一下通过进程名获取该进程的PEPROCESS结构体的方法:
使用PsGetProcessImageFileName获取当前进程的结构体,以此向前或向后遍历搜索,获取结构体中的进程名信息与需要的进程名比较。在这个里面需要处理的两个地方,由于系统版本不同,导致PEPROCESS结构体中进程名的偏移不同,因此需要先判断系统,设置不同的偏移;第二个是PsGetProcessImageFileName该函数只能运行于PASSIVE_LEVEL层,所以需要获取当前的IRQL进行判断。

疑问

关于KeAttachProcess和KeDetachProcess,
我想在Hook之后,KeAttachProcess一个进程,然后,在卸载Hook之后,再执行KeDetachProcess函数,但是当我Hook完成之后,运行一会,就出现系统蓝屏了,难道KeAttachProcess之后,对ShadowSSDT做完操作,就必须先KeDetachProcess吗?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ShadowSSDT Hook 的相关文章

  • 张量流中使用的钩子是什么意思

    我无法理解python tensorflow中Hook的确切含义 LearningRateSetterHook tf train SessionRun Hook 如果您向我解释一下 我将不胜感激 谢谢 这可能是一个关于什么是钩子的更普遍的问
  • 低级鼠标和键盘钩子回调在哪个线程中运行?

    我正在设置一个低级鼠标钩与SetWindowsHookEx HANDLE handle SetWindowsHookEx WH MOUSE LL callback GetModuleHandle NULL NULL 因为这是一个低级回调 所
  • 如何对位于 GIthub 中的存储库实施编码标准

    我们在 Github 上有一个帐户 并在 Github 私有存储库 中托管我们的所有项目 我们希望强制执行编码标准以及可能用于内部目的的其他挂钩 我们已经让这些钩子在颠覆方面工作得很好 因为存储库位于一个地方 管理这些钩子非常好 使用 Gi
  • 禁用单个 git 命令的钩子

    鉴于我需要在我的钩子脚本中使用 git 我希望我的钩子脚本本身不触发钩子 所以我想在每个命令的基础上跳过钩子 即我正在寻找如下选项 git no hooks some git command 您可以使用 git c core hooksPa
  • Visual Studio 调试模式下显示奇怪的内存内容

    我正在编写一些多线程C 程序 我尝试修改函数体开头的几条指令 以将执行重定向到其他地方 但我注意到 在 Visual Studio 2015 中调试时 某些内存位置似乎是不可更改的 如Memory window 例如 下图中有一个函数ApS
  • 服务器上的自动化 django 接收钩子:用“yes”响应collectstatic

    我正在使用 Github post recieve hook 来运行一个 bash 文件来提取我的两个存储库 bin sh cd public html repo static env i usr bin git pull origin m
  • Phonegap Hook - execvp 权限被拒绝

    我正在尝试运行我在网上找到的phonegap hook 但我总是在构建时遇到相同的错误 execvp Permission denied 该钩子是位于此处的 splash and icon 钩子 http devgirl org 2013
  • 用于检测最小化窗口的钩子 C#

    大家好 在C 中如何检测用户单击了外部程序 例如记事本 的最小化按钮 谢谢 这应该有效 public class myClass DllImport user32 dll return MarshalAs UnmanagedType Boo
  • 数据库中自定义字段的值在哪里[重复]

    这个问题在这里已经有答案了 我可以在常规选项卡的编辑页面产品中创建自定义字段 并在主题的functions php中使用以下代码 Display Fields add action woocommerce product options g
  • SVN 挂钩不工作

    我有一个分支和主干的服务器存储库 分支是所有团队成员的存储库 我正在尝试使用svn hooks仅在我的分支下的仓库中 但它似乎工作得不好 以下是我尝试采取的步骤 检查过了my repo从远程服务器的branch my repo 自本地回购以
  • 检查 API 是否受到监控(挂钩?)

    我的应用程序使用一些 API 例如GetProcAddress and CreateProcess这有时会导致防病毒软件将其标记为恶意软件 即使它不是恶意软件 我想做的是检查特定的 API 是否正在被监视或挂钩 如果是 那么我不会调用该部分
  • WordPress 添加新的用户挂钩

    我想添加一些自定义字段以在 Wordpress 中添加新用户 我正在使用以下钩子 show user profile edit user profile 这些挂钩在编辑个人资料页面上显示新的自定义字段 但我希望新的自定义字段显示在 添加新用
  • Git CHMOD 接收后挂钩

    我在网络服务器上使用一个裸露的远程存储库 并带有一个接收后挂钩 该挂钩会自动将我的文件推送到 public html 目录中 问题是 我使用的是 codeigniter index php 文件必须是 chmod 755 我使用 filez
  • 低级键盘挂钩

    我刚刚买了一个新键盘 我有兴趣准确跟踪键盘整个使用寿命期间我按下 敲击的次数 我只想记录 keyUp 因为我不关心重复 我一直在搜索最好的方法来做到这一点 但我什至不知道该采取什么方法 所以我在智能搜索方面遇到了困难 另外 我真正使用过的唯
  • C++ d3d hooking - COM vtable

    尝试制作一个 Fraps 类型的程序 请参阅评论以了解失败的地方 include precompiled h typedef IDirect3D9 STDMETHODCALLTYPE Direct3DCreate9 t UINT SDKVe
  • Git commit hook - 如何使用 commit-msg 挂钩检查消息中的字符串?

    我需要创建一个 commit msg 挂钩来检查提交消息的任何部分是否包含 app asana 我搜索了一些参考资料和文档 我知道我需要为此使用 commit msg 我必须使用 Perl 或 Bash 来完成此操作 有人对此有线索吗 或者
  • 仅 mysqldump 模式,模式更新不丢失

    我正在考虑在提交更改之前使用 git pre commit hook 导出 MySQL 数据库模式 以便其他开发人员可以使用 git 存储库中的 SQL 脚本更新自己的数据库 默认情况下 mysqldump 我正在使用 no data 会在
  • 在 Mac OS X 中获取进程创建通知

    我正在尝试为 Mac OS X 编写 kext 当任何进程启动时都会收到通知 在 Windows 中 您可以通过调用 PsSetLoadImageNotifyRoutine 并指定在进程启动时调用的回调来完成此操作 这是有记录的方式 它适用
  • 全局键盘挂钩的合法用途是什么?

    除了仅应由操作系统提供的应用程序启动快捷方式之外 Windows 键盘挂钩等东西的合法用途是什么 在我看来 我们只在键盘记录器之类的事情上遇到问题 因为操作系统提供了钩子来执行除操作系统内核本身之外的任何情况下任何人都不允许执行的操作 编辑
  • 使用主题函数在 body 标记后插入代码

    我试图在开头添加一段代码everyDrupal 站点中的页面 因为我有不止一个page模板 我想以编程方式执行此操作 但没有成功 我还是个新手 虽然我了解了钩子 主题函数等的要点 但我只是想不出实现这一目标的正确方法 到目前为止我已经覆盖了

随机推荐