Skip to content

Commit 07cb886

Browse files
author
James Forshaw
committed
Fixed parsing of export directory with no names.
1 parent 80d7fcc commit 07cb886

1 file changed

Lines changed: 30 additions & 19 deletions

File tree

NtApiDotNet/Win32/SafeLoadLibraryHandle.cs

Lines changed: 30 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1249,6 +1249,30 @@ private void ParseDelayedImport(Dictionary<IntPtr, IntPtr> imports, ImageDelayIm
12491249
}
12501250
}
12511251

1252+
private Dictionary<int, string> GetNameToOrdinals(ImageExportDirectory export_directory)
1253+
{
1254+
Dictionary<int, string> ordinal_to_names = new Dictionary<int, string>();
1255+
IntPtr names = RvaToVA(export_directory.AddressOfNames);
1256+
IntPtr name_ordinals = RvaToVA(export_directory.AddressOfNameOrdinals);
1257+
1258+
if (names == IntPtr.Zero || name_ordinals == IntPtr.Zero)
1259+
return ordinal_to_names;
1260+
1261+
int[] name_rvas = new int[export_directory.NumberOfNames];
1262+
Marshal.Copy(names, name_rvas, 0, name_rvas.Length);
1263+
IntPtr[] name_vas = name_rvas.Select(r => r != 0 ? RvaToVA(r) : IntPtr.Zero).ToArray();
1264+
short[] ordinals = new short[export_directory.NumberOfNames];
1265+
Marshal.Copy(name_ordinals, ordinals, 0, ordinals.Length);
1266+
1267+
for (int i = 0; i < name_vas.Length; ++i)
1268+
{
1269+
string name = Marshal.PtrToStringAnsi(name_vas[i]);
1270+
int ordinal = ordinals[i];
1271+
ordinal_to_names[ordinal] = name;
1272+
}
1273+
return ordinal_to_names;
1274+
}
1275+
12521276
private void ParseExports()
12531277
{
12541278
_exports = new List<DllExport>();
@@ -1267,31 +1291,18 @@ private void ParseExports()
12671291
{
12681292
return;
12691293
}
1270-
IntPtr funcs = RvaToVA(export_directory.AddressOfFunctions);
1271-
IntPtr names = RvaToVA(export_directory.AddressOfNames);
1272-
IntPtr name_ordinals = RvaToVA(export_directory.AddressOfNameOrdinals);
12731294

12741295
long export_base = buffer.DangerousGetHandle().ToInt64();
1275-
long export_top = export_base + buffer.Length;
1276-
1296+
long export_top = export_base + buffer.Length;
1297+
1298+
IntPtr funcs = RvaToVA(export_directory.AddressOfFunctions);
1299+
if (funcs == IntPtr.Zero)
1300+
return;
12771301
int[] func_rvas = new int[export_directory.NumberOfFunctions];
12781302
Marshal.Copy(funcs, func_rvas, 0, func_rvas.Length);
12791303
IntPtr[] func_vas = func_rvas.Select(r => r != 0 ? RvaToVA(r) : IntPtr.Zero).ToArray();
12801304

1281-
int[] name_rvas = new int[export_directory.NumberOfNames];
1282-
Marshal.Copy(names, name_rvas, 0, name_rvas.Length);
1283-
IntPtr[] name_vas = name_rvas.Select(r => r != 0 ? RvaToVA(r) : IntPtr.Zero).ToArray();
1284-
1285-
short[] ordinals = new short[export_directory.NumberOfNames];
1286-
Marshal.Copy(name_ordinals, ordinals, 0, ordinals.Length);
1287-
1288-
Dictionary<int, string> ordinal_to_names = new Dictionary<int, string>();
1289-
for (int i = 0; i < name_vas.Length; ++i)
1290-
{
1291-
string name = Marshal.PtrToStringAnsi(name_vas[i]);
1292-
int ordinal = ordinals[i];
1293-
ordinal_to_names[ordinal] = name;
1294-
}
1305+
Dictionary<int, string> ordinal_to_names = GetNameToOrdinals(export_directory);
12951306

12961307
for (int i = 0; i < func_vas.Length; ++i)
12971308
{

0 commit comments

Comments
 (0)