文章作者:safest_place
一、前置准备:工具、环境与 SO 文件 “解锁”
逆向操作的第一步,是让目标 SO 文件从 APK 中 “独立” 出来。此环节需明确工具用法与操作路径,新手可对照截图逐步验证。
1.1 工具清单:逆向必备 “武器库”
-
Android 端:MT 管理器(用于定位已安装 APP 并提取 SO,无需 root 也可操作) -
PC 端:IDA Pro 7.5+(需支持 ARM 架构,推荐 7.5/7.7 版本,避免解析 SO 出错)、WinHex 19.0+(处理 IDA 无法完成的字符串修改)、JDK 1.8+(提供 jarsigner 签名工具) -
目标对象:GGNdkTest1.apk(含 2 个核心 SO:libgg-jni.so(14KB,2014.12.11)、libJniTest.so(14KB,2021.2.22)
1.2 SO 文件提取:从 APK 中 “拆出” 核心文件
打开 MT 管理器,在首页 “已安装应用” 列表中找到 “GGNdkTest1”,长按 APP 图标,在弹出菜单中选择 “查看”

进入 APP 的压缩包目录后,直接展开lib文件夹(SO 文件默认存储路径,若设备为 ARM64 架构,需进入armeabi-v7a/arm64-v8a子目录,本例直接存于lib根目录)

找到libgg-jni.so,长按文件,选择 “提取”,在弹窗中选择 PC 可访问的路径(如 “内部存储 / Documents/SO”),点击 “确定” 完成提取

二、IDA Pro:Native 层函数的 “定位雷达”
2.1 加载 SO 文件
Native 函数与 Java 层交互时,命名遵循 **“Java_包名_类名_方法名”** 的固定规范(如Java_com_ggndktest1_JniGg_getCoin对应 Java 层com.ggndktest1.JniGg类的getCoin方法),可通过 IDA “函数搜索” 功能精准定位

双击目标函数Java_com_ggndktest1_JniGg_getCoin,跳转到 “IDA View-A”(汇编视图),此时可看到函数完整汇编代码


三、核心篡改:用 IDA “改写” Native 层逻辑
3.1 前置配置:解决 “无法修改” 问题
此环节是逆向的 “核心操作”,若直接修改0x64时提示无法修改(如点击 “Change byte” 无反应、弹窗灰色不可选),需先通过Options→General配置开启修改权限,再执行字节修改流程。


3.2 执行字节修改:把 “0x64” 换成 “0xFF”
在 IDA View-A 中选中地址 0x00000C04 的 MOVS R0, #0x64 代码,通过 Edit→Patch program→Change byte(或 Ctrl+Alt+P)打开 Patch Bytes 窗口,将原机器码 64 20 改为 FF 20,点击 OK 后代码更新为 MOVS R0, #0xFF,完成字节修改。




3.3 保存修改:让 SO 文件 “记住” 新逻辑
在 IDA 中点击菜单栏 “Edit”→“Patch program”→“Apply patches to input file...”,弹出 “Apply patches” 确认窗口后,确认 “Input file” 为目标 SO 文件路径(如 D:AndroidReverseSOlibgg-jni.so),建议勾选 “Backup original file” 以自动备份原文件为 libgg-jni.so.bak;接着点击 “Start”,IDA 会将修改写入 SO 文件,底部状态栏会显示 “Patches applied successfully” 提示补丁应用成功;最后关闭 IDA,找到修改后的 SO 文件并重新用 IDA 打开验证,可见 MOVS R0, #0xFF 指令保持不变,说明修改已永久保存至文件中。


将so文件替换到apk里,删掉签名文件,重新签名一下



四、补充突破:用 WinHex 解决 IDA “改不动” 的字符串
当 IDA 无法完整修改 SO 中的字符串(如长度超限、编码问题),需用 WinHex 补位,截图需展示 “定位编码→替换字节” 的过程。
4.1 第一步:在 IDA 中找字符串的 “十六进制身份证”
按下 Shift+F12 打开 IDA 的 “Strings” 窗口,在搜索框中输入 “金币数目是” 以筛选出目标字符串条目,需注意编码末尾的 00 00 是字符串结束符,修改时必须保留以避免程序运行崩溃,记录下该十六进制编码后关闭 IDA 即可。
选中点击空格 -> f5

右键->hide casts

双击



打开字节码
options -> general




对应字符串 43757272656e7420436f696e206973202d2d2020
金币数目是 对应字符串 e9 87 91 e5 b8 81 e6 95 b0 e7 9b ae e6 98 af ef bc 9a 00 00
选中-> edit-> pach programe ->change byte


4.2 第二步:WinHex “精准替换” 字符串
打开 WinHex,点击 “File”→“Open”,加载修改后的libgg-jni.so;


点击 “Replace All”,WinHex 会提示 “找到 1 处匹配并替换”

重新打开

五、最终重生:APK 的 “重组与签名”
5.1 替换 SO 文件:让 APK “接纳” 新逻辑
用 WinRAR 打开 GGNdkTest1.apk(注意选择 “打开” 而非 “解压”),展开 lib 目录后,右键删除原 libgg-jni.so,再将修改后的 SO 文件拖入该 lib 目录,最后删除 APK 根目录下的 META-INF 文件夹
5.2 重新签名:给 APK “合法身份”
打开 CMD,先切换到 APK 所在目录(如执行命令 “cd D:AndroidReverseAPK”),再执行签名命令(执行前需提前用 keytool 生成密钥库,示例密钥库为 key.keystore)
jarsigner -verbose -keystore D:key.keystore -signedjar GGNdkTest1_signed.apk GGNdkTest1.apk mykey
输入密钥库密码,等待签名完成
5.3 验证效果:看篡改是否 “落地”
将签名后的 GGNdkTest1_signed.apk 安装到 Android 模拟器(如雷电模拟器),待安装完成后打开该 APP,查看界面上 “金币” 对应的数值与相关字符串,以此验证 SO 文件篡改后的实际效果。

六、避坑指南:新手必看的 5 个关键提醒
1.合法性红线:仅可逆向自己开发或获授权的 APP,破解商业 APP 可能违反《计算机软件保护条例》;
2.工具版本适配:IDA 需选 “ARM 版”,WinHex 避免用旧版(如 0),否则可能解析错误;
3.脱壳前置:若 APP 加壳(启动时弹窗 “检测到篡改”),需先用 Frida-DEXDump 脱壳,再提取 SO;
4.备份习惯:修改 SO、替换 APK 前,务必备份原文件,防止操作失误无法恢复;
5.寄存器常识:ARM 架构中,R0 是函数返回值寄存器,修改数值需瞄准 R0 相关指令(如本例MOVS R0, #imm)。
通过 “提取 SO→IDA 定位→篡改逻辑→WinHex 补位→APK 重生” 的全流程,可实现 Android Native 层核心逻辑的突破。每张截图对应关键操作节点,新手可对照 “文字步骤 + 截图标注” 逐步实践,快速掌握 SO 文件逆向的核心方法。
原文始发于微信公众号(神农Sec):拆解与突破:Android SO 文件逆向篡改全流程(从 SO 提取到 APK 重塑)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-


评论