首页
社区
课程
招聘
[原创]神经网络模型功守道
2021-11-29 19:44 3096

[原创]神经网络模型功守道

2021-11-29 19:44
3096

现在神经网络模型在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保护的三代壳、四代壳,模型文件是不是也可以像三代壳那样抽取部分网络层级结构,或者抽取部分节点,又或者像四代壳那样自定义解释器。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
点赞2
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回