对于没有源代码的二进制函数,有没有办法获得参数的数量

时间:2009-08-12 13:30:59

标签: linux solaris

我没有源代码但是有二进制文件。使用命令“nm binary_name”,我可以知道二进制文件中的函数。

我可以知道函数有多少参数吗?在solaris下,无论如何都要这样做吗?

例如,如果函数是:func1(一个int,b int,c int),则有3个参数。

由于 丹尼尔

4 个答案:

答案 0 :(得分:3)

没有。 Neil Butterworth建议检查函数签名对于C ++是一个很好的建议(因为参数通常被编码到函数中,因此链接器可以区分"int x(int)""int x(float)"之间的区别)但是,对于C ,你将不得不弄脏并拆卸这个功能,特别注意堆栈框架是如何在你的环境中构建和使用的。

请记住,SPARC具有旋转窗口堆栈而不是常规的成长堆栈。你真的要深入研究CPU的工作方式。如果您正在谈论Solaris for Intel,那么旋转堆栈当然不存在。

答案 1 :(得分:1)

假设这是C代码,那么就没有了 - 编译器/链接器省略了该信息。如果它是C ++代码,则可能保留函数的受损名称并包含编码形式的参数。

答案 2 :(得分:0)

在最低级别,如果您模拟机器上运行的函数,那么它将从寄存器或未写入的堆栈中读取一些信息。如果将这些读取与平台的ABI进行比较(您没有说它是Sparc Solaris还是Intel Solaris),那么它们中的一些应该对应于函数参数的寄存器/堆栈位置。当然,不能保证函数会读取所有参数。

对于Solaris,elfdump可能提供的信息比nm更多(快速google for elfdump签名表示已请求并添加了支持,但您需要检查已获得的版本)< / p>

答案 3 :(得分:0)

IDA Pro(http://www.hex-rays.com/idapro/)是一个反汇编程序,它非常聪明地从目标代码推断函数的参数; 也许还有你可以使用的符号信息;例如。在Win32上,符号_function @ 8显示传递了8个字节(2个参数) 也可以解析C ++名称以获取参数和类型