AFAIK, idc.getType
работают только с функциями C.Поскольку вы используете C ++, имя искажено .
Вот быстрый тест, который я сделал:
#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;
}
Компиляция, тест:
neitsa@eagle:/mnt/temp/gpp$ g++ -o test test.cpp
neitsa@eagle:/mnt/temp/gpp$ ./test hello world
hello world
В 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
Итак, технически (искаженное) имя функции: _Z4testRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_
Поскольку тип аргументов предоставляется символической информацией (т. Е. Если вы удалите двоичный файл, у вас больше не будет доступа к этой информации! За исключением случая RTTI , который также может предоставлять информацию такого типа), единственный способ получить их - разобрать имя и затем проанализировать его:
Получить имя:
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&)
Если у вас есть такая возможность, вы можете проанализировать прототип функции и извлечь типы параметров (что может быть нелегко для C ++ ...).
Возможно, вы захотите попробоватьINF_LONG_DN
, который, кажется, добавляет пробелы после каждого аргумента.Это может помочь при разборе:
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&)
Примечание: попробуйте с strip <program> -o <program_stripped>
, вы увидите, что имя функции просто не будет здесь больше.