-
-
[原创]神经网络模型功守道
-
发表于: 2021-11-29 19:44 3661
-
现在神经网络模型在app端运用越来越多,比如小视频软件中的魔法表情,相机的美颜功能,试穿戴功能,化妆功能。但关于神经网络模型逆向分析与保护的文章好像很少,下面是我自己的一点简单思考。
下面简单分析下TensorFlow和Core ML两种模型的逆向和保护。
在安卓端使用的TensorFlow Lite库。
1、网络请求模型文件到本地
2、创建模型并加载
1 | tflite::FlatBufferModel::BuildFromFile |
3、将模型映射到解释器中
1 2 | tflite::ops::builtin::BuiltinOpResolver resolver; tflite::InterpreterBuilder( * model, resolver)(&cur_interpreter); |
4、定义输入
1 | const std::vector< int > input_tensors = cur_interpreter - >inputs(); |
5、进行推断
1 | cur_interpreter - >Invoke() |
6、获取结果
1 | cur_interpreter - >tensor(cur_interpreter - >outputs()) |
如果类比Android加载dex做保护的方式,很容易想到两种简单的保护方式:
1、通过网络请求下载到本地的模型文件是加密的,在调用BuildFromFile之前进行解密并保存到本地,再把解密之后的模型文件路径传给BuildFromFile。这种方式对应于第一代dex保护,落地加载;
这种方式的缺点很明显,之前的加密只能防止抓包拿到模型文件。如果想要获取到模型文件,我们只需要关心第二步,拦截BuildFromFile的入参,就可以获取模型文件的地址。
2、在dex保护中,我们可以解密之后不保存在本地,直接在内存中加载dex。在模型文件保护中,我们是否也使用这种方式呢?还好tflite库提供了从直接从内存加载模型的方法BuildFromBuffer。BuildFromFile第一个入参是模型文件在内存中的首地址,第二个入参是模型文件在内存中长度。
但同样的,我们也可以拦截这里,在这里直接dump下来模型文件。这种方式可以防止直接在本地文件中找到模型文件,但阻止不了从内存中dump模型文件。
再看下ios端,在ios端使用的是苹果的Core ML
1、下载mlmodel文件
2、编译mlmodel文件,得到mlmodelc文件
1 | compileModelAtURL:error: |
3、初始化模型类
1 | initWithContentsOfURL:error: |
4、使用模型进行推理
1 | predictionFromImage:error: |
和安卓一样,我们可以在 compileModelAtURL:error 处获取到编译前的mlmodel文件路径。因此下载之前对模型的加解密没有多大用处。
我没找到直接从内存中加载模型文件的方法,所以安卓中第二种不落地加载模型可能行不通。
但是,还好苹果提供了另外一种初始化模型的方式,使用modelWithContentsOfURL:error:直接加载mlmodelc文件,mlmodelc文件是编译之后的mlmodel,已经不能直接解析出模型的结构。
这样我们可以直接下发编译好的模型文件,就可以防止直接拿到原始模型文件了。
上面只是网络模型逆向与保护中很基础的内容。对应到dex保护的三代壳、四代壳,模型文件是不是也可以像三代壳那样抽取部分网络层级结构,或者抽取部分节点,又或者像四代壳那样自定义解释器。
赞赏
- [原创]一种简单绕过libmsaoaidsec的方法 6066
- [原创]神经网络模型功守道 3662
- [原创]Inline-Hook指令还原 4973
- [原创]初探LLVM JIT: 一个最小的JIT的例子(llvm 8) 4873
- [原创]ARM函数调用传参规则 5690