|
1 | 1 | // Licensed to the .NET Foundation under one or more agreements. |
2 | 2 | // The .NET Foundation licenses this file to you under the MIT license. |
3 | 3 |
|
| 4 | +using System.Buffers.Binary; |
4 | 5 | using System.Collections.Generic; |
5 | 6 | using System.IO; |
6 | 7 | using System.Linq; |
@@ -203,11 +204,11 @@ public unsafe void InvalidExternalTableMask() |
203 | 204 | byte[] peImage = (byte[])PortablePdbs.DocumentsPdb.Clone(); |
204 | 205 | GCHandle pinned = GetPinnedPEImage(peImage); |
205 | 206 |
|
206 | | - //38654710855 is the external table mask from PortablePdbs.DocumentsPdb |
207 | | - int externalTableMaskIndex = IndexOf(peImage, BitConverter.GetBytes(38654710855), 0); |
| 207 | + //0x900001447 is the external table mask from PortablePdbs.DocumentsPdb |
| 208 | + int externalTableMaskIndex = IndexOf(peImage, new byte[] { 0x47, 0x14, 0, 0, 9, 0, 0, 0 }, 0); |
208 | 209 | Assert.NotEqual(externalTableMaskIndex, -1); |
209 | 210 |
|
210 | | - Array.Copy(BitConverter.GetBytes(38654710855 + 1), 0, peImage, externalTableMaskIndex, BitConverter.GetBytes(38654710855 + 1).Length); |
| 211 | + Array.Copy(new byte[] { 0x48, 0x14, 0, 0, 9, 0, 0, 0 }, 0, peImage, externalTableMaskIndex, 8); |
211 | 212 | Assert.Throws<BadImageFormatException>(() => new MetadataReader((byte*)pinned.AddrOfPinnedObject(), peImage.Length)); |
212 | 213 | } |
213 | 214 |
|
@@ -245,30 +246,30 @@ public unsafe void InvalidMetaDataTableHeaders() |
245 | 246 | GCHandle pinned = GetPinnedPEImage(peImage); |
246 | 247 | PEHeaders headers = new PEHeaders(new MemoryStream(peImage)); |
247 | 248 |
|
248 | | - //1392 is the remaining bytes from NetModule.AppCS |
249 | | - int remainingBytesIndex = IndexOf(peImage, BitConverter.GetBytes(1392), headers.MetadataStartOffset); |
| 249 | + //0x0570 is the remaining bytes from NetModule.AppCS |
| 250 | + int remainingBytesIndex = IndexOf(peImage, new byte[] { 0x70, 0x05, 0, 0 }, headers.MetadataStartOffset); |
250 | 251 | Assert.NotEqual(remainingBytesIndex, -1); |
251 | | - //14057656686423 is the presentTables from NetModule.AppCS, must be after remainingBytesIndex |
252 | | - int presentTablesIndex = IndexOf(peImage, BitConverter.GetBytes(14057656686423), headers.MetadataStartOffset + remainingBytesIndex); |
| 252 | + //0xcc90da21757 is the presentTables from NetModule.AppCS, must be after remainingBytesIndex |
| 253 | + int presentTablesIndex = IndexOf(peImage, new byte[] { 0x57, 0x17, 0xa2, 0x0d, 0xc9, 0x0c, 0, 0 }, headers.MetadataStartOffset + remainingBytesIndex); |
253 | 254 | Assert.NotEqual(presentTablesIndex, -1); |
254 | 255 |
|
255 | 256 | //Set this.ModuleTable.NumberOfRows to 0 |
256 | | - Array.Copy(BitConverter.GetBytes((ulong)0), 0, peImage, presentTablesIndex + remainingBytesIndex + headers.MetadataStartOffset + 16, BitConverter.GetBytes((ulong)0).Length); |
| 257 | + Array.Copy(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, peImage, presentTablesIndex + remainingBytesIndex + headers.MetadataStartOffset + 16, 8); |
257 | 258 | Assert.Throws<BadImageFormatException>(() => new MetadataReader((byte*)pinned.AddrOfPinnedObject() + headers.MetadataStartOffset, headers.MetadataSize)); |
258 | 259 | //set row counts greater than TokenTypeIds.RIDMask |
259 | | - Array.Copy(BitConverter.GetBytes((ulong)16777216), 0, peImage, presentTablesIndex + remainingBytesIndex + headers.MetadataStartOffset + 16, BitConverter.GetBytes((ulong)16777216).Length); |
| 260 | + Array.Copy(new byte[] { 0, 0, 1, 0 }, 0, peImage, presentTablesIndex + remainingBytesIndex + headers.MetadataStartOffset + 16, 4); |
260 | 261 | Assert.Throws<BadImageFormatException>(() => new MetadataReader((byte*)pinned.AddrOfPinnedObject() + headers.MetadataStartOffset, headers.MetadataSize)); |
261 | 262 | //set remaining bytes smaller than required for row counts. |
262 | | - Array.Copy(BitConverter.GetBytes(25), 0, peImage, remainingBytesIndex + headers.MetadataStartOffset, BitConverter.GetBytes(25).Length); |
| 263 | + Array.Copy(new byte[] { 25, 0, 0, 0 }, 0, peImage, remainingBytesIndex + headers.MetadataStartOffset, 4); |
263 | 264 | Assert.Throws<BadImageFormatException>(() => new MetadataReader((byte*)pinned.AddrOfPinnedObject() + headers.MetadataStartOffset, headers.MetadataSize)); |
264 | | - //14057656686424 is a value to make (presentTables & ~validTables) != 0 but not (presentTables & (ulong)(TableMask.PtrTables | TableMask.EnCMap)) != 0 |
265 | | - Array.Copy(BitConverter.GetBytes((ulong)14057656686424), 0, peImage, presentTablesIndex + remainingBytesIndex + headers.MetadataStartOffset, BitConverter.GetBytes((ulong)14057656686424).Length); |
| 265 | + //0xcc90da21758 is a value to make (presentTables & ~validTables) != 0 but not (presentTables & (ulong)(TableMask.PtrTables | TableMask.EnCMap)) != 0 |
| 266 | + Array.Copy(new byte[] { 0x58, 0x17, 0xa2, 0x0d, 0xc9, 0x0c, 0, 0 }, 0, peImage, presentTablesIndex + remainingBytesIndex + headers.MetadataStartOffset, 8); |
266 | 267 | Assert.Throws<BadImageFormatException>(() => new MetadataReader((byte*)pinned.AddrOfPinnedObject() + headers.MetadataStartOffset, headers.MetadataSize)); |
267 | | - //14066246621015 makes (presentTables & ~validTables) != 0 fail |
268 | | - Array.Copy(BitConverter.GetBytes((ulong)14066246621015), 0, peImage, presentTablesIndex + remainingBytesIndex + headers.MetadataStartOffset, BitConverter.GetBytes((ulong)14066246621015).Length); |
| 268 | + //0xccb0da21757 makes (presentTables & ~validTables) != 0 fail |
| 269 | + Array.Copy(new byte[] { 0x57, 0x17, 0xa2, 0x0d, 0xcb, 0x0c, 0, 0 }, 0, peImage, presentTablesIndex + remainingBytesIndex + headers.MetadataStartOffset, 8); |
269 | 270 | Assert.Throws<BadImageFormatException>(() => new MetadataReader((byte*)pinned.AddrOfPinnedObject() + headers.MetadataStartOffset, headers.MetadataSize)); |
270 | 271 | //set remaining bytes smaller than MetadataStreamConstants.SizeOfMetadataTableHeader |
271 | | - Array.Copy(BitConverter.GetBytes(1), 0, peImage, remainingBytesIndex + headers.MetadataStartOffset, BitConverter.GetBytes(1).Length); |
| 272 | + Array.Copy(new byte[] { 1, 0, 0, 0 }, 0, peImage, remainingBytesIndex + headers.MetadataStartOffset, 4); |
272 | 273 | Assert.Throws<BadImageFormatException>(() => new MetadataReader((byte*)pinned.AddrOfPinnedObject() + headers.MetadataStartOffset, headers.MetadataSize)); |
273 | 274 | } |
274 | 275 |
|
@@ -3033,18 +3034,25 @@ private static unsafe byte[] ObfuscateWithExtraData(byte[] unobfuscated, bool se |
3033 | 3034 | Array.Copy(unobfuscated, obfuscated, offsetToModuleTable); |
3034 | 3035 | Array.Copy(unobfuscated, offsetToModuleTable, obfuscated, offsetToModuleTable + sizeOfExtraData, unobfuscated.Length - offsetToModuleTable); |
3035 | 3036 |
|
3036 | | - fixed (byte* ptr = obfuscated) |
3037 | | - { |
3038 | | - // increase size of metadata |
3039 | | - *(int*)(ptr + offsetToMetadataSize) += sizeOfExtraData; |
| 3037 | + // increase size of metadata |
| 3038 | + Span<byte> MetadataSizeSpan = new Span<byte>(obfuscated, offsetToMetadataSize, 4); |
| 3039 | + uint MetadataSize = BinaryPrimitives.ReadUInt32LittleEndian(MetadataSizeSpan); |
| 3040 | + BinaryPrimitives.WriteUInt32LittleEndian(MetadataSizeSpan, MetadataSize + sizeOfExtraData); |
3040 | 3041 |
|
3041 | | - // increase size of table stream |
3042 | | - *(int*)(ptr + streamHeaders[tableStreamIndex].OffsetToSize) += sizeOfExtraData; |
| 3042 | + // increase size of table stream |
| 3043 | + Span<byte> TableStreamSpan = new Span<byte>(obfuscated, streamHeaders[tableStreamIndex].OffsetToSize, 4); |
| 3044 | + uint TableStreamSize = BinaryPrimitives.ReadUInt32LittleEndian(TableStreamSpan); |
| 3045 | + BinaryPrimitives.WriteUInt32LittleEndian(TableStreamSpan, TableStreamSize + sizeOfExtraData); |
3043 | 3046 |
|
3044 | | - // adjust offset of any streams that follow it |
3045 | | - for (int i = 0; i < streamHeaders.Length; i++) |
3046 | | - if (streamHeaders[i].Offset > streamHeaders[tableStreamIndex].Offset) |
3047 | | - *(int*)(ptr + streamHeaders[i].OffsetToOffset) += sizeOfExtraData; |
| 3047 | + // adjust offset of any streams that follow it |
| 3048 | + for (int i = 0; i < streamHeaders.Length; i++) |
| 3049 | + { |
| 3050 | + if (streamHeaders[i].Offset > streamHeaders[tableStreamIndex].Offset) |
| 3051 | + { |
| 3052 | + Span<byte> OffsetSpan = new Span<byte>(obfuscated, streamHeaders[i].OffsetToOffset, 4); |
| 3053 | + uint Offset = BinaryPrimitives.ReadUInt32LittleEndian(OffsetSpan); |
| 3054 | + BinaryPrimitives.WriteUInt32LittleEndian(OffsetSpan, Offset + sizeOfExtraData); |
| 3055 | + } |
3048 | 3056 | } |
3049 | 3057 |
|
3050 | 3058 | // write non-zero "extra data" to make sure so that our assertion of leading Module.Generation == 0 |
|
0 commit comments