如何从visual c ++中的exe文件中获取“入口点的地址”?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从visual c ++中的exe文件中获取“入口点的地址”?相关的知识,希望对你有一定的参考价值。

我在Visual Studio 2008中编写C ++应用程序,需要通过读取可执行文件来获取入口点的地址。我怎么能得到这个?

答案

IMAGE_NT_HEADERS的帮助下,您可以访问任何可执行文件的入口点。

typedef struct _IMAGE_NT_HEADERS {
  DWORD                 Signature;
  IMAGE_FILE_HEADER     FileHeader;
  IMAGE_OPTIONAL_HEADER OptionalHeader;
} IMAGE_NT_HEADERS, *PIMAGE_NT_HEADERS;

从上面的结构IMAGE_OPTIONAL_HEADER具有AddressOfEntryPoint成员变量来访问入口点的地址。

以下小代码将帮助您更多:

FILE *executable; 
executable= fopen("YourExe.exe","rb");

IMAGE_NT_HEADERS executableInformation;
fread(&executableInformation,sizeof(executableInformation),1,executable);

注意:代码未经过测试,可能有错误。

另一答案

找到以下方法来查找入口点的地址以及读取各种标头参数。

LPCSTR fileName; //exe file to parse
HANDLE hFile; 
HANDLE hFileMapping;
LPVOID lpFileBase;
PIMAGE_DOS_HEADER dosHeader;
PIMAGE_NT_HEADERS peHeader;

hFile = CreateFileA(fileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);

if(hFile==INVALID_HANDLE_VALUE)
{
    printf("
 CreateFile failed in read mode 
");
    return 1;
}

hFileMapping = CreateFileMapping(hFile,NULL,PAGE_READONLY,0,0,NULL);

if(hFileMapping==0)
{
    printf("
 CreateFileMapping failed 
");
    CloseHandle(hFile);
    return 1;
}

lpFileBase = MapViewOfFile(hFileMapping,FILE_MAP_READ,0,0,0);

if(lpFileBase==0)
{
    printf("
 MapViewOfFile failed 
");
    CloseHandle(hFileMapping);
    CloseHandle(hFile);
    return 1;
}

dosHeader = (PIMAGE_DOS_HEADER) lpFileBase;  //pointer to dos headers

if(dosHeader->e_magic==IMAGE_DOS_SIGNATURE)
{
    //if it is executable file print different fileds of structure
    //dosHeader->e_lfanew : RVA for PE Header
    printf("
 DOS Signature (MZ) Matched");

    //pointer to PE/NT header
    peHeader = (PIMAGE_NT_HEADERS) ((u_char*)dosHeader+dosHeader->e_lfanew);

    if(peHeader->Signature==IMAGE_NT_SIGNATURE)
    {
        printf("
 PE Signature (PE) Matched 
");

        //address of entry point
        //peHeader->OptionalHeader.AddressOfEntryPoint

    }
    UnmapViewOfFile(lpFileBase);
    CloseHandle(hFileMapping);
    CloseHandle(hFile);
    return 0;
}
else
{
    printf("
 DOS Signature (MZ) Not Matched 
");
    UnmapViewOfFile(lpFileBase);
    CloseHandle(hFileMapping);
    CloseHandle(hFile);
    return 1;
}

以上是关于如何从visual c ++中的exe文件中获取“入口点的地址”?的主要内容,如果未能解决你的问题,请参考以下文章

如何防止引用程序集的嵌入式依赖项被复制到Visual Studio中的输出文件夹?

Visual studio 2019中如何将C/C++程序生成为.exe文件或者是文件夹(文件夹里面有主程序以及其他部分)?

如何从 Visual Studio 命令提示符以外的命令行运行 regasm.exe?

Visual Studio C/C++ 中的多个构建目标

Visual Studio代码:C ++编译参数-o

C++,Visual Studio 2017:从加载的 .dll 中访问 .exe 的全局变量 [重复]