在Java中的标记处替换exe文件中的数据

在Java中的标记处替换exe文件中的数据,java,Java,我有一个exe文件,当你在文本模式下打开时,它有这个数据 SUBID:$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$数字签名之前的某个位置 我想用一些字符串值替换这些$,比如subID:1234567890ABCDEFGHIJKLM,而不破坏文件的数字签名。(手动执行此替换不会破坏数字签名) 我现在做的是: 在字符串变量FileContents中读取exe文件的内容 获取FileContents中SUBID的索引 将Filecontents从0到ind

我有一个exe文件,当你在文本模式下打开时,它有这个数据
SUBID:$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
数字签名之前的某个位置

我想用一些字符串值替换这些
$
,比如
subID:1234567890ABCDEFGHIJKLM
,而不破坏文件的数字签名。(手动执行此替换不会破坏数字签名)

我现在做的是:

  • 在字符串变量
    FileContents
    中读取exe文件的内容
  • 获取
    FileContents
    SUBID
    的索引
  • Filecontents
    从0到
    indexOf(“SUBID”)
    的子串添加到一个新字符串
    copyStr
  • copyStr
  • 然后将
    FileContents
    的剩余内容追加到copyStr中
  • 最后将字符串转换回字节形式并生成exe 详情如下:

    String fileContent = readFile("MySetup.exe", Charset.defaultCharset());
    int index_subid = fileContent.indexOf("SUBID");
    String copyStr =fileContent.substring(0, index_subid);
    copyStr += "SUBID:" + subID;
    copyStr += fileContent.substring(index_subid + "SUBID:".length()+ subID.length());
    InputStream is = new ByteArrayInputStream(copyStr.getBytes());
    
    //函数readFile()

  • 但问题是,尽管数据的替换操作正确,但生成的exe正在损坏,这可能是因为从字节到文本的转换


    那么,有没有其他方法可以替换exe中
    SUBID
    标记后的数据?

    我不会在文本模式下编辑二进制文件。然后您会怎么做?使用类lile打开二进制文件。最可能的原因是字符串。不要使用字符串进行搜索/替换。将文件读入字节数组,然后遍历该数组以替换字符串。
    public  static String readFile(String path, Charset encoding) 
              throws IOException 
    {
    byte[] encoded = Files.readAllBytes(Paths.get(path));
     return encoding.decode(ByteBuffer.wrap(encoded)).toString();
    }