替换一个exe文件中的固定内容

1034992601 · 2023-01-27 19:11:39 · 2363 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2023-01-27 19:11:39 的主题,其中的信息可能已经有所发展或是发生改变。

目标: 将一个exe文件中的某个字符串内容改写成新的内容

//要替换的源exe代码,要替换的字符为KEY中的内容
//key是15位
var KEY = "KEYKEYKEYKEYKEY"
var OTHER = "other"

func main() {
    fmt.Println(KEY)
    fmt.Println(OTHER)
    fmt.Println("end")
}
//动态修改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
哪位大侠知道这是怎么回事, 详细讲解一下呢,谢了

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2363 次点击  ∙  3 赞  
加入收藏 微博
6 回复  |  直到 2023-01-29 09:26:59
Neightly
Neightly · #1 · 2年之前

The number of elements copied is the minimum of len(src) and len(dst).

1034992601
1034992601 · #2 · 2年之前
NeightlyNeightly #1 回复

The number of elements copied is the minimum of len(src) and len(dst).

不用copy, 用for 一个字节一个字节的赋值,也会是这种结果

jan-bar
jan-bar · #3 · 2年之前

这种编译后的字符串应该在常量区,我研究了下这些字符串基本都是定死的,也就是说程序会按照已经编译好的规则加载。所以你想把长度15的字符串替换为18,我猜应该要同时修改记录长度的字节,不然程序加载会按15的长度读取。所以你弄长度相同的没问题,长度少的后面会保持原来数据,长度多的则还是按照15读取。不过长度多了会让程序加载下一个常量的时候出现问题,感觉这样程序会崩。

twgh
twgh · #4 · 2年之前

把key的长度加到足够长, 替换后使用他的时候删除尾部无用的文本

jan-bar
jan-bar · #5 · 2年之前
twghtwgh #4 回复

把key的长度加到足够长, 替换后使用他的时候删除尾部无用的文本

高手啊,思路一下就打开了。

sanrentai
sanrentai · #6 · 2年之前

image.png image.png 15位的字符串,替换成18位的,但仅有前面15位是可以用的,因为在取变量的时候,仅取这15位,程序是按地址取的,后面3位过界了

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传