首页 > 其他分享 >2788647047_process_packet_4

2788647047_process_packet_4

时间:2024-08-14 14:06:06浏览次数:10  
标签:dns process ip packet 2788647047 DNS query data port

elif protocol == socket.IPPROTO_UDP: # UDP
_ = ip_data[iph_length:iph_length + 4]
if len(_) < 4:
return

src_port, dst_port = struct.unpack("!HH", _)

_ = _last_udp
_last_udp = (sec, src_ip, src_port, dst_ip, dst_port)
if _ == _last_udp: # skip bursts
return

if src_port != 53 and dst_port != 53: # not DNS
if dst_ip in trails:
trail = dst_ip
elif src_ip in trails:
trail = src_ip
else:
trail = None

if trail:
_ = _last_logged_udp
_last_logged_udp = _last_udp
if _ != _last_logged_udp:
if not any(_ in trails[trail][0] for _ in ("malware",)):
log_event((sec, usec, src_ip, src_port, dst_ip, dst_port, PROTO.UDP, TRAIL.IP, trail, trails[trail][0], trails[trail][1]), packet)

else:
dns_data = ip_data[iph_length + 8:]

# Reference: http://www.ccs.neu.edu/home/amislove/teaching/cs4700/fall09/handouts/project1-primer.pdf
if len(dns_data) > 6:
qdcount = struct.unpack("!H", dns_data[4:6])[0]
if qdcount > 0:
offset = 12
query = ""

while len(dns_data) > offset:
length = ord(dns_data[offset:offset + 1])
if not length:
query = query[:-1]
break
query += get_text(dns_data[offset + 1:offset + length + 1]) + '.'
offset += length + 1

query = query.lower()

if not query or re.search(VALID_DNS_NAME_REGEX, query) is None or any(_ in query for _ in (".intranet.",)) or query.split('.')[-1] in IGNORE_DNS_QUERY_SUFFIXES:
return

parts = query.split('.')

if ord(dns_data[2:3]) & 0xfa == 0x00: # standard query (both recursive and non-recursive)
type_, class_ = struct.unpack("!HH", dns_data[offset + 1:offset + 5])

if len(parts) > 2:
if len(parts) > 3 and len(parts[-2]) <= 3:
domain = '.'.join(parts[-3:])
else:
domain = '.'.join(parts[-2:])

if not _check_domain_whitelisted(domain): # e.g. <hash>.hashserver.cs.trendmicro.com
if (sec - (_subdomains_sec or 0)) > HOURLY_SECS:
_subdomains.clear()
_dns_exhausted_domains.clear()
_subdomains_sec = sec

subdomains = _subdomains.get(domain)

if not subdomains:
subdomains = _subdomains[domain] = _set()
subdomains._start = sec

if not re.search(r"\A\d+\-\d+\-\d+\-\d+\Z", parts[0]):
if sec - subdomains._start > 60:
subdomains._start = sec
subdomains.clear()
elif len(subdomains) < DNS_EXHAUSTION_THRESHOLD:
subdomains.add('.'.join(parts[:-2]))
else:
trail = "(%s).%s" % ('.'.join(parts[:-2]), '.'.join(parts[-2:]))
if re.search(r"bl\b", trail) is None: # generic check for DNSBLs
if not any(_ in subdomains for _ in LOCAL_SUBDOMAIN_LOOKUPS): # generic check for local DNS resolutions
log_event((sec, usec, src_ip, src_port, dst_ip, dst_port, PROTO.UDP, TRAIL.DNS, trail, "potential dns exhaustion (suspicious)", "(heuristic)"), packet)
_dns_exhausted_domains.add(domain)

return各行代码功能及函数总体功能

 

 

在函数 `_process_packet` 中,这段代码的功能是处理UDP协议的数据包,并执行一系列的分析和日志记录。这段代码是函数的一部分,用于处理捕获到的单个原始IP层数据包。
代码中的 `elif` 块尝试执行以下操作:
1. **解析UDP头部**:
- `src_port, dst_port = struct.unpack("!HH", ip_data[iph_length:iph_length + 4])`: 使用 `struct.unpack` 函数解析UDP头部,提取源端口和目的端口。
2. **处理UDP包**:
- `_ = _last_udp`: 保存当前UDP包的时间戳和相关信息。
- `_last_udp = (sec, src_ip, src_port, dst_ip, dst_port)`: 更新全局变量 `_last_udp` 为当前UDP包的时间戳和相关信息。
- `if _ == _last_udp: # skip bursts`: 如果当前UDP包与上一次检测到的UDP包相同,则跳过,避免重复检测。
3. **检查是否为DNS查询**:
- `if src_port != 53 and dst_port != 53: # not DNS`: 如果源端口和目的端口都不是53(DNS端口),则继续处理非DNS查询。
- `if dst_ip in trails:`: 如果目标IP地址在轨迹中,则记录事件。
- `elif src_ip in trails:`: 如果源IP地址在轨迹中,则记录事件。
4. **解析DNS查询**:
- `dns_data = ip_data[iph_length + 8:]`: 解析DNS查询数据。
- `if len(dns_data) > 6:`: 如果DNS数据长度大于6字节,则继续解析。
- `qdcount = struct.unpack("!H", dns_data[4:6])[0]`: 解析DNS查询计数。
- `if qdcount > 0:`: 如果查询计数大于0,则继续解析。
5. **提取DNS查询名称**:
- `query = ""`: 初始化查询名称。
- `while len(dns_data) > offset:`: 遍历DNS数据,提取查询名称。
- `query += get_text(dns_data[offset + 1:offset + length + 1]) + '.'`: 添加查询名称。
6. **处理DNS查询名称**:
- `query = query.lower()`: 将查询名称转换为小写。
- `if not query or re.search(VALID_DNS_NAME_REGEX, query) is None or any(_ in query for _ in (".intranet.",)) or query.split('.')[-1] in IGNORE_DNS_QUERY_SUFFIXES:`: 如果查询名称无效,则返回。
7. **解析DNS查询类型和类**:
- `type_, class_ = struct.unpack("!HH", dns_data[offset + 1:offset + 5])`: 解析DNS查询类型和类。
8. **检查子域名**:
- `if len(parts) > 2:`: 如果查询名称的域部分长度大于2,则继续处理。
- `if len(parts) > 3 and len(parts[-2]) <= 3:`: 如果查询名称的域部分长度大于3且最后一个子域名长度小于等于3,则继续处理。
9. **检查域名是否在轨迹中**:
- `if not _check_domain_whitelisted(domain):`: 如果域名不在白名单中,则记录事件。
10. **记录DNS查询事件**:
- `log_event((sec, usec, src_ip, src_port, dst_ip, dst_port, PROTO.UDP, TRAIL.DNS, trail, "potential dns exhaustion (suspicious)", "(heuristic)"), packet)`: 记录DNS查询事件,包括时间戳、源IP、源端口、目标IP、目标端口、协议类型、轨迹类型、轨迹描述和原始数据包。

标签:dns,process,ip,packet,2788647047,DNS,query,data,port
From: https://www.cnblogs.com/JLPeng/p/18358851

相关文章

  • 2788647047_process_packet_5
    \iftype_notin(12,28)andclass_==1:#Typenotin(PTR,AAAA),ClassINifaddr_port(dst_ip,dst_port)intrails:trail=addr_port(dst_ip,dst_port)......
  • 2788647047_6
    elifconfig.USE_HEURISTICS:iford(dns_data[2:3])&0x80:#standardresponseiford(dns_data[3:4])==0x80:#recursionavailable,noerror_=offset+5......
  • 2788647047_process_packet_1
    在函数`_process_packet`中,IPv4和IPv6的处理代码如下:```pythonifip_version==0x04:#IPv4ip_header=struct.unpack("!BBHHHBBH4s4s",ip_data[:20])fragment_offset=ip_header[4]&0x1fffiffragment_offset!=0:returniph_lengt......
  • GUI编程process4
    1、GUI编程(AWT,Swing)图形界面编程元素:窗口,弹窗,面板,文本框,列表框,按钮,图片,监听时间,鼠标,键盘事件,破解工具2、简介Gui的核心技术:Wing和AWT,因为界面不美观,需要jre环境AWT(AbstractWindowToolkit)是‌Java中最早的图形用户界面开发包,而Swing是在AWT的基础上构建的。Swing组件......
  • Android Studio报错: A problem occurred starting process command ,CreateProcess er
    AndroidStudio报错:Aproblemoccurredstartingprocesscommand,CreateProcesserror=2,系统找不到指定的文件一、遇到问题二、解决问题重新下载了22.0.7026061和22.1.7171670只在cmake.dir中修改了路径(ndk.dir中修改了路径[未尝试])clean+SyncProject,OK了!......
  • IO流process3
    1、IO流(JDKAPI1.6.0中文版)I:intput输入O:output输出流:内存与存储设备之间传输数据的通道流的分类:按方向:输入流——将<内存设备>中的内容读入到<内存>中​输出流——将<内存>中的内容读入到<内存内存设备>中按单位:字节流——以字......
  • 聚焦IOC容器刷新环节postProcessBeanFactory(BeanFactory后置处理)专项
    目录一、IOC容器的刷新环节快速回顾二、postProcessBeanFactory源码展示分析(一)模版方法postProcessBeanFactory(二)AnnotationConfigServletWebServerApplicationContext调用父类的postProcessBeanFactory包扫描注解类注册(三)postProcessBeanFactory主要功能三、调用父......
  • yum和rpm安装的Jenkins启动报错"Job for jenkins.service failed because the control
    jenkins卸载方式servicejenkinsstopyumcleanallyum-yremovejenkinsfind/-inamejenkins|xargs-n500rm-rf#文件名称符合name的文件。iname会忽略大小写#xargs命令可以将管道或标准输入(stdin)数据转换成命令行参数,也能够从文件的输出中读取数......
  • FFmpeg存放压缩后的音视频数据的结构体:AVPacket简介
    FFmpeg源码中通过AVPacket存储压缩后的音视频数据。它通常由解复用器(demuxers)输出,然后作为输入传递给解码器,或者从编码器作为输出接收,然后传递给多路复用器(muxers)。对于视频,它通常包含一个压缩帧;对于音频,它可能包含几个压缩帧。编码器允许输出不包含压缩音视频数据、只包含side......
  • 17 模块subprocess、re
    1.subprocess模块1.1概念 subprocess模块启动一个新进程,并连接到它们的输入/输出/错误管道,从而获取返回值简单理解:可以远程连接电脑(socket模块)1.2Popen方法importsubprocessres=subprocess.Popen(['help','ver'],#windows中执行的命令要放在列表里面,命令单词之......