行业解决方案
查看所有行业解决方案
IDA 用于解决软件行业的关键问题。
发布时间:2026-07-28 08: 22: 00
Android应用中的Native代码通常保存在APK的SO文件中,Java或Kotlin代码通过JNI调用这些本地函数。使用IDA Pro分析时,需要先从APK中找到实际加载的SO,再判断Native方法采用静态注册还是动态注册。处理“IDA Pro反编译APK时怎么定位Native代码IDA Pro反编译APK后Java层和SO层怎么对应”时,可以按照提取SO、查找Java声明、定位JNI函数和核对参数签名的顺序进行。
一、IDA Pro反编译APK时怎么定位Native代码
定位Native代码不能直接把APK整体放进IDA Pro分析,需要先确认APK中包含哪些SO文件,以及Java层实际加载了哪一个库。
1、从APK中提取SO文件
①复制一份APK文件,使用解压缩软件直接打开。
②进入APK内部的lib目录。
③查看arm64-v8a、armeabi-v7a、x86和x86_64等架构目录。
④根据测试设备和目标应用架构,选择对应目录中的SO文件。
⑤将SO文件单独解压到电脑。
⑥使用IDA Pro打开SO文件,等待自动分析完成。
同一个APK可能包含多个架构版本。分析64位ARM应用时,应优先打开arm64-v8a目录中的SO,避免指令集和函数地址不一致。
2、确定Java层加载了哪个SO
①使用JADX打开APK。
②打开全局搜索,输入System.loadLibrary。
③找到类似下面的代码:
System.loadLibrary("native-lib");
④记录括号中的库名称native-lib。
⑤回到APK的lib目录,查找libnative-lib.so。
⑥使用IDA Pro打开对应SO文件。
System.loadLibrary中的名称一般不带lib前缀和.so后缀。代码中填写native-lib,实际文件通常是libnative-lib.so。
部分应用会使用System.load加载完整路径,也可能通过自定义加载器调用dlopen。没有找到System.loadLibrary时,可以继续搜索以下内容:
<1>System.load
<2>Runtime.getRuntime().loadLibrary
<3>dlopen
<4>SO文件名称
3、查找Java层的Native方法
①在JADX中全局搜索关键字native。
②打开包含Native声明的类。
③记录完整包名和类名。
④记录方法名称、参数类型和返回类型。
⑤检查该方法被哪些Java代码调用。
⑥同时记录所在类附近加载的SO名称。
例如Java层出现:
public native String getToken(int type);
需要记录以下信息:
<1>类路径:com.example.demo.NativeBridge
<2>方法名称:getToken
<3>参数类型:int
<4>返回类型:String
二、IDA Pro反编译APK后Java层和SO层怎么对应
Java方法与SO函数的对应方式主要分为静态注册和动态注册。静态注册可以根据函数名称直接查找,动态注册则需要定位JNI注册表。
1、查找静态注册函数
①在IDA Pro中打开目标SO。
②进入【视图】→【打开子视图】→【导出项】。
③在导出项列表中搜索Java_。
④查找与Java包名、类名和方法名对应的函数。
⑤双击目标函数跳转到代码位置。
⑥按F5生成伪代码。
例如:
Java_com_example_demo_NativeBridge_getToken
可以拆分为:
<1>com_example_demo对应包名com.example.demo
<2>NativeBridge对应类名
<3>getToken对应Java方法名
如果Java方法名中包含下划线,JNI函数名称中可能使用_1表示原始下划线。存在方法重载时,函数名称后面还可能附带参数签名编码。
2、查找动态注册函数
动态注册不会保留完整的Java_函数名称,Native函数在IDA Pro中可能只显示为sub_xxxxx。
①打开IDA Pro的【函数】窗口。
②搜索并进入JNI_OnLoad。
③按F5查看JNI_OnLoad伪代码。
④在【导入项】窗口中搜索RegisterNatives。
⑤选中RegisterNatives,按X查看交叉引用。
⑥进入调用位置,查找传入的类对象、方法数组和方法数量。
⑦沿方法数组地址进入数据区域。
⑧记录方法名称、JNI签名和Native函数地址。
典型注册项包含三个内容:
方法名称、方法签名、函数地址
例如:
"getToken"
"(I)Ljava/lang/String;"
sub_12340
这表示Java层的getToken(int)对应SO中的sub_12340。
3、根据JNI签名核对参数
JNI签名中,括号内表示参数,括号后表示返回值。
常见类型包括:
<1>I表示int
<2>Z表示boolean
<3>J表示long
<4>F表示float
<5>D表示double
<6>V表示void
<7>Ljava/lang/String;表示String
<8>[B表示byte[]
例如:
(Ljava/lang/String;I)Z
表示参数为String和int,返回值为boolean。
①记录注册表中的JNI签名。
②回到JADX找到同名Native方法。
③核对参数数量和排列顺序。
④确认返回类型是否一致。
⑤返回IDA Pro,将光标放在对应函数名称上。
⑥按N键重命名函数。
⑦将光标放在函数声明上,按Y键设置完整类型。
三、找不到JNI函数时怎么继续定位
应用经过混淆或去除符号后,可以从类名、方法名和JNI接口调用继续查找。
1、通过类名字符串查找
①打开IDA Pro的【字符串】窗口。
②搜索Java类的斜杠路径,例如:
com/example/demo/NativeBridge
③双击字符串进入所在位置。
④按X查看交叉引用。
⑤进入引用函数,查找FindClass和RegisterNatives调用。
⑥沿注册表地址定位Native函数。
2、通过方法名字符串查找
①在【字符串】窗口中搜索Java Native方法名。
②双击方法名字符串。
③按X查看交叉引用。
④检查附近是否同时存在JNI签名字符串。
⑤找到与方法名、签名共同出现的函数地址。
⑥进入目标函数,按N键修改名称。
总结
处理“IDA Pro反编译APK时怎么定位Native代码IDA Pro反编译APK后Java层和SO层怎么对应”时,可以先从APK的lib目录提取对应架构的SO,再通过System.loadLibrary和native声明确认Java层调用关系。静态注册可以直接搜索Java_导出函数,动态注册则需要进入JNI_OnLoad,沿RegisterNatives找到方法名、JNI签名和函数地址。符号被删除后,还可以通过类名字符串、方法名字符串和交叉引用继续定位。希望本文对大家了解APK中的Native代码和Java层、SO层对应关系有所帮助。
展开阅读全文
︾