返回
IDA逆向so时如何正确解析函数名?
Android
2023-11-25 07:54:34
引言
在对so进行逆向分析时,我们经常会遇到函数名被混淆的情况,这给我们的分析工作带来了一定的困难。今天,我们就来探讨如何正确解析IDA中so的函数名,以便更好地理解和分析so的内部结构。
IDA的反编译机制
IDA在反编译so时,会将so中的函数名进行一定的转换,这主要是为了保护知识产权和防止反编译后的代码被轻易还原。转换后的函数名通常是形如"sub_12345678"这样的形式,其中"sub_"表示函数的前缀,后面的数字表示函数的地址。
正确解析函数名的原理
要正确解析函数名,我们需要了解IDA的反编译机制。IDA在反编译so时,会根据so中的函数调用信息来确定函数的名称。具体来说,IDA会根据函数调用时的偏移量来查找函数的地址,然后使用这个地址来确定函数的名称。
因此,如果我们要正确解析函数名,就需要找到函数调用的偏移量。幸运的是,IDA已经为我们提供了一个查找偏移量的方法。
使用IDA查找偏移量
- 在IDA中打开需要分析的so文件。
- 找到要解析函数名的函数调用。
- 右键点击函数调用,选择"Find references to..."命令。
- 在弹出的窗口中,选择"Call"选项,然后点击"OK"按钮。
- IDA会显示所有调用该函数的地址。
手动解析函数名
一旦我们找到了函数调用的偏移量,就可以手动解析函数名。具体步骤如下:
- 根据IDA显示的调用地址,找到函数在so中的地址。
- 使用十六进制编辑器打开so文件,并跳转到函数的地址。
- 在so文件中,找到函数调用的机器码。
- 根据机器码,确定函数调用的偏移量。
- 使用IDA中的"Functions"窗口,找到偏移量所指向的函数。
- 函数的名称就是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的内部结构。