Мой проект должен проверять файлы .c и .dll. он объединяет эти сведения для определения того, что он должен назвать, а затем вызывает это.Программно считывание вызываемых DLL-функций
Мне нужно проверить DLL, чтобы найти, какая DLL имеет какую функцию. Я дошел до того, что сопоставил dll в памяти, не инициализируя его. теперь мне нужно сопоставить заголовок с чем-то, чтобы я мог прочитать раздел, в котором есть вызываемые имена.
как я могу это сделать? это код до сих пор:
[DllImport("kernel32.dll")]
static extern IntPtr LoadLibraryEx(string lpFileName, IntPtr hReservedNull, LoadLibraryFlags dwFlags);
public static string[] GetFKTNames(string dll)
{
IntPtr lib = LoadLibraryEx(dll, IntPtr.Zero, LoadLibraryFlags.DONT_RESOLVE_DLL_REFERENCES);
//INDICATES WHAT I WANT TO DO, BUT DOES NOT WORk
//Header header = GetHeader(lib);
//Unload(lib);
//return header.Names;
}
EDIT # 2:
я сделал немного прогресса и бросить его на сегодняшний день ... есть 4 свободных дней, приезжающие сюда в германии ...
Я не совсем уверен, правильно ли это сортировка - у меня не было возможности проверить его. Я хотел бы прочитать книгу по этой теме - так что прокомментируйте, если вы знаете хорошую книгу, в которой объясняется, как работает этот заголовок и какие разные заголовки есть.
private static List<string> ListDLLFunctions(string sADllName)
{
List<string> names = new List<string>();
IntPtr LoadedImage = LoadLibraryEx(sADllName, IntPtr.Zero, LoadLibraryFlags.DONT_RESOLVE_DLL_REFERENCES);
IMAGE_NT_HEADERS header = (IMAGE_NT_HEADERS) Marshal.PtrToStructure(libPtr, typeof(IMAGE_NT_HEADERS));
// ImageExportDirectory = (_IMAGE_EXPORT_DIRECTORY*)
// ImageDirectoryEntryToData(LoadedImage.MappedAddress,
// false, IMAGE_DIRECTORY_ENTRY_EXPORT, &cDirSize);
// if (ImageExportDirectory != NULL)
// {
// dNameRVAs = (DWORD *)ImageRvaToVa(LoadedImage.FileHeader,
// LoadedImage.MappedAddress,
// ImageExportDirectory->AddressOfNames, NULL);
// for(size_t i = 0; i < ImageExportDirectory->NumberOfNames; i++)
// {
// sName = (char *)ImageRvaToVa(LoadedImage.FileHeader,
// LoadedImage.MappedAddress,
// dNameRVAs[i], NULL);
// slListOfDllFunctions.push_back(sName);
// }
// }
FreeLibrary(LoadedImage);
return names;
}
static void Main(string[] args)
{
List<string> names = ListDLLFunctions("KERNEL32.DLL");
}
После использования этой функции для нескольких небольших проектов я столкнулся с проблемой, что не все DLL-файлы могут быть удалены таким образом. У меня были проблемы, просто используя два разных компилятора ... так что предстоит большая работа ... но я изменю свой подход к основной проблеме. – Johannes