安卓逆向 -- SO文件逆向分析
在安卓逆向工程中,SO文件(Shared Object文件)的逆向分析是一个重要环节。SO文件通常包含原生代码(如C/C++),这些代码在安卓应用中执行性能较高的任务,如加密、解密、图像处理等。以下是对SO文件进行逆向分析的详细步骤:
一、确定目标函数
首先,我们需要确定要逆向分析的目标函数。在上节课中,我们已经找到了get3deskey函数,这是一个原生函数,用于获取3DES加密的密钥。
二、提取SO文件
接下来,我们需要从APK文件中提取SO文件。APK文件实际上是一个ZIP压缩包,可以使用解压工具(如WinRAR、7-Zip等)进行解压。在解压后的文件中,找到lib文件夹,里面包含了针对不同CPU架构的SO文件。选择与目标设备CPU架构相匹配的SO文件进行分析。
三、使用IDA Pro进行分析
将提取的SO文件拖入IDA Pro(Interactive Disassembler)中进行分析。IDA Pro是一款强大的反汇编工具,能够加载SO文件并生成对应的汇编代码。当IDA Pro的输出框显示“finished”时,说明SO文件已经加载完毕。
四、查找目标函数
在IDA Pro中,我们可以通过导出函数列表来查找目标函数。在导出函数输入框中输入get3deskey,即可查找到该函数。
五、分析函数内容
进入get3deskey函数后,我们可以按空格键切换视图,以便更清楚地查看函数内容。在函数中,我们可以找到硬编码的密钥值。
六、反编译成伪C代码
虽然汇编代码对于理解函数逻辑很有帮助,但有时候我们更希望看到更高层次的代码表示。IDA Pro提供了反编译功能,可以将汇编代码反编译成伪C代码。然而,需要注意的是,反编译生成的伪C代码可能并不完全准确,因为汇编代码与高级语言之间存在语义上的差异。
七、导入Jni.h文件帮助解析
为了更好地理解伪C代码,我们可以导入Jni.h文件来帮助解析。Jni.h文件包含了JNI(Java Native Interface)的相关定义,这些定义有助于我们理解SO文件中函数与Java代码之间的交互。在IDA Pro中,点击“File”->“Load File”->“Parse C Header File”,然后选择Jni.h文件进行导入。
八、修改参数类型
在伪C代码中,函数的参数类型可能显示为通用类型(如int、void*等)。为了更准确地理解函数参数的含义,我们可以根据JNI规范修改参数类型。例如,我们知道SO文件中的函数第一个参数通常是JNIEnv*类型,因此我们可以右击第一个参数类型,选择“Convert to struct”,然后选择JNIEnv。
九、识别函数
经过上述步骤后,IDA Pro可能会识别出部分函数,并在伪C代码中以更可读的形式展示。这有助于我们更好地理解函数之间的调用关系和数据流。
十、隐藏类型转换
为了进一步提高伪C代码的可读性,我们可以右击选择“Hide casts”,隐藏不必要的类型转换。这样会使代码看起来更加清晰。
十一、查看常量
最后,我们可以双击进入DES3_KEY等常量定义处,查看具体的常量值。这些常量值可能是硬编码的密钥、算法参数等,对于理解函数的加密逻辑至关重要。
通过以上步骤,我们可以对SO文件中的目标函数进行逆向分析,提取出硬编码的密钥值或算法参数,进而理解函数的加密逻辑。需要注意的是,逆向分析是一项技术活动,必须遵守法律法规和道德规范,不得用于非法用途。