如何解释损坏的函数名称?

逆向工程 二元分析
2021-06-18 09:54:06

我首先要说的是,这是我第四次尝试对 Crackme 进行逆向工程,我开始了解组装的工作原理,这很酷。如果这个问题是错误的或者我使用了错误的术语,我很抱歉。

我正在使用 IDA 反转 mach-0 二进制文件。当我检查它时,我发现有数百个名字奇怪的函数,像这样

j___ZNSt3__1plIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12basic_stringIT_T0_T1_EEPKS6_RKS9_

现在,这看起来不像是纯粹的垃圾。我可以从中“提取”以下内容:char_traits、分配器、basic_string。

显然它对字符串做了一些事情,就像以前一样,有以下说明:

lea rsi, goodWork ; "Good work!"
lea rdx, _cido ; _cido in IDA is shown to do -> and [rax], eax ; I have no idea what that means
lea rdi, [rbp+var] ; the only occurrence of var before is at the start -> var = qword ptr - 1C0H ; as always, no idea of what is this
call to_the_function_I_wrote_before
jmp $+5

是否有一种技术/方法可以了解此功能的作用?

编辑:

这已被标记为重复。不是。您链接的问题仅对函数名称进行了破坏,这是 IDA 自动执行的操作。

我需要了解这个函数到底做了什么。demangled 函数名对我来说和 mangled 函数名一样有用。我不明白。我需要一些指导。

1个回答

这实际上是一个非常简单的 C++ 字符串函数。只是,在幕后,C++std::string类实际上是模板的 typedef。

typedef basic_string<char> string;

basic_string 本身被声明为 -

template< class CharT, 
          class Traits = std::char_traits<CharT>, 
          class Allocator = std::allocator<CharT>
        > class basic_string;

换句话说,astd::string真的是一个——

std::basic_string< char, std::char_traits<char>, std::allocator<char> >

将此反向应用于您的损坏名称和(并删除 __1 的 - 见下文)您的函数只是标准库字符串函数 -

std::string operator+( char const* lhs, std::string const& rhs )

这将连接一个 C 样式字符串和一个 std::string,将结果作为新的 std::string 返回。

这个函数是从 x86-64 汇编语言中调用的,如下所示 -

  • rdi 是指向调用者为返回的 std::string 分配的内存的指针
  • rsi 是第一个参数,因此是指向 C 样式(零终止)字符串的指针
  • rdx 是第二个参数,因此是对 C++ std::string 的引用(或指针是汇编语言术语)

可以在此处找到有关调用约定的详细信息AMD64 ABI


在上面,我忽略了符号的 __1 部分。有关这些来源的详细信息,请参阅以下问题: