Binary 为什么idapython得到的函数与使用IDA在函数窗口中显示的函数不同?

Binary 为什么idapython得到的函数与使用IDA在函数窗口中显示的函数不同?,binary,disassembly,ida,Binary,Disassembly,Ida,我试图使用IDA Pro分析自己在Linux上编写和编译的二进制文件。在函数窗口中,IDA显示函数实验(std::string,int,std::string)。B 下面是我做的一个快速测试: #include <iostream> #include <string> void test(const std::string& s1, const std::string& s2) { std::cout << s1 <<

我试图使用IDA Pro分析自己在Linux上编写和编译的二进制文件。在函数窗口中,IDA显示函数
实验(std::string,int,std::string)。B
Python>for i in idautils.Functions():
Python>    name =  idaapi.get_func_name(i)
Python>    if name.startswith('_Z10experimentSsiSs') or name.startswith('experiment'):
Python>        print name
Python>        print idc.GetType(i)
结果是

\u z10ssis
无


没有函数被命名为
实验
,函数类型
\u z10experimentssis
(似乎是函数
实验()
)为无。我想获取所有函数的参数,但如上所述,我无法获取函数的信息(_z10experimentssis),甚至我也无法找到函数(experience)。为什么会这样?我该怎么办?

AFAIK,
idc.getType
仅适用于C函数。当你使用C++时,名字是.< /p> 下面是我做的一个快速测试:

#include <iostream>
#include <string>


void test(const std::string& s1, const std::string& s2)
{
    std::cout << s1 << " " << s2 << std::endl;

    return;
}

int main(int argc, char* argv[])
{
    if(argc != 3)
    {
        std::cerr << "2 args needed" << std::endl;
        return -1;
    }

    test(argv[1], argv[2]);

    return 0;    
}
在IDA(我使用的是7.2)中,
test
函数有一个(怪物):

.text:0000000000000CBA ; test(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&)
.text:0000000000000CBA                 public _Z4testRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_
.text:0000000000000CBA _Z4testRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ proc near
Demangle it:

Python>idc.Demangle(idaapi.get_func_name(0xcba), idc.GetLongPrm(idc.INF_SHORT_DN))
test(std::__cxx11::basic_string<char,std::char_traits<char>,std::allocator<char>> const&,std::__cxx11::basic_string<char,std::char_traits<char>,std::allocator<char>> const&)
注意:请尝试使用
strip-o
,您将看到函数名将不再出现在这里

Python>idaapi.get_func_name(0xcba)
_Z4testRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_
Python>idc.Demangle(idaapi.get_func_name(0xcba), idc.GetLongPrm(idc.INF_SHORT_DN))
test(std::__cxx11::basic_string<char,std::char_traits<char>,std::allocator<char>> const&,std::__cxx11::basic_string<char,std::char_traits<char>,std::allocator<char>> const&)
Python>idc.Demangle(idaapi.get_func_name(0xcba), idc.GetLongPrm(idc.INF_LONG_DN))
test(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&)