如何正确获取DLL文件的内容进行PE解析?

时间:2016-07-05 05:17:27

标签: file c++11 dll io portable-executable

我试图在kernel32.dll中获取函数的RVA,这意味着我需要使用偏移量来查找文件中的不同结构,直到我可以获得IMAGE_EXPORT_DIRECTORY结构。但是我知道很多方法和方法来获取文件的内容解释并留下某些字符和东西,这将使这几乎是不可能完成的任务。所以我想知道将dll文件的内容复制到字符数组中的最佳方法。

更新:对于任何有兴趣的人,我创建了一个将dll映射到内存的函数。

void* GetFileImage(char path[])
{
    HANDLE hFile = CreateFile(path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL);
    if(hFile == INVALID_HANDLE_VALUE){return NULL;}

    HANDLE file_map = CreateFileMapping(hFile, NULL, PAGE_READONLY|SEC_IMAGE, 0, 0, "KernelMap");
    if(file_map == INVALID_HANDLE_VALUE){return NULL;}

    LPVOID file_image = MapViewOfFile(file_map, FILE_MAP_READ, 0, 0, 0);
    if(file_image == 0){return NULL;}

    return file_image;
}

1 个答案:

答案 0 :(得分:0)

有多种方法。尽管如此,并不是那么多。

1.如果您尝试解析系统启动时加载到内存中的系统加载文件(如kernel32.dll),您可以直接使用GetModuleHandle获取加载的基址并开始解析PE(假设您熟悉dll及其导出的PE结构和静态/延迟加载)。

2.如果您尝试解析的DLL不是系统加载的,则可以使用LoadLibrary加载它们,这将返回加载的基址,从而使您能够解析PE。 / p>

3.您也可以CreatFileMapping/MapViewOfFile映射您自己的虚拟内存中的dll进行解析。

@David Thomas建议的msdn文章将有很大的帮助:: Peering Inside the PE