python - 在 Python2.6+ 中为 Solaris 创建 netstat 的实现
问题描述
我正在 python 中编写一个集合脚本,以使用 Python 2 脚本从各种 *nix 主机中获取取证工件,但是我在为 Solaris 编写 netstat 集合时遇到了一些问题。
我如何实现这一目标有一些限制。我无法在计算机上使用 ELF 二进制文件(Python 除外)(因为它们经常在 *nix 机器受到攻击时被操纵),我无法导入外部库(因为这不会在我管理的计算机上运行),并且必须编写出于向后兼容性的原因,在 Python 2 中。
话虽如此,我使用 Illumos 的 netstat.c 文档(一个开源 Solaris 实现)作为我的基础,并且基本上试图对其进行逆向工程并在 Python 2 中重写它。
https://searchcode.com/codesearch/raw/52916131/
到目前为止,我发现脚本会打开“/dev/arp”和“/dev/kstat”以确保有返回值。
import os
sd = os.open('/dev/arp', os.O_RDWR)
kc = os.open('/dev/kstat', os.O_RDWR)
完成此操作后,“sd”值用于通过 mibget() 方法收集网络统计信息。
这就是问题所在。为了收集 netstat 信息,Solarissd
使用 syscall进行查询getmsg
,但它使用的是我不熟悉的数据结构。
getcode = getmsg(sd, &ctlbuf, (struct strbuf *)0, &flags);
我不知道如何在 Python 2 中重建它,你们中的任何人对我可以从这里去哪里有任何想法吗?我解释错了吗?
我知道psutil
netstat 的实现在 Solaris 上工作,所以必须有一种方法来完成这个。
谢谢大家的帮助。
编辑:
这似乎是以下相关部分truss netstat
:
open("/etc/default/inet_type", O_RDONLY) Err#2 ENOENT
open("/dev/arp", O_RDWR) = 3
ioctl(3, I_PUSH, "tcp") = 0
ioctl(3, I_PUSH, "udp") = 0
ioctl(3, I_PUSH, "icmp") = 0
putmsg(3, 0x08047E3C, 0x00000000, 0) = 0
getmsg(3, 0x08047E3C, 0x00000000, 0x08047E5C) = 2
getmsg(3, 0x00000000, 0x08047E48, 0x08047E5C) = 0
getmsg(3, 0x08047E3C, 0x00000000, 0x08047E5C) = 2
getmsg(3, 0x00000000, 0x08047E48, 0x08047E5C) = 0
getmsg(3, 0x08047E3C, 0x00000000, 0x08047E5C) = 2
getmsg(3, 0x00000000, 0x08047E48, 0x08047E5C) = 0
getmsg(3, 0x08047E3C, 0x00000000, 0x08047E5C) = 2
getmsg(3, 0x00000000, 0x08047E48, 0x08047E5C) = 0
getmsg(3, 0x08047E3C, 0x00000000, 0x08047E5C) = 2
getmsg(3, 0x00000000, 0x08047E48, 0x08047E5C) = 0
getmsg(3, 0x08047E3C, 0x00000000, 0x08047E5C) = 2
brk(0x080736E0) = 0
解决方案
getmsg()
并由POSIX 指定,尽管在 POSIX 7 中标记为struct strbuf
过时:
姓名
getmsg, getpmsg - 从 STREAMS 文件 (STREAMS) 接收下一条消息
概要
[OB XSR] [Option Start] #include <stropts.h> int getmsg(int fildes, struct strbuf *restrict ctlptr, struct strbuf *restrict dataptr, int *restrict flagsp); int getpmsg(int fildes, struct strbuf *restrict ctlptr, struct strbuf *restrict dataptr, int *restrict bandp, int *restrict flagsp); [Option End]
描述
该
getmsg()
函数应检索位于与 STREAMS 文件关联的 STREAM 头读取队列头部的消息内容,并将内容放入一个或多个缓冲区。消息包含数据部分、控制部分或两者。消息的数据和控制部分应放置在单独的缓冲区中,如下所述。每个部分的语义由消息的发起者定义。...
我不知道 Solaris 上 STREAMS 的任何 Python 绑定。
STREAMS 功能从未在 Linux 上实现。
推荐阅读
- python - 如何在将烧瓶应用程序连接到数据库的过程中获取密钥
- amazon-web-services - 我已经为 .Net 项目创建了 aws 代码构建,它工作正常但没有生成任何输出,如何获得此代码构建的输出?
- api - 如何使用 VersionOne API 编写查询以返回 Epic 下记录的所有小时数(实际值)?
- c# - 什么会导致 WinForms richTextBox.DataBindings.Add() 抛出空引用异常?
- scala - 如何在 scala 2.13+ 中找到 Seq 的最小值
- react-native - 如何在 Text 标签中显示 this.state 值?
- javascript - 如何从角度服务对 propublica.org 进行 Web api 调用
- c++ - 用于关联容器的 C++ 入门 5ed equal_range
- php - 如何将数组放入mysql数据库?
- nginx - nginx 将 websocket API 数据视为 http 请求