目标: 将一个exe文件中的某个字符串内容改写成新的内容
``` golang
//要替换的源exe代码,要替换的字符为KEY中的内容
//key是15位
var KEY = "KEYKEYKEYKEYKEY"
var OTHER = "other"
func main() {
fmt.Println(KEY)
fmt.Println(OTHER)
fmt.Println("end")
}
```
``` golang
//动态修改key内容的程序
//大概意思是:读取出test1.exe,此文件是上面的代码生成的
//同时将相应的内容替换后保存到新文件中 test2.exe
func main() {
//这里是18位
replaceInfo := "valvalvalvalvalval"
fileBytes, err := readFile("./test1.exe")
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("fileBytes len:%d\n", len(fileBytes))
offset := bytes.Index(fileBytes, []byte(KEY))
if offset == -1 {
fmt.Println("not found the replace key")
return
}
fmt.Printf("offset : %d\n", offset)
fmt.Printf("replaceInfo len:%d\n", len(replaceInfo))
// for index := 0; index < len(replaceInfo); index++ {
// fileBytes[offset+index] = replaceInfo[index]
// fmt.Printf("index:%d\n", index)
// }
copy(fileBytes[offset:offset+len(replaceInfo)], []byte(replaceInfo))
file, err := os.OpenFile("./test2.exe", os.O_CREATE|os.O_TRUNC, 0775)
if err != nil {
fmt.Println(err)
return
}
defer file.Close()
_, err = file.Write(fileBytes)
fmt.Println(err)
}
```
```
疑惑:
KEY和 replaceInfo 的长度一致时正常的,如果 replaceInfo 长度大于 KEY 长度时 KEY中只替换了15位,按常理应该会报错: 用18位的东西去放到里面会将原来的数据腹盖掉,奇怪的是生成的test2.exe正常的输出,只是输出的内容不对,少了3位
现在输出的是: valvalvalvalval, 期望:valvalvalvalvalval
```
```
哪位大侠知道这是怎么回事, 详细讲解一下呢,谢了
```
更多评论
这种编译后的字符串应该在常量区,我研究了下这些字符串基本都是定死的,也就是说程序会按照已经编译好的规则加载。所以你想把长度15的字符串替换为18,我猜应该要同时修改记录长度的字节,不然程序加载会按15的长度读取。所以你弄长度相同的没问题,长度少的后面会保持原来数据,长度多的则还是按照15读取。不过长度多了会让程序加载下一个常量的时候出现问题,感觉这样程序会崩。
#3