GKLBB

当你经历了暴风雨,你也就成为了暴风雨

导航

软件神器 --- 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 抓底层
        → 确认数据是否原样传给打印机
        → 还是经过了二次处理

这个链路走完,云电脑虚拟打印重定向的完整实现方式就清楚了。

posted on 2026-09-25 06:06  GKLBB  阅读(3)  评论(0)    收藏  举报