Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在可执行文件中定位函数所在的位置?_C++_C_Windows_Binary_Exe - Fatal编程技术网

C++ 如何在可执行文件中定位函数所在的位置?

C++ 如何在可执行文件中定位函数所在的位置?,c++,c,windows,binary,exe,C++,C,Windows,Binary,Exe,假设我将一个C/C++文件编译成二进制文件。比如,该文件定义了一个函数foo 如何在二进制文件中定位此函数?通过定位,我的意思是找到确切的位置 我假设这个问题取决于我们考虑的是Windows还是Linux,所以让我们假设可执行文件是PE格式的 编译器是否会删除所有命名,从而无法按名称定位函数?也就是说,我必须在二进制文件中进行模式搜索 我知道DLL有一个导出表,可以帮助在其中定位函数,但Windows上的可执行文件没有这样的表….EXE文件,这些函数可以由加载到该进程中的.DLL使用。如果要加载

假设我将一个C/C++文件编译成二进制文件。比如,该文件定义了一个函数foo

如何在二进制文件中定位此函数?通过定位,我的意思是找到确切的位置

我假设这个问题取决于我们考虑的是Windows还是Linux,所以让我们假设可执行文件是PE格式的

编译器是否会删除所有命名,从而无法按名称定位函数?也就是说,我必须在二进制文件中进行模式搜索

我知道DLL有一个导出表,可以帮助在其中定位函数,但Windows上的可执行文件没有这样的表…

.EXE文件,这些函数可以由加载到该进程中的.DLL使用。如果要加载插件并希望提供某种插件API/SDK,这是最好的选择。然后,您可以通过在进程内的任何代码中执行GetProcedDressGetModuleHandle0、MyFunction来查找函数。DLL还可以直接链接到函数,加载程序将解析它们,就像它们在.DLL中导出一样

另一个选项是在.EXE中嵌入符号/调试信息,然后使用查找函数


您还可以让链接器生成一个.MAP文件,列出每个函数及其地址,但在手动调试进程时,该文件最有用。

该信息不会存储在二进制映像中。您需要PDB或地图文件。这些文件是什么?从没听说过他们。又名PDB文件。再加上一些关于地图文件的信息,我的想法是编译一个函数,将一些标识符存储在一个函数的二进制代码中,一个简单的水印,但它似乎比预期的更难提取;这听起来像是一场灾难。你最终想要实现什么?我以为只有Linux允许可执行文件导出函数?映射文件是列出了函数在二进制文件中的位置还是只列出了它的RVA运行时地址?@Shuzheng:你已经知道答案了。在链接时生成.MAP文件。链接器无法知道模块将在运行时加载到哪里。此外,RVA中的R是相对的缩写。RVA是模块相对的。