一个包含脚本的仓库,用于演示以非预期方式使用 Rtl* 函数的替代读取和写入原语。
RtlFillMemory 接受三个参数:指向目标内存的指针、要写入的字节数以及一个单字节值。它只向指定的内存块写入一个字节。
使用 RtlInitializeBitMapEx 和 RtlFillMemory 组合实现的写入原语。
首先,它以 16 字节的块遍历字符串,将每个块拆分为两个 8 字节的值。第一个 8 字节块存储在 RtlInitializeBitMapEx 的第一个参数中,第二个 8 字节块存储在第二个参数中。
然后,如果还剩余一个额外的 8 字节块,则使用第二个参数为 NULL 的 RtlInitializeBitMapEx 将其写入。
最后,如果剩余字节少于 8 个,则使用 RtlFillMemory 逐字节写入,直到整个字符串被复制到目标缓冲区中。
使用 RtlQueryDepthSList 实现的读取原语。适用于 ROP Gadget 搜索、字节比较、钩子检测等场景。这里我演示了一个使用 ROP Gadget 的简单进程注入。RtlQueryDepthSList 只接受一个参数——要读取的内存地址,但它只读取 2 个字节并返回一个 4 字节的值。