github.com/saferwall/pe@v1.5.2/delayimports_test.go (about) 1 // Copyright 2018 Saferwall. All rights reserved. 2 // Use of this source code is governed by Apache v2 license 3 // license that can be found in the LICENSE file. 4 5 package pe 6 7 import ( 8 "reflect" 9 "testing" 10 ) 11 12 type TestDelayImportEntry struct { 13 entryCount int 14 entryIndex int 15 entry DelayImport 16 } 17 18 func TestDelayImportDirectory(t *testing.T) { 19 20 tests := []struct { 21 in string 22 out TestDelayImportEntry 23 }{ 24 { 25 getAbsoluteFilePath("test/000049925c578e5a0883e7d1a8257c1a44feab8f7d9972ace8d0e3fb96612a4c"), 26 TestDelayImportEntry{ 27 entryCount: 4, 28 entryIndex: 0, 29 entry: DelayImport{ 30 Offset: 0x5F7C00, 31 Name: "kernel32.dll", 32 Functions: []ImportFunction{ 33 { 34 Name: "GetLogicalProcessorInformation", 35 Hint: 0x0, 36 ByOrdinal: false, 37 OriginalThunkValue: 0x601192, 38 ThunkValue: 0xF04E60, 39 ThunkRVA: 0x6010B4, 40 OriginalThunkRVA: 0x6010F0, 41 }, 42 }, 43 Descriptor: ImageDelayImportDescriptor{ 44 Attributes: 0x1, 45 Name: 0x601184, 46 ModuleHandleRVA: 0x6010A0, 47 ImportAddressTableRVA: 0x6010B4, 48 ImportNameTableRVA: 0x6010F0, 49 BoundImportAddressTableRVA: 0x60112C, 50 UnloadInformationTableRVA: 0x601158, 51 TimeDateStamp: 0x0, 52 }, 53 }, 54 }, 55 }, 56 } 57 58 for _, tt := range tests { 59 t.Run(tt.in, func(t *testing.T) { 60 ops := Options{Fast: true} 61 file, err := New(tt.in, &ops) 62 if err != nil { 63 t.Fatalf("New(%s) failed, reason: %v", tt.in, err) 64 } 65 66 err = file.Parse() 67 if err != nil { 68 t.Fatalf("Parse(%s) failed, reason: %v", tt.in, err) 69 } 70 71 var va, size uint32 72 73 if file.Is64 { 74 oh64 := file.NtHeader.OptionalHeader.(ImageOptionalHeader64) 75 dirEntry := oh64.DataDirectory[ImageDirectoryEntryDelayImport] 76 va = dirEntry.VirtualAddress 77 size = dirEntry.Size 78 } else { 79 oh32 := file.NtHeader.OptionalHeader.(ImageOptionalHeader32) 80 dirEntry := oh32.DataDirectory[ImageDirectoryEntryDelayImport] 81 va = dirEntry.VirtualAddress 82 size = dirEntry.Size 83 } 84 85 err = file.parseDelayImportDirectory(va, size) 86 if err != nil { 87 t.Fatalf("parseDelayImportDirectory(%s) failed, reason: %v", tt.in, err) 88 } 89 got := file.DelayImports 90 if len(got) != tt.out.entryCount { 91 t.Errorf("delay imports entry count assertion failed, got %v, want %v", 92 len(got), tt.out.entryCount) 93 } 94 95 if len(file.DelayImports) > 0 { 96 delayImportEntry := file.DelayImports[tt.out.entryIndex] 97 if !reflect.DeepEqual(delayImportEntry, tt.out.entry) { 98 t.Errorf("delay import entry assertion failed, got %v, want %v", 99 delayImportEntry, tt.out.entry) 100 } 101 } 102 103 }) 104 } 105 }