突然有这个想法,简单粗暴的去替换 go 编译好的二进制文件里的某个字符串,顺便去验证一下。
过程
首先用 ioutil.ReadFile
打开二进制文件,然后用 bytes.Replace
来替换,再用 ioutil.WriteFile
去保存。
代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package main
import (
"bytes"
"fmt"
"io/ioutil"
"strings"
)
func main() {
data, err := ioutil.ReadFile("golangnote")
if err != nil {
fmt.Println(err)
return
}
fmt.Println(strings.Index(string(data), "fastHTTP + sdb"))
fmt.Println(bytes.Index(data, []byte("fastHTTP + sdb")))
data = bytes.Replace(data, []byte("fastHTTP + sdb"), []byte("fastHTTP2 + sdb2"), -1)
err = ioutil.WriteFile("golangnote2", data, 0777)
if err != nil {
fmt.Println(err)
return
}
fmt.Println("done")
}
顺利替换,然而运行时出错:
1
Segmentation fault: 11
结论
不能直接替换😄
疑问
感觉有点不对,试试改变替换的内容
1
data = bytes.Replace(data, []byte("fastHTTP + sdb"), []byte("fastHTTT + sdD"), -1)
这次替换后的程序可以运行了。关键是替换与被替换的内容是等长。
一个中文换三个英文字母也可以
1
data = bytes.Replace(data, []byte("fastHTTP + sdb"), []byte("fastHTTT + 中"), -1)
本文网址: https://golangnote.com/topic/284.html 转摘请注明来源