commit 12afb64c2a17c1b1efb7e55cfc5f934f7cc69644 Author: dtookey Date: Mon Jul 18 17:00:52 2022 -0400 Initial Commit diff --git a/entry.go b/entry.go new file mode 100644 index 0000000..da29a2c --- /dev/null +++ b/entry.go @@ -0,0 +1,4 @@ +package main + +func main() { +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..d40b4e4 --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module Wordifier + +go 1.18 diff --git a/word/macroeditor.go b/word/macroeditor.go new file mode 100644 index 0000000..ea606a6 --- /dev/null +++ b/word/macroeditor.go @@ -0,0 +1,81 @@ +package word + +import ( + zip2 "archive/zip" + "bytes" + "io" + "io/ioutil" + "os" +) + +type ( + MacroInjectTarget struct { + Name string + Marker []byte + Replacement []byte + } +) + +func NewMacroInjectTarget(name string, marker []byte, replacement []byte) MacroInjectTarget { + if len(replacement) != len(marker) { + panic("Payload and target are not the same size. Make sure replacement is the same length as marker") + } + return MacroInjectTarget{name, marker, replacement} +} + +func CopyZipWithReplacements(src string, dest io.Writer, replacements []MacroInjectTarget) { + inf, err := os.OpenFile(src, os.O_RDONLY, 0755) + if err != nil { + panic(err) + } + defer inf.Close() + + infInfo, err := inf.Stat() + if err != nil { + panic(err) + } + + zReader, err := zip2.NewReader(inf, infInfo.Size()) + if err != nil { + panic(err) + } + + zWriter := zip2.NewWriter(dest) + defer zWriter.Flush() + defer zWriter.Close() + + for _, file := range zReader.File { + modified := false + for _, rule := range replacements { + if file.Name == rule.Name { + modified = true + container, err := zWriter.Create(file.Name) + if err != nil { + panic(err) + } + alternateContent := modifyEntry(file, rule) + _, err = container.Write(*alternateContent) + if err != nil { + panic(err) + } + } + } + if !modified { + zWriter.Copy(file) + } + } +} + +func modifyEntry(f *zip2.File, injectionTarget MacroInjectTarget) *[]byte { + entry, err := f.Open() + if err != nil { + panic(err) + } + content, err := ioutil.ReadAll(entry) + if err != nil { + panic(err) + } + idx := bytes.Index(content, injectionTarget.Marker) + copy(content[idx:idx+len(injectionTarget.Marker)], injectionTarget.Replacement[0:]) + return &content +}