返回

IDA逆向so时如何正确解析函数名?

Android

引言

在对so进行逆向分析时,我们经常会遇到函数名被混淆的情况,这给我们的分析工作带来了一定的困难。今天,我们就来探讨如何正确解析IDA中so的函数名,以便更好地理解和分析so的内部结构。

IDA的反编译机制

IDA在反编译so时,会将so中的函数名进行一定的转换,这主要是为了保护知识产权和防止反编译后的代码被轻易还原。转换后的函数名通常是形如"sub_12345678"这样的形式,其中"sub_"表示函数的前缀,后面的数字表示函数的地址。

正确解析函数名的原理

要正确解析函数名,我们需要了解IDA的反编译机制。IDA在反编译so时,会根据so中的函数调用信息来确定函数的名称。具体来说,IDA会根据函数调用时的偏移量来查找函数的地址,然后使用这个地址来确定函数的名称。

因此,如果我们要正确解析函数名,就需要找到函数调用的偏移量。幸运的是,IDA已经为我们提供了一个查找偏移量的方法。

使用IDA查找偏移量

  1. 在IDA中打开需要分析的so文件。
  2. 找到要解析函数名的函数调用。
  3. 右键点击函数调用,选择"Find references to..."命令。
  4. 在弹出的窗口中,选择"Call"选项,然后点击"OK"按钮。
  5. IDA会显示所有调用该函数的地址。

手动解析函数名

一旦我们找到了函数调用的偏移量,就可以手动解析函数名。具体步骤如下:

  1. 根据IDA显示的调用地址,找到函数在so中的地址。
  2. 使用十六进制编辑器打开so文件,并跳转到函数的地址。
  3. 在so文件中,找到函数调用的机器码。
  4. 根据机器码,确定函数调用的偏移量。
  5. 使用IDA中的"Functions"窗口,找到偏移量所指向的函数。
  6. 函数的名称就是IDA显示的名称。

使用脚本解析函数名

除了手动解析函数名之外,我们还可以使用脚本来自动解析。IDA提供了一个名为"idc"的脚本语言,可以用来实现各种自动化操作。

下面是一个使用idc脚本解析函数名的示例:

import idaapi

def parse_func_name(func_addr):
    """解析函数名"""
    for ref in idc.GetManyReferencesTo(func_addr):
        if ref.type == idaapi.dr_C:
            return idc.GetFunctionName(ref.frm)
    return None

func_addr = idaapi.get_func_attr(idaapi.here(), idaapi.FUNCATTR_START)
func_name = parse_func_name(func_addr)
if func_name is not None:
    print("函数名:%s" % func_name)
    else:
    print("无法解析函数名")

总结

正确解析函数名是IDA中so逆向分析的一个重要步骤。通过了解IDA的反编译机制和使用提供的工具,我们可以在逆向分析时更好地理解和分析so的内部结构。