CuckooSanbox自定义规则 - self.mark_ioc() 、self.mark()用法

本文介绍了一个Cuckoo沙箱中的签名示例,该签名用于检测文件写入行为。通过`NtWriteFile`等API调用来判断是否访问或创建了特定文件,并使用`mark_ioc`和`mark`函数来标记这些行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

签名如下:

from lib.cuckoo.common.abstracts import Signature
class TestWriteFile(Signature):
    name = "test_write_file"
    description = "test file api calls"
    severity = 40
    categories = ["test"]
    authors = ["Danyang.Wang"]
    minimum = "2.0"

    filter_apinames = set(["NtWriteFile","NtOpenFile","NtCreateFile"])

    def on_call(self, call, process):
        if call["api"] in ["NtOpenFile","NtCreateFile"] and call["status"]:
            if "1.txt" in call["arguments"]["filepath"]:
                self.mark_ioc("file222",call["arguments"]["filepath"])
        elif call["api"] == "NtWriteFile" and call["status"]:
            self.mark(buffer_test=call["arguments"]["buffer"],test=123456)

    def on_complete(self):
        return self.has_marks()

看图说话,命中规则后,沙箱报告显示如下:

这里写图片描述
可以看到这俩函数其实没啥区别,mark_ioc每次只能标记一项显示

self.mark_ioc("file_name","1.txt") 

self.mark可以同时显示多个数据在一项,而且传参方式不同,注意,这里file_name,不能用字符串表示了

self.mark(file_name="1.txt",file_size=1024)
上述代码片段展示了如何通过 `ioctl` 系统调用与 Linux 下的 SPI 设备进行通信。下面我们逐步解析这段代码的功能和含义: ### **结构体 spi_ioc_transfer 的作用** ```c struct spi_ioc_transfer transfer_rx = { .tx_buf = (uintptr_t)spi_tx, .rx_buf = (uintptr_t)spi_rx, .len = 4, .speed_hz = speed, .bits_per_word = bits, .delay_usecs = 20, }; ``` 1. 这里定义了一个名为 `transfer_rx` 的 `struct spi_ioc_transfer` 类型变量。 - `.tx_buf`: 表示发送缓冲区的地址 `(uintptr_t)` 强制转换是为了将指针类型转成无符号整数类型(适合传递给内核空间)。 - `.rx_buf`: 接收数据存储的位置,同样使用了强制类型转换处理。 - `.len`: 指定了传输的数据长度为 4 字节。 - `.speed_hz`: 定义本次SPI通信的速度(单位Hz),其值由变量 `speed` 决定。 - `.bits_per_word`: 设置每个字包含多少位,默认通常设置为8(即一字节)。 - `.delay_usecs`: 规定每次消息之间延时的时间微秒数。 ### **ioctl 调用的作用** ```c if(ioctl(fd, SPI_IOC_MESSAGE(1), &transfer_rx) < 0) { printf("transfer_rx failed! \n"); return -1; } ``` 这里的核心操作是对文件描述符 `fd` 使用 `ioctl` 命令来进行设备控制: - 第一参数 `fd`: 文件描述符,通常是打开 `/dev/spidevX.Y` 后返回的结果; - 第二参数 `SPI_IOC_MESSAGE(1)`: 此宏指定我们要向 SPI 驱动程序发送一组转移请求命令,并且该组含有单条消息。 - 第三参数 `&transfer_rx`: 将我们配置好的 `spi_ioc_transfer` 结构体传入到驱动层中用于实际的 SPI 数据交换过程。 如果发生错误,则打印 `"transfer_rx failed!"` 并返回 `-1` 标识失败退出函数流程。 ### 打印接收内容 ```c printf_buff(spi_rx, 4, "spi_rx"); ``` 此行假设有这样一个辅助功能可以展示接收到的内容方便调试检查结果是否正确。 --- #### **总结** 以上代码的主要目的是利用Linux下的标准API完成一次简单的全双工模式下对某特定外设的同步读写交互,它结合硬件特性实现了底层协议级别的直接操控能力,在嵌入式系统开发领域非常常见。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值