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  }