windows - 挂钩 SSDT 后在将参数传递给 NtWriteFile 之前修改参数
问题描述
我目前正在做关于 Windows 的 rootkit 的讲座(和学习)。我能够挂钩 NtWriteFile 的 SSDT 条目并在 WinDbg 上显示一条简单的消息,但我现在很好奇在将参数传递给原始函数之前更改参数的最佳(也是最安全)方法是什么。在此示例中,如果缓冲区包含“我的字符串”,我将尝试更改它。我怎样才能安全地交换 Buffer 的内容?
NTSTATUS ZwWriteFileHook(
IN HANDLE FileHandle,
IN HANDLE Event,
IN PIO_APC_ROUTINE ApcRoutine,
IN PVOID ApcContext,
IN PIO_STATUS_BLOCK IoStatusBlock,
IN PVOID Buffer,
IN ULONG Length,
IN PLARGE_INTEGER ByteOffset,
IN PULONG Key
)
{
...
if (!strncmp((PCHAR) Buffer, "My String", Length)) {
// Modify parameters here
}
ntStatus = ((PZwWriteFile) zwWriteFileOld)(FileHandle, Event,
ApcRoutine, ApcContext, IoStatusBlock, Buffer, Length, ByteOffset,
Key);
...
}
谢谢你。
解决方案
首先,像这样直接访问(读/写)UserMode指针存在问题,您首先要探测READ的指针,如果写入它,还需要使用内核API探测WRITE ProbeForRead和ProbeForWrite。
其次,我宁愿不向 UserMode 提供的缓冲区写入修改后的值,而是分配一个新的缓冲区,然后释放它,我认为这是最安全的方式。
推荐阅读
- docker - 如何在 OVH 上获取专用服务器的 Docker 注册表
- azure - 您可以通过 Azure Api 网关为 API 添加多个身份验证提供程序吗?
- swift3 - 访问 collectionView 单元格可见/不可见
- qt - 将 QByteArray 转换为 QString 为空
- php - 从 PHP 向 AJAX 发送包含一些 JSON 字符串的数组时出现问题
- javascript - 如何在与 PartialView A 交互时切换到 PartialView A 到 PartialView B?
- python - 如何在 Python 中使用正则表达式提取文本?
- python - 使用 Python 进行线性搜索和二分搜索之间经过的时间
- javascript - 不传播的原因是什么(es 6传播运算符)javascript错误对象
- python - 来自服务器的计时应用程序和确切时间戳 - 无服务器?