use CResourceEditor helper methods
git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@4631 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
parent
90422d4789
commit
d2ab1be975
1 changed files with 35 additions and 37 deletions
|
@ -8,6 +8,7 @@
|
||||||
#include "Plugins.h"
|
#include "Plugins.h"
|
||||||
#include "Platform.h"
|
#include "Platform.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
#include "ResourceEditor.h"
|
||||||
|
|
||||||
#include "dirreader.h"
|
#include "dirreader.h"
|
||||||
|
|
||||||
|
@ -85,55 +86,52 @@ vector<unsigned char> read_file(const string& filename) {
|
||||||
void Plugins::GetExports(const string &pathToDll, bool displayInfo)
|
void Plugins::GetExports(const string &pathToDll, bool displayInfo)
|
||||||
{
|
{
|
||||||
vector<unsigned char> dlldata;
|
vector<unsigned char> dlldata;
|
||||||
|
PIMAGE_NT_HEADERS NTHeaders;
|
||||||
try {
|
try {
|
||||||
dlldata = read_file(pathToDll);
|
dlldata = read_file(pathToDll);
|
||||||
} catch (NSISException&) {
|
NTHeaders = CResourceEditor::GetNTHeaders(&dlldata[0]);
|
||||||
|
} catch (std::runtime_error&) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const string dllName = remove_file_extension(get_file_name(pathToDll));
|
const string dllName = remove_file_extension(get_file_name(pathToDll));
|
||||||
|
|
||||||
LONG lfanew = FIX_ENDIAN_INT32(PIMAGE_DOS_HEADER(&dlldata[0])->e_lfanew);
|
FIX_ENDIAN_INT16_INPLACE(NTHeaders->FileHeader.Characteristics);
|
||||||
PIMAGE_NT_HEADERS NTHeaders = PIMAGE_NT_HEADERS(&dlldata[0] + lfanew);
|
if (NTHeaders->FileHeader.Characteristics & IMAGE_FILE_DLL)
|
||||||
if (NTHeaders->Signature == IMAGE_NT_SIGNATURE)
|
|
||||||
{
|
{
|
||||||
FIX_ENDIAN_INT16_INPLACE(NTHeaders->FileHeader.Characteristics);
|
FIX_ENDIAN_INT32_INPLACE(NTHeaders->OptionalHeader.NumberOfRvaAndSizes);
|
||||||
if (NTHeaders->FileHeader.Characteristics & IMAGE_FILE_DLL)
|
if (NTHeaders->OptionalHeader.NumberOfRvaAndSizes <= IMAGE_DIRECTORY_ENTRY_EXPORT) return;
|
||||||
|
|
||||||
|
DWORD ExportDirVA = NTHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;
|
||||||
|
DWORD ExportDirSize = NTHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size;
|
||||||
|
PIMAGE_SECTION_HEADER sections = IMAGE_FIRST_SECTION(NTHeaders);
|
||||||
|
|
||||||
|
FIX_ENDIAN_INT32_INPLACE(ExportDirVA);
|
||||||
|
FIX_ENDIAN_INT32_INPLACE(ExportDirSize);
|
||||||
|
|
||||||
|
WORD num_sections = FIX_ENDIAN_INT16(NTHeaders->FileHeader.NumberOfSections);
|
||||||
|
|
||||||
|
for (DWORD i = 0; i < num_sections; i++)
|
||||||
{
|
{
|
||||||
FIX_ENDIAN_INT32_INPLACE(NTHeaders->OptionalHeader.NumberOfRvaAndSizes);
|
DWORD va = FIX_ENDIAN_INT32(sections[i].VirtualAddress);
|
||||||
if (NTHeaders->OptionalHeader.NumberOfRvaAndSizes <= IMAGE_DIRECTORY_ENTRY_EXPORT) return;
|
if (va <= ExportDirVA
|
||||||
|
&& va + FIX_ENDIAN_INT32(sections[i].Misc.VirtualSize) >= ExportDirVA + ExportDirSize)
|
||||||
DWORD ExportDirVA = NTHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;
|
|
||||||
DWORD ExportDirSize = NTHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size;
|
|
||||||
PIMAGE_SECTION_HEADER sections = IMAGE_FIRST_SECTION(NTHeaders);
|
|
||||||
|
|
||||||
FIX_ENDIAN_INT32_INPLACE(ExportDirVA);
|
|
||||||
FIX_ENDIAN_INT32_INPLACE(ExportDirSize);
|
|
||||||
|
|
||||||
WORD num_sections = FIX_ENDIAN_INT16(NTHeaders->FileHeader.NumberOfSections);
|
|
||||||
|
|
||||||
for (DWORD i = 0; i < num_sections; i++)
|
|
||||||
{
|
{
|
||||||
DWORD va = FIX_ENDIAN_INT32(sections[i].VirtualAddress);
|
DWORD prd = FIX_ENDIAN_INT32(sections[i].PointerToRawData);
|
||||||
if (va <= ExportDirVA
|
PIMAGE_EXPORT_DIRECTORY exports = PIMAGE_EXPORT_DIRECTORY(&dlldata[0] + prd + ExportDirVA - va);
|
||||||
&& va + FIX_ENDIAN_INT32(sections[i].Misc.VirtualSize) >= ExportDirVA + ExportDirSize)
|
DWORD na = FIX_ENDIAN_INT32(exports->AddressOfNames);
|
||||||
|
unsigned long *names = (unsigned long*)((unsigned long) exports + (char *) na - ExportDirVA);
|
||||||
|
for (unsigned long j = 0; j < FIX_ENDIAN_INT32(exports->NumberOfNames); j++)
|
||||||
{
|
{
|
||||||
DWORD prd = FIX_ENDIAN_INT32(sections[i].PointerToRawData);
|
const string name = string((char*)exports + FIX_ENDIAN_INT32(names[j]) - ExportDirVA);
|
||||||
PIMAGE_EXPORT_DIRECTORY exports = PIMAGE_EXPORT_DIRECTORY(&dlldata[0] + prd + ExportDirVA - va);
|
const string signature = dllName + "::" + name;
|
||||||
DWORD na = FIX_ENDIAN_INT32(exports->AddressOfNames);
|
const string lcsig = lowercase(signature);
|
||||||
unsigned long *names = (unsigned long*)((unsigned long) exports + (char *) na - ExportDirVA);
|
m_command_to_path[lcsig] = pathToDll;
|
||||||
for (unsigned long j = 0; j < FIX_ENDIAN_INT32(exports->NumberOfNames); j++)
|
m_command_lowercase_to_command[lcsig] = signature;
|
||||||
{
|
if (displayInfo)
|
||||||
const string name = string((char*)exports + FIX_ENDIAN_INT32(names[j]) - ExportDirVA);
|
fprintf(g_output, " - %s\n", signature.c_str());
|
||||||
const string signature = dllName + "::" + name;
|
|
||||||
const string lcsig = lowercase(signature);
|
|
||||||
m_command_to_path[lcsig] = pathToDll;
|
|
||||||
m_command_lowercase_to_command[lcsig] = signature;
|
|
||||||
if (displayInfo)
|
|
||||||
fprintf(g_output, " - %s\n", signature.c_str());
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue