}
// seek to the virtual address specified in the import data directory
- d = d[idd.VirtualAddress-ds.VirtualAddress:]
+ seek := idd.VirtualAddress - ds.VirtualAddress
+ if seek >= uint32(len(d)) {
+ return nil, errors.New("optional header data directory virtual size doesn't fit within data seek")
+ }
+ d = d[seek:]
// start decoding the import directory
var ida []ImportDirectory
dt.dll, _ = getString(names, int(dt.Name-ds.VirtualAddress))
d, _ = ds.Data()
// seek to OriginalFirstThunk
- d = d[dt.OriginalFirstThunk-ds.VirtualAddress:]
+ seek := dt.OriginalFirstThunk - ds.VirtualAddress
+ if seek >= uint32(len(d)) {
+ return nil, errors.New("import directory original first thunk doesn't fit within data seek")
+ }
+ d = d[seek:]
for len(d) > 0 {
if pe64 { // 64bit
+ if len(d) < 8 {
+ return nil, errors.New("thunk parsing needs at least 8-bytes")
+ }
va := binary.LittleEndian.Uint64(d[0:8])
d = d[8:]
if va == 0 {
all = append(all, fn+":"+dt.dll)
}
} else { // 32bit
+ if len(d) <= 4 {
+ return nil, errors.New("thunk parsing needs at least 5-bytes")
+ }
va := binary.LittleEndian.Uint32(d[0:4])
d = d[4:]
if va == 0 {