软件神器 --- API监控工具 之 API Monitor
用 API Monitor v1.5 抓取打印流量完整实战指南
一、核心思路梳理
text
你真正想搞清楚的问题:
云Windows → 虚拟打印驱动 → 网络隧道 → 本地USB打印机
↑
这一段怎么实现的?
API Monitor 正好能看这里
二、环境准备
安装确认清单
text
□ API Monitor v1.5 (32位+64位都装)
□ 打印机驱动已安装
□ 确认打印机在设备列表可见
□ 准备一个测试文档 (test.txt 最简单)
关键判断:用32位还是64位
text
spoolsv.exe → 64位进程
所以必须用:apimonitor-x64.exe 去附加它
三、操作步骤详解
Step 1:启动 API Monitor(64位)
text
以管理员身份运行
apimonitor-x64.exe
↑
必须管理员,否则无法附加 spoolsv.exe
Step 2:加载 API 过滤器
左侧面板 → Api Filter
展开路径:
text
Win32 API
└── Windows Print Spooler Service
└── winspool.drv ← 全部勾选
再额外勾选:
text
Win32 API
└── File Management
└── kernel32.dll
├── CreateFileW
├── WriteFile
└── DeviceIoControl
Step 3:附加 spoolsv.exe
text
菜单栏 → File → Monitor New Process
或
菜单栏 → Edit → Attach to Process
找到:
spoolsv.exe
PID: xxxx
→ 点 OK
⚠️ 注意:spoolsv.exe 是系统服务,附加后它会继续运行,不会暂停
Step 4:执行打印触发
text
打开记事本
输入:Hello Printer Test
Ctrl+P → 打印 → 确定
Step 5:观察 API Monitor 输出
此时你应该看到调用序列:
text
序号 时间 进程 API调用
─────────────────────────────────────────────────────
001 00:00.001 spoolsv.exe OpenPrinterW("HP LaserJet", ...)
002 00:00.003 spoolsv.exe StartDocPrinterW(hPrinter, 1, &di)
003 00:00.005 spoolsv.exe StartPagePrinter(hPrinter)
004 00:00.008 spoolsv.exe WritePrinter(hPrinter, pBuf, 4096, &written)
005 00:00.012 spoolsv.exe WritePrinter(hPrinter, pBuf, 8192, &written)
... ... ... WritePrinter × N次
00N 00:00.xxx spoolsv.exe EndPagePrinter(hPrinter)
00N 00:00.xxx spoolsv.exe EndDocPrinter(hPrinter)
00N 00:00.xxx spoolsv.exe ClosePrinter(hPrinter)
四、WritePrinter 数据解读(最关键)
双击任意一条 WritePrinter 记录:
参数面板显示:
text
参数名 值
──────────────────────────────
hPrinter 0x00000A4C ← 打印机句柄
pBuf 0x12AB3400 ← 数据缓冲区地址
cbBuf 4096 ← 本次发送字节数
pcWritten 4096 ← 实际写入字节数
Buffer 内容(点击地址查看):
text
HEX视图:
1B 45 0A 1B 26 6C 00 4F 1B 26 6C 32 41 1B 2A 70
...
ASCII视图:
.E...&l.O...&l2A..*p
识别打印语言:
text
开头特征 打印语言 说明
───────────────────────────────────────────
1B 45 PCL ESC E = Reset
1B 25 2D 31 32 PCL 通用
%!PS-Adobe PostScript 文本可读
<?xml XPS 现代驱动
五、针对云电脑场景的专项分析
你的场景:
text
云Windows (远端)
│
│ RDP/私有协议
│
本地客户端进程 (安卓/Windows)
│
│ 虚拟打印重定向
│
USB打印机
重点监控的进程(不是spoolsv):
text
找到本地客户端软件的进程名
例如:
CTXPrint.exe ← Citrix
RDPPrint.exe ← RDP
云电脑厂商.exe ← 你要找的目标
用 Process Monitor 先定位:
text
Procmon.exe
过滤条件:
Operation = WriteFile
Path contains = spool
→ 看是哪个进程在写打印数据
然后用 API Monitor 附加那个进程:
text
重点关注:
WriteFile(hFile, buffer, size, ...)
DeviceIoControl(...)
NtDeviceIoControlFile(...)
六、SPL 文件辅助分析
打印触发后立即去看:
text
路径:
C:\Windows\System32\spool\PRINTERS\
文件:
00001.SPL ← 打印数据
00001.SHD ← 打印任务头信息
用工具打开 SPL 文件:
text
如果是 EMF 格式:
→ 用 EMF 查看器打开,能看到矢量图形
如果是 RAW 格式:
→ 直接用十六进制编辑器
→ 看开头判断是 PCL/PS/XPS
七、组合工具完整抓取链
text
目标层级 工具 抓到什么
──────────────────────────────────────────────────────────
应用层API调用 API Monitor StartDoc/WritePrinter调用时机
打印任务文件 Process Monitor 哪个进程创建了SPL文件
数据内容 SPL文件 + HEX编辑器 PCL/PS原始数据
网络传输 Wireshark tcp.port==9100 的TCP流
USB传输 USBPcap + Wireshark USB Bulk OUT传输
Wireshark 过滤(网络打印机):
text
过滤表达式:
tcp.port == 9100
找到TCP流后:
右键 → Follow → TCP Stream
→ 能看到完整打印语言数据
USBPcap(USB打印机):
text
安装 USBPcap
Wireshark 过滤:
usb.transfer_type == 0x03 ← Bulk Transfer
usb.endpoint_address.direction == 0 ← OUT方向
Payload 就是打印数据
八、常见问题排查
text
问题 原因 解决
──────────────────────────────────────────────────────────────
附加spoolsv失败 权限不足 以管理员运行API Monitor
没有看到WritePrinter 加载了32位监控64位进程 换apimonitor-x64.exe
Buffer内容显示为空 API定义未加载 确认winspool.drv已勾选
打印完了才看到调用 实时显示延迟 正常现象,完成后分析
云电脑进程找不到 进程名不确定 先用Procmon定位
九、你的下一步行动建议
text
第一步:用 Procmon 确认
→ 找到云电脑软件哪个进程在操作打印
第二步:用 API Monitor 附加那个进程
→ 看它调用了哪些打印API
第三步:看 WritePrinter 的 Buffer
→ 确认数据格式(PCL?PS?RAW?)
第四步:Wireshark/USBPcap 抓底层
→ 确认数据是否原样传给打印机
→ 还是经过了二次处理
这个链路走完,云电脑虚拟打印重定向的完整实现方式就清楚了。
免责声明
本文档所有内容仅供安全研究、学术交流与技术学习使用,严禁用于任何未经授权的逆向破解、网络攻击、隐私窃取、恶意软件开发及其他违反《中华人民共和国网络安全法》《数据安全法》等法律法规的行为,使用者应确保已获得目标软件权利人的合法授权并自行承担因使用本文档内容所产生的一切法律责任与后果,作者不对任何直接或间接损害承担任何责任,继续阅读即视为您已知悉并同意上述全部条款。
浙公网安备 33010602011771号