逆向工程,如何从移动端应用提取本地 AI 模型,附成功提取微软Seeing AI 模型
逆向工程,如何从移动端应用提取本地 AI 模型,附成功提取微软Seeing AI 模型 by 老码小张
最近我看到了一个有趣的话题:如何从移动应用中提取 AI 模型。虽然听起来有些“黑客范儿”,但这其实是一个非常技术性的问题——它涉及移动端的 AI 模型存储方式、加密保护手段以及逆向工程方法的实际应用。
为什么提取 AI 模型?
移动端 AI 模型的应用越来越广泛,比如实时物体识别、拍照美化、语音助手等。而这些模型的运行方式分为两种:云端推理和本地推理。
本地推理有个显著优势——离线也能用,且响应速度快。于是,很多应用选择把 AI 模型直接打包在安装包(如 APK)里。对于技术研究者来说,这些模型就变成了“可探究的目标”。
当然,正如你所想,这种提取行为可能涉及法律问题,后面我们会简单聊聊。
目标应用:Seeing AI
我们以微软的 Seeing AI 应用为例,这是一个为视觉障碍者设计的辅助工具。它的亮点功能是货币识别,支持 17 种货币和 225 张不同的纸币。看起来很酷,对吧?但这也意味着它一定有一个强大的 AI 模型在背后运行。
一个朋友提到对这部分功能感兴趣,于是我决定从技术角度来一探究竟。
第一步:解包 APK
Android 应用的安装包是一个叫 APK(Android Package Kit)的文件,本质上是一个压缩包。里面包含了应用的所有资源:代码、图片、字体以及我们的目标——AI 模型文件。
解包 APK 最常用的工具是 apktool[1],它可以把 APK 解包成一个文件夹结构,便于我们查看每个文件的用途。
apktool d seeingai.apk -o seeingai_unpacked
解包后,找到 assets
文件夹,这里通常存放模型、配置文件等。果然,我发现了一个叫 currency
的大文件,大小超过 16 MB,旁边还有一个 currency-labels.txt
。看起来,模型目标近在眼前了!
第二步:加密模型文件
但是,直接打开 currency
文件却让人沮丧——文件内容被加密了。常见分析工具如 file
和 binwalk
都无法识别文件结构,甚至文件的熵值是 1(完全随机化),说明这文件经过了严格的加密处理。
这里需要用到逆向工程技术,具体来说就是要搞清楚:应用是如何解密这个模型文件的?
第三步:逆向解密逻辑
接下来就是经典的“逆向解密”操作了。开发者为了保护模型,常用一些非常规的加密手段,比如:
• 倒着读取文件内容; • 对字节做各种位移、模运算; • 加密密钥可能跟日期、设备 ID 有关。
要搞清楚这些操作,通常需要分析应用的代码。通过解包后得到的 Smali 文件(Android 的字节码格式)或者用动态分析工具直接调试运行中的应用。
不过,这样的方式又慢又复杂。我更喜欢一个“直截了当”的办法:观察文件最终是如何加载到推理引擎中的。
第四步:截获 TensorFlow Lite 加载模型
大多数移动端 AI 应用都使用 TensorFlow Lite(以下简称 TFLite)来运行模型,而微软的 Seeing AI 也不例外。在 apktool
的输出中,我发现了 org.tensorflow.lite.NativeInterpreterWrapper
类,这是 TFLite 在 Android 上的核心组件。
有了目标,接下来就可以用 Frida[2](一个强大的动态调试工具)进行跟踪。
以下是使用的 Frida 命令:
frida -U -n com.microsoft.seeingai -e "
Interceptor.attach(Module.findExportByName('libtensorflowlite_jni.so', '_ZN10tensorflowlite16NativeInterpreterWrapper13createModelWithBufferEPKvj'), {
onEnter: function (args) {
console.log('Model buffer address: ' + args[0]);
// 可以在这里将内存中的模型 dump 到本地
}
});
"
通过这个脚本,我成功截获了应用加载 currency
文件时的解密过程,并将解密后的 .tflite
模型完整保存下来。
第五步:验证模型
提取模型只是第一步,接下来要验证它的正确性。可以使用了 Netron[3],一个用于可视化神经网络模型的工具。
如果 Netron 能正确打开这个模型文件,就说明提取成功。
netron currency.tflite
结果显示,这个模型完整无误!它包含了所有的权重和偏置数据,完全可以直接用于重新训练或修改。
更多可能性
这一过程不仅限于 Seeing AI,任何使用 TFLite 的应用理论上都可以通过类似方法提取模型。比如,还可以试着从 Adobe Scan 提取了它的文档识别模型,结果同样成功。
不过,这也引出一个问题:模型是应用的一部分,但模型的使用、修改乃至再分发可能涉及知识产权问题。提取模型后,务必遵守相关法律法规。
步骤总结
整个提取过程分为以下几步:
1. 解包 APK:找到目标文件; 2. 逆向分析:搞清楚加密逻辑; 3. 动态调试:用 Frida 截获解密后的模型; 4. 验证模型:确保提取的数据是完整有效的。
以下是流程图:
这一切并不复杂,但很考验耐心和细心。如果你对模型提取和逆向工程感兴趣,这可能是一个很好的实践案例。
附注
虽然从技术角度来说,这是一项有趣的挑战,但在实践时要注意以下几点:
1. 提取模型应遵守应用开发商的许可协议; 2. AI 模型作为一种数据资产,其归属权复杂,务必谨慎处理; 3. 禁止用于非法用途。
引用链接
[1]
apktool: https://apktool.org/[2]
Frida: https://frida.re/[3]
Netron: https://github.com/lutzroeder/netron
原文链接