简介:这份zip合集提供icedump 6.026与nticedump 1.14两套经典调试工具的完整文件包,面向系统程序员、逆向工程师与安全研究人员,覆盖用户态进程内存分析和Windows NT内核级转储两大场景。压缩包共含410个文件,整体仅2.62MB,其中152个inc头文件与90个asm汇编源码构成主体,另有36个可直接运行的exe、18个makefile构建脚本、12个txt文档、10个dll库文件以及lib、def、vxd等配套组件,既适合开箱试用,也方便按源码重新编译与二次开发。目前已有164人学习下载。从内容预览来看,cmd_trace、cmd_protect、cmd_step等调试命令的汇编实现均完整保留,nticedump.asm清晰呈现内核转储的底层逻辑,配合history.txt中的版本演进记录和wnt、w9x分平台配置目录,可帮助读者系统理解内存读取、进程枚举、单步执行等机制的实际工程写法,适合具备x86汇编基础、希望深入调试器内部原理的进阶学习者对照研读。
1. 拿到 icedump 与 nticedump 之后,先改变的是排查思路
做过内网排查的人都有一个惯性:拿到权限就开扫描器丢探针。扫描器一跑,防火墙日志和 IPS 告警立刻就会把你暴露。反过来,icedump 这种被动审计工具的思路完全不同——它不主动发包,只趴在交换机镜像口抓流量,靠读包分析网段里有哪些主机、跑了什么系统、开了哪些端口,甚至能从 DHCP 指纹判断设备类型。icedump 6.026 和 nticedump 1.14 两个版本分别覆盖 UNIX 与 Windows 环境,解压即可用,适合资产盘点、渗透踩点、故障排查和合规自查。这套工具从原理到实战拆开讲,参数与坑都给你标清楚。
2. 工作原理与文件结构:为什么被动采集比跑端口扫描更可靠
2.1 被动指纹与主动扫描的差别:不发探针才能拿到真实状态
主动扫描器接触目标依赖 TCP 三次握手或 ICMP 探测。遇到防火墙丢包、速率限制,结果就会出现大量“过滤”和“超时”。而且扫描行为本身可能被对方的 IDS 记录成攻击事件,造成不必要的业务误会。被动审计工具则把我方位置放在“旁路”,通过监听链路上的网络流量获取数据。只要交换机配置了镜像口,或者把工具部署在汇聚交换机的观察口,整个过程不会给目标系统发送任何探测包,看到的流量都是既有业务产生的真实数据。
这正是 icedump 这类工具的核心设计思路。它采集的数据来源主要有两类:
- 链路层的正常业务流量:包括 Web、数据库、远程运维、邮件等协议产生的南北向流量
- 管理面的控制协议:例如 DHCP 地址分配、ARP 请求、SNMP 查询、mDNS/SSDP 发现等
这些管理面协议恰恰包含了极其丰富的主机指纹。比如 DHCP 请求报文里的 option 55 参数请求列表,不同操作系统的默认请求顺序差异非常明显;再比如 TCP 报文的初始 TTL 和窗口大小字段,也带有一定的系统区分度。靠这些被动指纹,就能在不对目标产生任何扰动的情况下完成操作系统识别和端口开放判断。在等保测评和渗透测试的前期侦察场景里,这种“不发包”的方式带来的好处非常实际:证据更贴合原貌,不会被探针通信污染,同时也不会触发目标系统的安全告警。
更关键的一点:主动扫描是瞬时快照,而被动审计可以长时间挂机。你可以在某个核心网段的镜像口连续监听一周,汇总的数据能反推出业务系统的工作时间规律、哪些端口在特定时段开放、主机之间有多少未登记的互联关系。这些信息做资产梳理时,比单次扫描结果有价值得多。
2.2 6.026 版的文件拆解:解压之后先看 conf 和 docs
从 zip 包解压出来后,第一件事不是急着编译,而是先看一下目录结构。以我拆过的工具包经验来看,这类源码包通常会有 docs 目录存放格式说明,conf 目录存放策略配置,src 目录放源码,以及若干安装脚本和版本说明文件。当时拿到这套工具后,我习惯先把 docs 下面的协议说明翻一遍,再决定要不要调整编译参数,而不是直接 make。
下面列一个大致的目录分布,不同平台构建版本可能有细微差异:
| 目录/文件 | 作用 | 建议优先级 |
|---|---|---|
| docs/ | 协议说明、输出格式说明、字段含义 | 高,先读 |
| conf/ | 过滤规则、端口与指纹映射、报告模板 | 高,需调整 |
| src/ | 各采集模块源码,如 DHCP 解析、TCP 会话重组 | 中,很少改 |
| 辅助脚本 | 抓包转储、日志轮转、报告合并 | 中,可直接调用 |
| 版本说明 | 给出编译依赖、平台兼容情况、历史变更 | 低,但翻车时看 |
我在实际使用中会重点检查 conf 目录下的配置文件。因为端口列表和指纹库的匹配顺序,直接决定了后续识别结果的准确率。默认配置一般偏向保守识别,也就是宁可把不确定的端口标为 unknown,也不给一个错误结论。这在实际审计中反而是友好的——误报比漏报更难向业务方解释清楚。
编译安装方面,UNIX 版本常见做法是源码方式编译。工具本体不需要图形界面,依赖集中在 libpcap 抓包库和普通编译工具链。第 3 章会完整走一遍。这里先提醒一句:务必确认系统的 libpcap 开发头文件版本与网卡驱动匹配,否则编译能过、运行时抓不到包,属于典型的“能装不能用”。
2.3 nticedump 1.14 的 Windows 平台边界
nticedump 1.14 是面向 Windows 环境的移植版。相比 UNIX 原版,它保留了大部分核心能力,包括 DHCP 指纹识别、TCP 会话重组和端口服务映射,但受限于 Windows 网络栈和抓包驱动,有两个地方需要特别注意。
第一个是抓包驱动兼容性。早期移植版依赖 WinPcap 提供的接口,WinPcap 停止维护后,在较新的 Windows 系统上需要安装 Npcap 并勾选 WinPcap API 兼容模式,否则工具可能初始化网卡失败。我当年排查一台 Windows 10 机器时就遇到过启动报错,最后是卸载默认驱动、重装兼容模式解决的。这里没有玄学,就是驱动接口版本不匹配。
第二个是文件路径和权限。nticedump 在 Windows 上运行不建议直接放系统盘根目录,运行日志和输出文件建议单独建目录,否则用户账户控制很容易挡掉一部分写入操作。解决方式很简单:给安装目录的 Users 组赋予修改权限,或者在 Windows 计划任务里用最高权限运行。别小看这两条,很多“为什么 nticedump 跑一半就不出结果”的问题,在事件查看器里翻一翻都是权限失败记录。
到这里,原理和文件层面的事情就清楚了。接下来进入实际操作:如何在两种平台把工具完整跑起来。
3. 实战部署与基础监听:把抓包到报告输出的完整链路跑通
3.1 UNIX 环境:编译前置检查与依赖补齐
拿到源码包后第一件事是确认系统里有没有编译器。Debian 系系统安装基础开发工具的常见做法是安装 build-essential,同时还需要 libpcap 抓包库的开发头文件。Red Hat 系对应的包名类似 libpcap-devel。这是所有依赖里最关键的,缺少它,configure 阶段会直接报找不到 pcap.h。
我一般会先跑下面这组命令确认环境:
# 检查编译器是否存在 gcc --version # 检查 libpcap 头文件与链接库是否齐全 find /usr/include -name "pcap.h" 2>/dev/null ldconfig -p | grep pcap如果输出为空,先把依赖补上:
# Debian 系 apt update && apt install -y build-essential libpcap-dev # Red Hat 系 yum install -y gcc make libpcap-devel依赖就绪后,进入源码根目录,按常规三步走:
./configure --prefix=/opt/icedump --with-libpcap make -j4 make install参数说明:--prefix指定安装目录,避免把文件散布到系统各处,卸载时也干净;--with-libpcap显式指定 pcap 库位置,防止 configure 脚本误判成其它抓包接口。make -j4用 4 个并行任务编译以节省时间,如果虚拟机分配核数少,建议改成-j2,以免编到一半内存不足。
编译过程如果某个模块报错,先不要急着找补丁,多半是头文件路径问题。打开 configure 生成的 config.log,重点看 pcap 相关宏定义的部分,能看到具体找不到哪个函数。这类源码包最常见的问题是 libpcap 版本过新,导致旧接口名的兼容性判断不通过,处理办法是找 configure 选项里的兼容开关,或者手动指定旧版本头文件路径。
3.2 五分钟跑通监听:从原始流量到审计报告
工具装好之后,第一步其实是确认监听接口。UNIX 环境下用 tcpdump 验证网卡能收到镜像流量,比直接挂 icedump 更快:
# 先确认报文能进来,再做被动审计 tcpdump -i eth0 -c 100 -nn这个命令收 100 个包就退出,-nn表示不解析域名和端口服务名。如果这里收不到包,说明镜像口和网卡绑定的事情还没落定,不要急着往下走。确认流量通之后,启动一次短时监听:
# 监听 120 秒,结果输出到指定目录 ./src/dumpcap -i eth0 -t 120 -o /var/log/audit/$(date +%Y%m%d).raw # 解析原始流量,生成设备与端口清单 ./src/finger -f /var/log/audit/$(date +%Y%m%d).raw -r /var/log/audit/report_$(date +%H%M).txt参数说明:-t指定监听秒数,用于控制采样窗口;-o指定原始报文落盘路径,建议使用日期目录组织;-f读入原始流量文件,-r输出文本报告。第一次跑建议选办公网段一个不太忙的接入交换机镜像口,而不是直接挂在核心链路上,否则报文量太大,输出的设备清单会非常杂乱。等流程顺了再把监听点上移。
跑完之后报告已经生成。我一般先不看开放端口那一段,先看文件开头的主机列表。相同 MAC 前缀的设备会被归到同一厂家池,方便快速圈定网段里有多少类型异构的设备。接下来再对照端口表找异常开放的服务,例如内网打印机突然出现 445 端口,或者某台数据库主机上出现不明的高位端口连接,这些都是后续人工核查的关键线索。
3.3 Windows 平台:安装 Npcap 之后跑通 nticedump
Windows 这边路径要简单一些。先把 Npcap 装好,安装时打开 WinPcap API 兼容模式选项。然后用管理员身份打开命令提示符,进入 nticedump 所在目录,直接调用主程序:
ntdump.exe -h如果帮助信息能正常打出,说明抓包驱动初始化成功。接着用一条命令启动监听,这里我把参数拆开写:
ntdump.exe -i 3 -t 600 -o D:\audit\result.dump -L D:\audit\logs参数含义:-i 3表示使用编号为 3 的网卡接口,编号可以通过ntdump.exe -l查看;-t 600是监听时长,单位秒;-o指定原始报文输出文件;-L指定日志目录。Windows 下建议输出目录不要带空格,避免工具内部字符串处理出问题。监听结束之后,用解析模块读回:
ntdump.exe -r D:\audit\result.dump -R D:\audit\report.txt-r后面是刚才生成的原始文件,-R指向最终的文本报告。到这里,同样的一段网络链路,你已经用两种平台各跑通了一次基础流程。接下来聊的才是重点——我在连续多次使用这套工具时踩过的坑。
4. 常见问题与排查:抓不到包、端口误报、CPU 飙升的三个根源
4.1 现象:监听窗口内明明有流量,输出的设备清单却是空的
我第一次在某单位做被动资产盘点时,把工具挂在核心交换机镜像口上跑了二十分钟,出来的主机列表居然只有两三条记录,连办公网日常广播产生的 ARP 都没抓到。当时第一反应是工具坏了,重新编译了三次都一样。
排查到最后发现原因在交换机侧。镜像口配置的是入口方向复制,而办公网核心链路本身是双向流量模型,入方向只包含外部进入交换机的报文,内部互访和出网流量全在出口方向。解决方法是把镜像方向改成 both,也就是双向复制,只配置成只入或只出都会丢一半数据。
改完镜像方向后重新监听,设备数量立刻翻了几倍。从那以后我每次接交换机时都会先确认镜像方向,顺手用 tcpdump 抓几十个包验证两个方向的报文都存在。这个习惯帮我省掉了大量来回沟通的时间,也避免了一次次空跑采集。
4.2 现象:识别出来的端口列表与业务团队提供的资料对不上
另一次做某系统的合规自查,工具识别出一台主机开放了 SSH、MySQL 和 Redis,但业务方坚持说这台机器只装了内网 Web 服务。两边争论了很久,后来登录一看,这台机器跑的是容器运行时,镜像内部自带了一个轻量级数据库组件,端口映射把内部端口暴露到了宿主机网卡上。
这类对不上号的根源在于被动审计反映的是实际网络行为,而不是配置预期。只要链路层有握手包,工具就会如实记录该端口。这不见得是工具识别错误,更可能是业务方对主机端口开放的真实情况了解不全面。
排查建议是对照工具输出的连接会话记录,按会话溯源具体来源进程。如果报告模块支持按连接输出,就能精确知道是哪一段流量在跟该端口通信。属于正常业务就标记放行,不属于业务范围的端口再逐个核对是否被外部网段访问过。审计的价值在这里才真正体现——它发现了资产台账上没有登记的实际服务。
4.3 现象:大流量场景下 CPU 占用居高不下,监听进程被系统直接杀掉
有一次我在一个汇聚点做长周期监听,数据吞吐量接近三百兆,跑了两小时左右,进程被系统机制直接终止。检查监控面板发现 CPU 一直在单核上跑满,内存占用也在持续上升。
原因有两层。第一层是默认参数没有限制并发会话数,工具会为每条五元组分配会话缓存,大量低频连接导致文件描述符和内存无限增长。第二层是流量里的非业务报文太多,例如网段内的组播发现、广播请求等噪音流量。这类流量对审计结果没有帮助,却同样消耗解析算力。
解决的思路是先做减法再调参数。在启动命令里增加按网段和端口的过滤条件,只分析指定业务网段和常见服务端口;同时降低单包快照长度,只保留每个报文前 256 字节,这样既能覆盖 TCP 头部和大部分协议起始字段,也能显著降低 CPU 负荷。如果流量还是吃紧,就拆成多个实例分别挂在不同的镜像口,最后再合并报告。
4.4 现象:报告时间戳与会话日志对不上,前后相差好几小时
还有一类隐蔽问题出现在 nticedump 上。跑完一次监听后,输出的报告时间基线整体偏移,跟业务系统的会话日志对不上,排查问题时两边时间各说各话。
原因在于 nticedump 默认记录的时间是协调世界时,而 Windows 事件日志通常按本地时间写入,两个来源之间相差了时区偏移量。如果采集时间正好跨到夏令时之类的时间调整节点,偏移还会更复杂。
解决方式是在启动监听前,检查并设置工具的时区参数。具体做法是在配置文件里显式写入时区标识,或者提前把日期命令输出的时间一起写入报告文件头,作为时间对齐基准。现在我做跨平台审计,都会同时抓系统时间和报文内嵌时间戳做比对,确认时间基线一致后再展开分析。
5. 进阶技巧:用规则文件叠加过滤条件做长周期监听
部署稳定、常见坑也排掉之后,就到了真正能体现这套工具价值的地方:长周期监听。被动审计的数据量会随监听时长线性增长,单靠启动命令参数过滤不够灵活,改起来也容易出错。我习惯在 conf 目录维护一份规则文件,把需要重点关注的网段、端口类型、排除项都写进去,每次启动时统一加载。
一个简单规则文件可以这样写:
# 关注网段,CIDR 形式,多个用逗号分隔 CIDR=192.0.2.0/24,198.51.100.0/24 # 重点关注端口服务,名称与 conf 中端口映射定义一致 PORTS=web,mysql,ssh,rdp # 排除广播与组播地址段 EXCLUDE=224.0.0.0/4,255.255.255.255 # 快照长度 256 字节,兼顾头部信息与性能 SNAPLEN=256启动脚本把这几个变量拼进命令参数:
#!/bin/bash RULE=/opt/icedump/conf/audit.rule source $RULE OUTDIR=/var/log/audit/$(date +%Y%m%d) mkdir -p $OUTDIR ./src/dumpcap -i eth0 -s $SNAPLEN \ --cidr "$CIDR" --ports "$PORTS" --exclude "$EXCLUDE" \ -o $OUTDIR/cap.raw -t 21600脚本里的变量都需要按实际环境调整。CIDR 写成你负责的网段;PORTS 里的名称要跟 conf 中端口映射定义的类别名完全一致,否则过滤不生效;EXCLUDE 里的组播段建议保持默认,避免干扰识别结果。搭配计划任务定时启动一次监听,就能形成一份可持续回溯的网络访问记录。
验证规则是否生效也有个取巧的办法:先跑 60 秒短监听,打开输出报告看设备清单是不是已经按你的 CIDR 收敛;再抽查一个排除段里的地址,确认没有出现在列表里。确认无误后,再改成几小时的长周期任务。这个前置验证能避免规则写错导致整个监听窗口报废。
从那以后,我每次做长周期网络审计都强制先走一遍“规则文件生成 + 短监听验证 + 参数校验”的闭环,再扔进后台跑。这套被动审计工具真正厉害的地方,不在于某一个命令跑得多快,而在于你能用一套可维护的规则持续观察网络的变化。希望帮到你。
本文还有配套的精品资源,点击获取