在Unix中的二进制替换范围

时间:2013-10-04 12:22:01

标签: replace binaryfiles

我需要搜索并替换二进制文件中特定范围内的字节字符串。

  

从字节1000到2000搜索到mytest.pcap

     

将x93 \ x33 \ x59 \ x05 \ x00替换为x93 \ x33 \ x59 \ x00 \ x0

谢谢, 的Riccardo


我的方法:

sed 's/\x93\x33\x59\x05\x00/\x93\x33\x59\x00\x00/g' mytest.pcap > mytest_mod.pcap

1 个答案:

答案 0 :(得分:0)

您使用的sed行看起来不错,所以我想剩下的是范围。除非你有一些严格的性能要求,否则我认为这可行:

(head -c1000 mytest.pcap;
 tail -c+1001 mytest.pcap | head -c1000 | sed 's/.../.../g';
 tail -c+2001 mytest.pcap) > mytest_mod.pcap

更新

如果表演是一个问题,我认为除了写一个单一用途的程序别无选择(也许perl会允许“单行”,但那不是我的区域)。在python中它可能看起来像这样:

import sys
import re

sys.stdout.write(sys.stdin.read(1000))
range = sys.stdin.read(1000)
sys.stdout.write(re.sub('\x93\x33\x59\x05\x00', '\x93\x33\x59\x00\x00', range))
while True:
    buf = sys.stdin.read()
    if buf:
        sys.stdout.write(buf)
    else:
        break

请注意,它强烈依赖read(1000)真正读取这1000个字节;对于这个尺寸,我认为这是非常安全的假设。

将代码段保存到名为subst_range.py的文件中,然后运行python subst_range.py < mytest.pcap > mytest_mod.pcap