github.com/saferwall/pe@v1.5.2/tls_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 func TestParseTLSDirectory(t *testing.T) { 13 14 tests := []struct { 15 in string 16 out TLSDirectory 17 }{ 18 { 19 getAbsoluteFilePath("test/liblzo2-2.dll"), 20 TLSDirectory{ 21 Struct: ImageTLSDirectory64{ 22 StartAddressOfRawData: 0x6CBBB000, 23 EndAddressOfRawData: 0x6CBBB060, 24 AddressOfIndex: 0x6CBB75AC, 25 AddressOfCallBacks: 0x6CBBA030, 26 }, 27 Callbacks: []uint64{0x6cbae7e0, 0x6cbae7b0}, 28 }, 29 }, 30 { 31 getAbsoluteFilePath("test/3a081c7fe475ec68ed155c76d30cfddc4d41f7a09169810682d1c75421e98eaa"), 32 TLSDirectory{ 33 Struct: ImageTLSDirectory32{ 34 StartAddressOfRawData: 0x004157B8, 35 EndAddressOfRawData: 0x004157B9, 36 AddressOfIndex: 0x0042F8DC, 37 AddressOfCallBacks: 0x0040E3AC, 38 Characteristics: 0x00100000, 39 }, 40 Callbacks: []uint32{0x40A5A0}, 41 }, 42 }, 43 } 44 45 for _, tt := range tests { 46 t.Run(tt.in, func(t *testing.T) { 47 ops := Options{Fast: true} 48 file, err := New(tt.in, &ops) 49 if err != nil { 50 t.Fatalf("New(%s) failed, reason: %v", tt.in, err) 51 } 52 53 err = file.Parse() 54 if err != nil { 55 t.Fatalf("Parse(%s) failed, reason: %v", tt.in, err) 56 } 57 58 var va, size uint32 59 switch file.Is64 { 60 case true: 61 oh64 := file.NtHeader.OptionalHeader.(ImageOptionalHeader64) 62 dirEntry := oh64.DataDirectory[ImageDirectoryEntryTLS] 63 va = dirEntry.VirtualAddress 64 size = dirEntry.Size 65 case false: 66 oh32 := file.NtHeader.OptionalHeader.(ImageOptionalHeader32) 67 dirEntry := oh32.DataDirectory[ImageDirectoryEntryTLS] 68 va = dirEntry.VirtualAddress 69 size = dirEntry.Size 70 } 71 72 err = file.parseTLSDirectory(va, size) 73 if err != nil { 74 t.Fatalf("parseRelocDirectory(%s) failed, reason: %v", tt.in, err) 75 } 76 tls := file.TLS 77 if !reflect.DeepEqual(tls, tt.out) { 78 t.Fatalf("TLS directory assertion failed, got %v, want %v", tls.Struct, 79 tt.out) 80 } 81 }) 82 } 83 } 84 85 func TestTLSDirectoryCharacteristics(t *testing.T) { 86 87 tests := []struct { 88 in TLSDirectoryCharacteristicsType 89 out string 90 }{ 91 { 92 93 TLSDirectoryCharacteristicsType(0x00100000), 94 "Align 1-Byte", 95 }, 96 { 97 0xff, 98 "?", 99 }, 100 } 101 102 for _, tt := range tests { 103 t.Run(tt.out, func(t *testing.T) { 104 105 TLSDirectoryCharacteristics := tt.in.String() 106 if TLSDirectoryCharacteristics != tt.out { 107 t.Fatalf("TLS directory characteristics string assertion failed, got %v, want %v", 108 TLSDirectoryCharacteristics, tt.out) 109 } 110 }) 111 } 112 }