【问题标题】:modify a datastream on the fly即时修改数据流
【发布时间】:2011-04-02 05:09:03
【问题描述】:

我需要劫持和修改数据流。该流由固定宽度的命令组成。每个命令都是一个新行,文档说每个命令都以 STX/ETX 对(文本的开始和结束)开始和结束

发送系统正在使用串行,但被攻击到通过 IP 与我们的 PBX 通信的 iPocket 设备。据我所知,它只是将串行转换为 telnet,希望这能让事情变得非常简单。

我需要查找的字符串以NAM 开头。结构是这样的:

STX NAM EXT# LASTNAME,FIRSTNAME ETX

我需要用空格替换,FIRSTNAME,这样它就不会改变命令的长度。

我一直在尝试以下操作,虽然它根据需要在两个方向上端到端地传递数据,并删除所需的数据,但它并没有保持命令的长度。

ipocket <-> nc -kl 1100 | sed 's/,[^,]*/ /g' | nc target_ip target_port <-> PBX

我将使用 linux 机器来完成这项任务。我有理由确定这可以在 perl 或 python 中非常简单地完成,但我不知道从哪里开始。任何帮助将不胜感激!

【问题讨论】:

  • 这是一些漂亮的 1337 东西,他们的布拉赫
  • 如果你能发布一些明确而准确的东西,比如 Wireshark/Pcap 转储,或者至少是 hexdump,那将会很有帮助。模糊的问题只会得到模糊的答案。
  • @lesmana:是的,一模一样。标签除外。其中一个问题应该作为重复而结束。标签应该被合并。
  • 回答者请注意... STX 和 ETX 是单个字符,并且(可能)没有命令行工具通常预期的换行符。

标签: linux perl text protocols telnet


【解决方案1】:

应该这样做,它是一个班轮

perl -pe '/^STX\s\w+\s\d+#\s\w+,(\w+)\sETX$/;$len=length($1);s/$1/" " x $len/e'

我测试过。

echo "STX NAM 100# LASTNAME,FIRSTNAME ETX" | perl -pe '/^STX\s\w+\s\d+#\s\w+,(\w+)\sETX$/;$len=length($1);s/$1/" " x $len/e'

然后它返回

STX NAM 100# LASTNAME,          ETX

为了确保字符串与我测试的长度相同。

echo "STX NAM 100# LASTNAME,FIRSTNAME ETX" | perl -pe '/^STX\s\w+\s\d+#\s\w+,(\w+)\sETX$/;$len=length($1);s/$1/" " x $len/e'| perl -pe 'print length($_);'

给出 36。

echo "STX NAM 100# LASTNAME,FIRSTNAME ETX"|perl -pe 'print length($_);'

给出 36。

【讨论】:

    【解决方案2】:

    在 Perl 中,添加检查字符串NAM 开始 并真正替换,FIRSTNAME

    nc -kl 1100 | \
    perl -pe '/^STX NAM / && do { s/(,FIRSTNAME)/" " x length("$1")/ge }' | \
    nc <...>
    

    在 Perl s///e 中,正如预期的那样进行替换,但将替换字符串评估为 expression。操作员x 创建一个新字符串,将左边的字符串复制到右边给出的次数。不匹配的字符串显然不会被修改。

    【讨论】:

      【解决方案3】:

      您可以使用以下命令代替sed 命令:

      perl -pe 's/(,\w+)/" " x length $1/ge'
      

      替换上的e 选项意味着s/// 的右侧被评估为Perl 表达式。在这种情况下,表达式会根据捕获的匹配项的长度返回正确的空格数。

      【讨论】:

        【解决方案4】:

        这是sed 版本:

        sed 'h;s/[^,]*,\([^ ]*\) ETX/\1/;s/./ /g;x;s/,.*/,/;G;s/\n//;s/$/ ETX/'
        

        我敢打赌,不仅命令是固定宽度,而且字段也是固定宽度。如果是这样的话,那么这样的事情可能会起作用:

        sed 's/\(.\{22\}\).\{9\}\(.\{4\}\)/\1         \2/'
        

        sed -r 's/(.{22}).{9}(.{4})/\1         \2/'
        

        sed -r 's/STX (.{18}).{9} ETX/STX \1          ETX/'
        

        【讨论】:

          【解决方案5】:

          是的,iPocket 对数据进行原始传递。这些选项通常用于对传入数据进行打包,这实际上不会影响您在此处尝试执行的操作。 (我为该设备编写了固件。)

          但是,这里的命令行答案都不起作用,因为它们是基于行的,而您的数据不是。也就是说,sedperl 用作“数据包”边界的数据流中有换行符。

          我不相信您可以通过任何方式从命令行完成此操作。您将不得不编写一个简单的程序来读取传入的 TCP 流,查找 STX/ETX 帧,根据需要替换字符,然后将数据写入另一端。 (也不要忘记通过反向。)

          Python 可能是最简单的方法。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-01-28
            • 1970-01-01
            • 1970-01-01
            • 2017-10-25
            • 1970-01-01
            • 2018-02-08
            相关资源
            最近更新 更多