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