Idle Scanning(空闲扫描)过程简述

本文解析了IDESCANNING技术中的僵尸主机攻击过程,通过三个步骤详细说明了攻击者如何利用IP欺骗和IPID变化来探测目标主机的端口状态。了解如何通过IPID增量判断端口是否开放,适用于网络安全分析。

Idle scanning的原理可以通过下面的图简单理解:

Pirate攻击者
Cible其他主机/受害者
Zombie被扫描的主机

在这里插入图片描述

Step 1

攻击者向Zombie发送SYN/ACK的包, 这时Zombie返回RST, IPID=x

Step 2

攻击者向其他主机发送SYN, 并通过IP欺骗的方法, 将IP设置为zombie的IP.
cible接受到包以后, 会向zombie发送SYN/ACK, 而zombie会回复cible, 这时IPID=x+1

Step 3

攻击者重新第一步的动作, 向zombie发送SYN/ACK, 比较这时候返回的IPID和第一步的IPID的值的变化

IPID的变化结论
增加了2端口开放
无变化端口关闭

注意: 这只是在理想情况下的分析, 即只有这三台主机之间通信, zombie没有回应过除pirate和cible之外的其他主机. 实际情况会更加复杂.

### 串口 IDLE 空闲中断配合 DMA 数据接收实现方法 在串口通信中,使用 IDLE 空闲中断与 DMA 配合可以高效地实现不定长数据的接收。这种方法能够减少 CPU 的干预,提高系统的实时性和资源利用率。以下是其实现方法的详细说明: #### 1. 配置串口和空闲中断 首先需要配置串口的基本参数,包括波特率、数据位、停止位等。同时,启用串口的空闲中断功能(IDLE Interrupt)。当串口检测到一段时间内没有接收到任何数据时,会触发 IDLE 中断,表明一帧数据已经接收完成。 ```c // 使能串口IDLE中断 USART_ITConfig(USARTx, USART_IT_IDLE, ENABLE); ``` 此操作允许系统在检测到空闲状态时产生中断[^2]。 #### 2. 配置 DMA 控制器 接下来配置 DMA 控制器以支持串口的数据传输。DMA(Direct Memory Access)可以直接将数据从串口的寄存器搬运到内存数组中,无需 CPU 的参与。 - 设置 DMA 的传输方向为外设到内存。 - 配置 DMA 的数据宽度与串口一致。 - 指定接收缓冲区的地址以及初始传输长度。 ```c // 配置DMA接收参数 DMA_InitTypeDef DMA_InitStruct; DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)&(USARTx->DR); // 外设地址 DMA_InitStruct.DMA_Memory0BaseAddr = (uint32_t)rxBuffer; // 内存地址 DMA_InitStruct.DMA_DIR = DMA_DIR_Peripheral_TO_Memory; // 数据传输方向 DMA_InitStruct.DMA_BufferSize = RX_BUFFER_SIZE; // 接收缓冲区大小 DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable; // 外设地址不递增 DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable; // 内存地址递增 DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; DMA_InitStruct.DMA_Mode = DMA_Mode_Normal; // 正常模式 DMA_InitStruct.DMA_Priority = DMA_Priority_High; // 高优先级 DMA_InitStruct.DMA_FIFOMode = DMA_FIFOMode_Disable; // 禁用FIFO DMA_Init(DMAx_Channely, &DMA_InitStruct); // 使能DMA通道 DMA_Cmd(DMAx_Channely, ENABLE); ``` 上述代码配置了 DMA 用于串口接收,并初始化了相关的参数[^1]。 #### 3. 处理 IDLE 中断 当 IDLE 中断触发时,表示当前帧的数据接收已完成。此时需要关闭 DMA 通道,记录已接收到的数据长度,并重新配置 DMA 的缓冲区大小以便接收下一帧数据。 ```c void USARTx_IRQHandler(void) { if (USART_GetITStatus(USARTx, USART_IT_IDLE) != RESET) { // 清除IDLE中断标志位 USART_ClearITPendingBit(USARTx, USART_IT_IDLE); // 停止DMA传输 DMA_Cmd(DMAx_Channely, DISABLE); // 获取已接收数据的长度 uint16_t receivedLength = RX_BUFFER_SIZE - DMA_GetCurrDataCounter(DMAx_Channely); // 记录接收到的数据 ProcessReceivedData(rxBuffer, receivedLength); // 重新配置DMA接收缓冲区 DMA_SetCurrDataCounter(DMAx_Channely, RX_BUFFER_SIZE); // 重新使能DMA通道 DMA_Cmd(DMAx_Channely, ENABLE); } } ``` 通过上述代码,在 IDLE 中断处理函数中完成了对当前帧数据的处理,并重新准备接收下一帧数据[^3]。 #### 4. 注意事项 - 确保接收缓冲区的大小足够大以避免数据溢出。 - 在多任务环境中,需考虑任务间的同步问题,确保数据不会被其他任务覆盖。 - 如果使用 STM32CubeMX 工具生成代码框架,则可以通过修改 HAL 库中的回调函数来实现类似的功能。 ```c void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) { if (huart->Instance == USARTx) { ProcessReceivedData(rxBuffer, Size); HAL_UARTEx_ReceiveToIdle_DMA(huart, rxBuffer, RX_BUFFER_SIZE); } } ``` 上述代码展示了基于 HAL 库的实现方式,适合使用 STM32CubeMX 的开发者[^2]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Charonmomo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值