mirror of
https://github.com/SabreTools/BinaryObjectScanner.git
synced 2026-02-11 05:35:15 +00:00
Add skelton for section string finding
This commit is contained in:
@@ -683,6 +683,11 @@ namespace BurnOutSharp.Wrappers
|
||||
/// </summary>
|
||||
private byte[][] _sectionData = null;
|
||||
|
||||
/// <summary>
|
||||
/// Cached found string data in sections
|
||||
/// </summary>
|
||||
private List<string>[] _sectionStringData = null;
|
||||
|
||||
/// <summary>
|
||||
/// Cached resource data
|
||||
/// </summary>
|
||||
@@ -3183,6 +3188,145 @@ namespace BurnOutSharp.Wrappers
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get the first section strings based on name, if possible
|
||||
/// </summary>
|
||||
/// <param name="name">Name of the section to check for</param>
|
||||
/// <param name="exact">True to enable exact matching of names, false for starts-with</param>
|
||||
/// <returns>Section strings on success, null on error</returns>
|
||||
public List<string> GetFirstSectionStrings(string name, bool exact = false)
|
||||
{
|
||||
// If we have no sections
|
||||
if (SectionTable == null || !SectionTable.Any())
|
||||
return null;
|
||||
|
||||
// If the section doesn't exist
|
||||
if (!ContainsSection(name, exact))
|
||||
return null;
|
||||
|
||||
// Get the first index of the section
|
||||
int index = Array.IndexOf(SectionNames, name);
|
||||
if (index == -1)
|
||||
return null;
|
||||
|
||||
// Get the section data from the table
|
||||
var section = SectionTable[index];
|
||||
uint address = section.VirtualAddress.ConvertVirtualAddress(SectionTable);
|
||||
if (address == 0)
|
||||
return null;
|
||||
|
||||
// Set the section size
|
||||
uint size = section.SizeOfRawData;
|
||||
lock (_sourceDataLock)
|
||||
{
|
||||
// Create the section string array if we have to
|
||||
if (_sectionStringData == null)
|
||||
_sectionStringData = new List<string>[SectionNames.Length];
|
||||
|
||||
// If we already have cached data, just use that immediately
|
||||
if (_sectionStringData[index] != null)
|
||||
return _sectionStringData[index];
|
||||
|
||||
// Populate the section string data based on the source
|
||||
List<string> sectionStringData = ReadStringsFromDataSource((int)address, (int)size);
|
||||
|
||||
// Cache and return the section string data, even if null
|
||||
_sectionStringData[index] = sectionStringData;
|
||||
return sectionStringData;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get the last section strings based on name, if possible
|
||||
/// </summary>
|
||||
/// <param name="name">Name of the section to check for</param>
|
||||
/// <param name="exact">True to enable exact matching of names, false for starts-with</param>
|
||||
/// <returns>Section strings on success, null on error</returns>
|
||||
public List<string> GetLastSectionStrings(string name, bool exact = false)
|
||||
{
|
||||
// If we have no sections
|
||||
if (SectionTable == null || !SectionTable.Any())
|
||||
return null;
|
||||
|
||||
// If the section doesn't exist
|
||||
if (!ContainsSection(name, exact))
|
||||
return null;
|
||||
|
||||
// Get the last index of the section
|
||||
int index = Array.LastIndexOf(SectionNames, name);
|
||||
if (index == -1)
|
||||
return null;
|
||||
|
||||
// Get the section data from the table
|
||||
var section = SectionTable[index];
|
||||
uint address = section.VirtualAddress.ConvertVirtualAddress(SectionTable);
|
||||
if (address == 0)
|
||||
return null;
|
||||
|
||||
// Set the section size
|
||||
uint size = section.SizeOfRawData;
|
||||
lock (_sourceDataLock)
|
||||
{
|
||||
// Create the section string array if we have to
|
||||
if (_sectionStringData == null)
|
||||
_sectionStringData = new List<string>[SectionNames.Length];
|
||||
|
||||
// If we already have cached data, just use that immediately
|
||||
if (_sectionStringData[index] != null)
|
||||
return _sectionStringData[index];
|
||||
|
||||
// Populate the section string data based on the source
|
||||
List<string> sectionStringData = ReadStringsFromDataSource((int)address, (int)size);
|
||||
|
||||
// Cache and return the section string data, even if null
|
||||
_sectionStringData[index] = sectionStringData;
|
||||
return sectionStringData;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get the section strings based on index, if possible
|
||||
/// </summary>
|
||||
/// <param name="name">Name of the section to check for</param>
|
||||
/// <param name="exact">True to enable exact matching of names, false for starts-with</param>
|
||||
/// <returns>Section strings on success, null on error</returns>
|
||||
public List<string> GetSectionStrings(int index)
|
||||
{
|
||||
// If we have no sections
|
||||
if (SectionTable == null || !SectionTable.Any())
|
||||
return null;
|
||||
|
||||
// If the section doesn't exist
|
||||
if (index < 0 || index >= SectionTable.Length)
|
||||
return null;
|
||||
|
||||
// Get the section data from the table
|
||||
var section = SectionTable[index];
|
||||
uint address = section.VirtualAddress.ConvertVirtualAddress(SectionTable);
|
||||
if (address == 0)
|
||||
return null;
|
||||
|
||||
// Set the section size
|
||||
uint size = section.SizeOfRawData;
|
||||
lock (_sourceDataLock)
|
||||
{
|
||||
// Create the section string array if we have to
|
||||
if (_sectionStringData == null)
|
||||
_sectionStringData = new List<string>[SectionNames.Length];
|
||||
|
||||
// If we already have cached data, just use that immediately
|
||||
if (_sectionStringData[index] != null)
|
||||
return _sectionStringData[index];
|
||||
|
||||
// Populate the section string data based on the source
|
||||
List<string> sectionStringData = ReadStringsFromDataSource((int)address, (int)size);
|
||||
|
||||
// Cache and return the section string data, even if null
|
||||
_sectionStringData[index] = sectionStringData;
|
||||
return sectionStringData;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using static BurnOutSharp.Builder.Extensions;
|
||||
|
||||
@@ -93,7 +94,7 @@ namespace BurnOutSharp.Wrappers
|
||||
/// <returns>Byte array containing the requested data, null on error</returns>
|
||||
protected byte[] ReadFromDataSource(int position, int length)
|
||||
{
|
||||
// Validate the data souece
|
||||
// Validate the data source
|
||||
if (!DataSourceIsValid())
|
||||
return null;
|
||||
|
||||
@@ -121,6 +122,23 @@ namespace BurnOutSharp.Wrappers
|
||||
return sectionData;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Read string data from the source
|
||||
/// </summary>
|
||||
/// <param name="position">Position in the source to read from</param>
|
||||
/// <param name="length">Length of the requested data</param>
|
||||
/// <returns>String list containing the requested data, null on error</returns>
|
||||
protected List<string> ReadStringsFromDataSource(int position, int length)
|
||||
{
|
||||
// Read the data as a byte array first
|
||||
byte[] sourceData = ReadFromDataSource(position, length);
|
||||
if (sourceData == null)
|
||||
return null;
|
||||
|
||||
// TODO: Complete implementation of string finding
|
||||
return null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get the ending offset of the source
|
||||
/// </summary>
|
||||
|
||||
Reference in New Issue
Block a user