func (u *Usercorn) RegisterAddr(f *os.File, addr, size uint64, off int64) { l, err := loader.Load(f) if err != nil { return } symbols, _ := l.Symbols() DWARF, _ := l.DWARF() mappedFile := &models.MappedFile{ Name: path.Base(f.Name()), Off: off, Addr: addr, Size: size, Symbols: symbols, DWARF: DWARF, } u.mappedFiles = append(u.mappedFiles, mappedFile) if mmap := u.mapping(addr, size); mmap != nil { mmap.File = mappedFile } }
func NewUsercorn(exe string, config *models.Config) (models.Usercorn, error) { config = config.Init() f, err := os.Open(exe) if err != nil { return nil, err } defer f.Close() l, err := loader.Load(f) if err == loader.UnknownMagic { f.Seek(0, 0) scanner := bufio.NewScanner(f) if scanner.Scan() { line := scanner.Text() if strings.HasPrefix(line, "#!") && len(line) > 2 { args := strings.Split(line[2:], " ") prefix := append(args[1:], exe) config.PrefixArgs = append(prefix, config.PrefixArgs...) shell := config.PrefixPath(args[0], false) return NewUsercorn(shell, config) } } } if err != nil { return nil, err } u, err := NewUsercornRaw(l, config) if err != nil { return nil, err } exe, _ = filepath.Abs(exe) u.exe = exe u.loader = l // map binary (and interp) into memory u.interpBase, u.entry, u.base, u.binEntry, err = u.mapBinary(f, false, l.Arch()) if err != nil { return nil, err } // find data segment for brk u.brk = 0 segments, err := l.Segments() if err != nil { return nil, err } for _, seg := range segments { if seg.Prot&uc.PROT_WRITE != 0 { addr := u.base + seg.Addr + seg.Size if addr > u.brk { u.brk = addr } } } // TODO: have a "host page size", maybe arch.Align() // TODO: allow setting brk addr for raw Usercorn? mask := uint64(4096 - 1) u.Brk((u.brk + mask) & ^mask) // make sure PC is set to entry point for debuggers u.RegWrite(u.Arch().PC, u.Entry()) return u, nil }