拦截发送到打印机的数据

时间:2013-11-18 06:38:02

标签: printing

这是从基于Windows的POS应用程序发送到我希望监控和分析的收据打印机的数据。我无法控制POS应用程序(品牌可能会有所不同,也没有源代码),因此最好的方法是通过在POS和打印机之间内联硬件设备来拦截打印数据。

我做了一些阅读,似乎大多数收据打印机接受ESC / POS命令集。这是否意味着POS实际上发送了ESC / POS命令,例如'PrintNormal xyz'?

但我也读过“发送到ESC / POS打印机的数据是嵌入了ESC / POS命令的光栅数据”(参见Intercepting data sent to a Windows printer (using RedMon)),是否可读?现在我不确定如何在不知道数据格式的情况下解决这个问题。

有人可以确认吗?

感谢。

1 个答案:

答案 0 :(得分:0)

免责声明::所提出问题的合法性,因此,此问题以及任何其他答案均受该问题中未披露的许可条款的约束。使用后果自负。不要怪我。

我要回答有关赏金文字的问题:

  

该问题广泛适用于广大受众。需要详细的规范答案才能解决所有问题。

由于我不确定用于拦截特定打印机协议的受众有多大,因此我将其解释为赏金仅通过以下方式(尚未确定)基于总线(尚未确定)寻求对主从协议进行逆向工程的答案硬件水龙头。

硬件:首先,确定总线。我最好的猜测是您正在处理USB或并行,但可能是9针串行或专有的。无论如何,请获取有关硬件级别通信协议的文档,并构建一个简单的硬件设备来读取数据并将其镜像到其他地方。这既可以是一键点击记录设置,即简单地以观察者的身份静默记录数据(许多示波器中提供了此功能),也可以是MITM数据包级的接收记录-发送循环,该循环模仿从机的一端和主人在另一边。我更喜欢后者,因为您可以更好地保证所截获数据的完整性,并具有将测试作业传输到从设备以测试对协议理解的能力。以更复杂/昂贵的拦截器设计为代价。

由于最初的问题似乎是针对更高级别的协议的,因此我将关注这部分。如果您需要更多建议,请发表评论。

软件:假设您现在具有硬件级别的点击,则可以执行打印作业并检查记录的通信。我不希望花费太多精力来混淆数据格式。在这种状态下,您应该能够自行判断数据/通信所采用的格式以及所使用的特定命令。如果您看到的数据与预期格式不符,则您需要做更多的研究。

层协议:

  

现在我不确定如何在不知道数据格式的情况下进行操作。

我经常互换使用术语“格式”和“协议”。无论如何,几乎可以肯定POS软件用于打印机周围的协议/格式是建立在一个更简单的协议上的,该协议完全不了解传输数据的目的。在这种情况下,我在网络中采用了“层”术语。第1层指的是电线电压的最基本含义。这包括以太网,USB,串行等。这是您的拦截器首先需要具备的协议。第2层是针对特定目的的协议,例如IP,块存储,打印机协议等。可以有更多的层,但是对于这个问题,我将坚持使用2。一旦检查了L1有效负载的内容,就可以开始对L2格式和感兴趣的命令进行逆向工程。

在另一个示例中,将USB视为L1。现在,您可以将拇指驱动程序,打印机或任意数量的其他设备插入同一USB端口。这些设备都使用L1 = USB协议,但是可能都具有完全不同的L2协议。为L1 = USB构建的拦截器无论如何都能很好地记录和/或镜像有效负载。捕获完成后,功能更复杂的拦截器可能会尝试使用软件来分析L2有效负载,也可以使用软件工具(例如,在ehternet或usb中使用Wireshark)来分析L2有效负载。

特定于打印机:我希望收据打印机支持大多数指定的协议(ESC / POS或其他协议),但POS软件设计人员也只能选择少数命令。

  

我已经阅读了一些书,似乎大多数收据打印机都接受ESC / POS命令集。这是否意味着POS实际上发送ESC / POS命令,例如“ PrintNormal xyz”?

不。大多数打印机接受该协议的事实将是POS作者选择该协议的一个很好的理由,但这并不意味着他们同意。最好的确定方法是检查源代码或截获的数据。如果愿意,您当然可以检查编译后的代码。

栅格化:这纯粹是猜测。我可以看到专门使用栅格子集的情况,因为它限制了软件作者必须花一些时间来理解协议,同时可以在字体,缩进,文本大小等方面更好地控制最终产品。作者可能正在将打印代码移植到许多不同的此类协议中,以支持各种打印机。如果每个提议的打印机协议都支持光栅,那么他们可以一次完成事务到光栅的代码,并为每个提议的协议找到一种将光栅发送到打印机的简单方法。

结论:否,我无法确认您的系统正在使用哪种特定协议。但是,如果您能够像问题所暗示的那样拦截硬件通信,那么您应该自己做一下。