我想加载我在 IDA Pro 中反编译的函数。我所拥有的只是 IDA Pro 函数名称sub_xxxx()
和地址。我曾想过使用dlopen
来加载二进制文件,但显然我没有要加载的符号,因为二进制文件已被剥离。我可以在没有符号表的情况下以某种方式调用该函数吗?或者我是否必须重建二进制文件的符号表然后用于dlsym
定位和加载符号?
重建符号表
您可以在任何地址调用函数。因此,将动态库加载到您的进程地址空间中,找出新加载库的基址,并从您不想调用的函数的库基址中获取偏移量,然后将其相加。
因此,如果 IDA 说二进制文件的基址是0x4000
并且您的函数在地址处0x4100
,那么您的偏移量为0x100
. 然后,如果您加载您的库,它最终会在 address 加载0x8000
,您可以创建一个指向address的函数指针(当然带有正确的签名)0x8000 + 0x100
并调用它。根据您的平台,您从平台加载器获得的动态库的基础可能与实际的基础 IDA 显示有进一步的偏差。
当然,另一种选择是为您的sub_xxx()
函数添加一个新的导出定义到动态库,并让加载程序实际处理任何重定位。它将更加可靠,允许您将函数命名为合理的名称,以便您可以通过将新导出重新添加到新版本来处理函数地址更改的库的未来更新。使用类似BinDiff 的东西来查找函数的新位置。
第三个流行的选择是使用类似于IDA FLIRT签名的东西,以便直接在内存中扫描加载的动态库中的函数。它通常称为签名扫描,这里是 Windows 平台上对该概念的更全面的解释。非常简化,它是一种基于从函数序言中提取的模式来查找函数的技术。
在您的情况下,您可以从我所看到的内容中控制应用程序,并希望调用您没有源代码的动态库。在这种情况下,如果您知道库永远不会改变,我可能会选择第二个选项或第一个选项。
我不知道你的具体情况。但是,如果二进制文件只是被剥离(或使用了 sstrip)并且您的函数只是对动态库的外部符号的调用,您可能想看看我的这个小 IDA python 脚本:http://h4des .org/blog/index.php?/archives/343-Restoring-external-symbol-calls-in-IDA-when-ELF-sections-are-deleted.html
该脚本使用我编写的 ELF 解析器库(称为 ZwoELF),该库尝试仅使用 ELF 加载器使用的信息来规避我测试过的几乎所有分析工具/框架都存在的问题,因为它们依赖于诸如 ELF 部分之类的可选数据。