我想加载我在IDA Pro中反编译的函数。我所拥有的只是IDA Pro功能名称sub_xxxx(),显然还有地址。我曾考虑过使用dlopen来加载二进制文件,但是显然,由于二进制文件已被剥离,因此我没有符号要加载。我可以以某种方式调用没有符号表的函数吗?还是我必须重建二进制文件的符号表才能使用dlsym定位和加载符号?

#1 楼

您可以在任何地址调用函数。因此,将动态库加载到您的进程地址空间中,找出新加载的库的基础,并从您不希望调用的函数的库的基础上获取偏移量,并将其加在一起。

因此,如果IDA说二进制文件的基数是0x4000,而您的函数位于地址0x4100,则偏移量为0x100。然后,如果您加载库,最终将加载到地址0x8000,则使一个函数指针(当然具有正确的签名)指向地址0x8000 + 0x100并调用它。根据平台的不同,从平台加载器获取的动态库的基础可能会与实际的IDA显示的基础进一步抵触。到动态库,并让加载程序实际处理所有重定位。它将更加可靠,使您可以为函数命名一个合理的名称,以便您可以通过将新导出重新添加到新版本中来处理函数地址更改的库的将来更新。使用BinDiff之类的东西来查找函数的新位置。

第三个流行的选择是使用类似于IDA FLIRT签名的东西,以便直接在内存中扫描加载的动态库中的函数。通常将其称为签名扫描,这是Windows平台上对该概念的更详尽说明。非常简化,这是一种基于从函数序言中提取的模式来查找函数的技术。没有来源。在这种情况下,如果您知道该库永远不会更改,那么我可能会选择第二个或第一个选项。

评论


我喜欢第一个选项,我正在考虑使用dlopen打开库,但是如何在代码中获取已加载库的地址?我可以看一下/ proc / maps等,但是最好用代码来抓取它。

– allbabel
2014年6月6日下午6:42

@allbabel我自己还没有做过,但是您可以使用library = dlopen(“ path”,RTLD_NOW),然后使用address = dlsym(library,“ some_known_exported_function”)。然后从已知的导出函数中获取函数的偏移量,并将其添加到dlsym返回的值中?

–彼得·安德森(Peter Andersson)
14年6月13日在20:01



#2 楼

我不知道您的确切情况。但是,如果只剥离了二进制文件(或使用了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节之类的可选数据。