假设我将C / C ++文件编译为二进制文件。比如说,该文件定义了一个函数foo()
。
如何在二进制文件中找到此函数?通过定位,我的意思是找到确切的位置。
我认为这个问题取决于我们是在考虑Windows还是Linux,所以假设可执行文件是PE格式。
编译器是否擦除了所有命名,因此无法按名称定位函数?也就是说,我必须在二进制文件中进行模式搜索?
我知道DLL有一个导出表,可以帮助定位函数,但Windows上的可执行文件没有这样的表...
答案 0 :(得分:1)
.EXE文件can export functions和加载到该进程的.DLL可以使用这些函数。如果您要加载插件并希望提供某种插件API / SDK,这是最佳选择。然后,您可以通过在进程内部的任何代码中执行GetProceAddress(GetModuleHandle(0), "MyFunction")
来查找函数。 .DLL也可以直接链接到函数,加载器将解析它们,就好像它们是以.DLL导出一样。
另一种选择是在.EXE中嵌入符号/调试信息,然后使用DbgHelp functions查找函数。
您还可以让链接器生成一个.MAP文件,该文件列出了每个函数及其地址,但在手动调试进程时它非常有用。