我的項目需要檢查.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;
}
編輯#2:
我做了一點點進步,並退出它今天...有4天自由這裏即將在德國...
我不完全確定那個編組是否正確 - 我無法測試它。我很想閱讀關於該主題的一本書 - 所以請評論一下,如果你知道一本好書,解釋這個headertuff是如何工作的,以及那裏有哪些不同的頭文件。
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 2012-04-28 08:35:00