能否通过程序化方式直接从Simulink模块生成S-Function以隐藏模型逻辑?
Simulink模型逻辑混淆:程序化生成S-Function替代模块方案
完全可以通过程序化方式实现,不需要依赖GUI手动操作,以下是具体可行方案:
1. 从目标模块生成独立目标代码
针对要隐藏逻辑的Simulink模块(或子系统),用Simulink代码生成工具生成可独立编译的目标代码:
- 使用
slbuild命令指定ERT(Embedded Coder)目标生成代码,示例:
生成的代码包含源文件、头文件和编译配置,确保可脱离原模型独立使用。slbuild('myModel/TargetSubsystem', 'ert');
2. 程序化生成S-Function代码框架
编写MATLAB脚本自动生成S-Function的C代码,将第一步生成的目标代码逻辑嵌入其中:
- 核心是在S-Function的
mdlOutputs函数中调用目标代码的计算接口,同时在mdlInitializeSizes中匹配原模块的输入输出端口规格(数量、数据类型、维度)。 - 也可用
sfcn_new命令快速生成基础模板,再通过脚本替换关键代码段,示例:sfcn_new('myObfuscatedSFunction', 'c', '0', '1', '0'); % 生成0输入1输出的S-Function模板
3. 编译S-Function并添加到模型
完成S-Function代码编写后,程序化编译并插入到目标模型:
- 用
mex命令编译S-Function,链接生成的目标代码,示例:mex myObfuscatedSFunction.c ./generated_code/TargetSubsystem.c -I./generated_code; - 使用Simulink模块API将编译好的S-Function块添加到模型,示例:
add_block('simulink/User-Defined Functions/S-Function', ... 'myModel/ObfuscatedLogicBlock', ... 'FunctionName', 'myObfuscatedSFunction');
4. 增强混淆效果的额外步骤
- 将生成的目标代码编译为静态库,避免源码暴露,示例(Linux/macOS):
编译S-Function时链接该库:gcc -c ./generated_code/TargetSubsystem.c -o TargetSubsystem.o ar rcs libTargetLogic.a TargetSubsystem.omex myObfuscatedSFunction.c -L./lib -lTargetLogic -I./generated_code; - 确保S-Function正确处理原模块的内部状态(如积分器、延迟模块的状态),在
mdlInitializeConditions和mdlUpdate函数中完成状态初始化与更新。
内容的提问来源于stack exchange,提问作者Akhil Nandan
相关产品推荐
相关产品推荐

