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  }