拆解与突破:Android SO 文件逆向篡改全流程(从 SO 提取到 APK 重塑)

admin 2025年10月4日18:08:04评论418 views字数 3020阅读10分4秒阅读模式

文章作者:safest_place

文章来源:https://www.freebuf.com/articles/mobile/450399.html

Android SO 文件逆向篡改全流程(从 SO 提取到 APK 重塑) 

一、前置准备:工具、环境与 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 图标,在弹出菜单中选择 “查看”

拆解与突破:Android SO 文件逆向篡改全流程(从 SO 提取到 APK 重塑)

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

拆解与突破:Android SO 文件逆向篡改全流程(从 SO 提取到 APK 重塑)

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

拆解与突破:Android SO 文件逆向篡改全流程(从 SO 提取到 APK 重塑)

二、IDA Pro:Native 层函数的 “定位雷达”

2.1 加载 SO 文件

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

拆解与突破:Android SO 文件逆向篡改全流程(从 SO 提取到 APK 重塑)

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

拆解与突破:Android SO 文件逆向篡改全流程(从 SO 提取到 APK 重塑)
拆解与突破:Android SO 文件逆向篡改全流程(从 SO 提取到 APK 重塑)

三、核心篡改:用 IDA “改写” Native 层逻辑

3.1 前置配置:解决 “无法修改” 问题

此环节是逆向的 “核心操作”,若直接修改0x64时提示无法修改(如点击 “Change byte” 无反应、弹窗灰色不可选),需先通过Options→General配置开启修改权限,再执行字节修改流程。

拆解与突破:Android SO 文件逆向篡改全流程(从 SO 提取到 APK 重塑)
拆解与突破:Android SO 文件逆向篡改全流程(从 SO 提取到 APK 重塑)

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,完成字节修改。

拆解与突破:Android SO 文件逆向篡改全流程(从 SO 提取到 APK 重塑)
拆解与突破:Android SO 文件逆向篡改全流程(从 SO 提取到 APK 重塑)
拆解与突破:Android SO 文件逆向篡改全流程(从 SO 提取到 APK 重塑)
拆解与突破:Android SO 文件逆向篡改全流程(从 SO 提取到 APK 重塑)

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 指令保持不变,说明修改已永久保存至文件中。

拆解与突破:Android SO 文件逆向篡改全流程(从 SO 提取到 APK 重塑)
拆解与突破:Android SO 文件逆向篡改全流程(从 SO 提取到 APK 重塑)

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

拆解与突破:Android SO 文件逆向篡改全流程(从 SO 提取到 APK 重塑)
拆解与突破:Android SO 文件逆向篡改全流程(从 SO 提取到 APK 重塑)
拆解与突破:Android SO 文件逆向篡改全流程(从 SO 提取到 APK 重塑)

四、补充突破:用 WinHex 解决 IDA “改不动” 的字符串

当 IDA 无法完整修改 SO 中的字符串(如长度超限、编码问题),需用 WinHex 补位,截图需展示 “定位编码→替换字节” 的过程。

4.1 第一步:在 IDA 中找字符串的 “十六进制身份证”

按下 Shift+F12 打开 IDA 的 “Strings” 窗口,在搜索框中输入 “金币数目是” 以筛选出目标字符串条目,需注意编码末尾的 00 00 是字符串结束符,修改时必须保留以避免程序运行崩溃,记录下该十六进制编码后关闭 IDA 即可。

选中点击空格 -> f5

拆解与突破:Android SO 文件逆向篡改全流程(从 SO 提取到 APK 重塑)

右键->hide casts

拆解与突破:Android SO 文件逆向篡改全流程(从 SO 提取到 APK 重塑)

双击

拆解与突破:Android SO 文件逆向篡改全流程(从 SO 提取到 APK 重塑)
拆解与突破:Android SO 文件逆向篡改全流程(从 SO 提取到 APK 重塑)
拆解与突破:Android SO 文件逆向篡改全流程(从 SO 提取到 APK 重塑)

打开字节码

options -> general

拆解与突破:Android SO 文件逆向篡改全流程(从 SO 提取到 APK 重塑)
拆解与突破:Android SO 文件逆向篡改全流程(从 SO 提取到 APK 重塑)
拆解与突破:Android SO 文件逆向篡改全流程(从 SO 提取到 APK 重塑)
拆解与突破:Android SO 文件逆向篡改全流程(从 SO 提取到 APK 重塑)

对应字符串 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

拆解与突破:Android SO 文件逆向篡改全流程(从 SO 提取到 APK 重塑)
拆解与突破:Android SO 文件逆向篡改全流程(从 SO 提取到 APK 重塑)

4.2 第二步:WinHex “精准替换” 字符串

打开 WinHex,点击 “File”→“Open”,加载修改后的libgg-jni.so;

拆解与突破:Android SO 文件逆向篡改全流程(从 SO 提取到 APK 重塑)
拆解与突破:Android SO 文件逆向篡改全流程(从 SO 提取到 APK 重塑)

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

拆解与突破:Android SO 文件逆向篡改全流程(从 SO 提取到 APK 重塑)

重新打开

拆解与突破:Android SO 文件逆向篡改全流程(从 SO 提取到 APK 重塑)

五、最终重生: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 文件篡改后的实际效果。

拆解与突破:Android SO 文件逆向篡改全流程(从 SO 提取到 APK 重塑)

六、避坑指南:新手必看的 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 重塑)

 

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年10月4日18:08:04
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   拆解与突破:Android SO 文件逆向篡改全流程(从 SO 提取到 APK 重塑)http://cn-sec.com/archives/4543492.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息