Initial Commit
This commit is contained in:
commit
12afb64c2a
81
word/macroeditor.go
Normal file
81
word/macroeditor.go
Normal file
@ -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
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user