-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathswine.go
95 lines (84 loc) · 1.59 KB
/
swine.go
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
package main
import (
"bytes"
"flag"
"fmt"
"io/ioutil"
"os"
asm "github.com/as/x86/x86asm"
"strings"
)
import (
"github.com/as/mute"
)
const Prefix = "swine: "
var args struct {
h, q bool
r bool
k string
}
var f *flag.FlagSet
var emu *Emu
func init() {
f = flag.NewFlagSet("main", flag.ContinueOnError)
f.BoolVar(&args.h, "h", false, "")
f.BoolVar(&args.q, "?", false, "")
f.StringVar(&args.k, "k", "", "")
f.BoolVar(&args.r, "r", false, "")
err := mute.Parse(f, os.Args[1:])
if err != nil {
printerr(err)
os.Exit(1)
}
}
func main() {
a := f.Args()
if len(a) < 2 {
printerr("usage: swine exe dstdir")
os.Exit(1)
}
exe := a[0]
dir := a[1]
if !args.r {
exe2fs(dir, exe)
}
exe2fs(dir, exe)
fs2exe(exe, dir)
os.Exit(0)
}
func disasm(sec string, data []byte, wordsize int, baseaddr int) []byte {
buf := new(bytes.Buffer)
for i := uint64(baseaddr); len(data) > 0; {
inst, err := asm.Decode(data, wordsize)
if err != nil {
//printerr(err)
}
fmt.Fprintf(buf, "%08x %s\n", i, asm.Plan9Syntax(inst, i, symname))
i += uint64(inst.Len)
if sec == ".text" {
//Execute(data[:inst.Len])
}
data = data[inst.Len:]
}
return buf.Bytes()
}
func sections(file string) (section []string) {
data, err := ioutil.ReadFile(clean(file + "/section/ORDER"))
if err != nil {
return nil
}
for _, v := range strings.Split(string(data), " ") {
if v != "" {
section = append(section, v)
}
}
return section
}
func symname(addr uint64) (s string, n uint64) {
var err error
if emu == nil {
emu, err = Boot(f.Args()[1])
printerr(err)
}
return emu.Symbol(addr)
}