这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » 在Keil中如何隐藏代码--lib库的生成与使用

共1条 1/1 1 跳转至

在Keil中如何隐藏代码--lib库的生成与使用

院士
2026-09-19 17:00:43     打赏
在Keil中如何隐藏代码--lib库的生成与使用

在现代工程中,嵌入式代码的保护手段并不多,除了金融类、涉密类的特殊行业项目外,大多数嵌入式项目受限于成本均无硬件级别代码保护措施。还有一部分的应用场景下,嵌入式代码需要展示,甚至需要提供到对方做实地部署检查。而这时的代码保护便成了形同虚设。其实,Keil也提供了一种机制,把关键、重要程序代码打包、封装生成lib库。通过lib库的方式可以实现代码的闭源交付,在一定程度上可以保护我们的知识产权。

Keil中生成lib

我们需要把关键代码的实现抽象出来。这样,在主项目中就可以以调用的形式加载封装到lib库的程序或数据内容了。我们以CRC16-Modbus算法为例,演示将CRC16的算法封装到lib库中。

首先,新建lib库工程。打开Keil后,新建工程,选择目标MCU(STM32F407)。这时,要在“Output”标签页中勾选“Create Library”。这样,Keil的配置就完成了。

keil生成lib配置01.jpg

接下来,我们按照以往经验,添加CRC16算法的.c文件和.h文件。这里我附上.h头文件,后面我们会用到。

/**
 ******************************************************************************
 * @file     crc_algorithem.h
 * @author   jobs 
 * @version  v0.0.0 
 * @date     2026-09-19 
 * @brief    
 * @note     
 ******************************************************************************
 */
#ifndef CRC_ALGORITHEM_H 
#define CRC_ALGORITHEM_H 

#include <stdint.h>

extern const char crc_version[];
extern uint16_t usMBCRC16(uint8_t *pucFrame, uint16_t usLen);

#endif

/******************************** END OF FILE *********************************/

这时,我们再执行编译,可以看到并不会再输出.bin文件或.hex文件,而是.lib的lib库文件。我们通过hex编辑器打开,可以看到里面的代码被优化,被封装的已经“面目全非”,自然也就无法还原C源代码了!

keil生成lib配置02.jpg

Keil中使用lib

生成完成的lib库文件之后,我们再切回正常的业务逻辑实现的工程。只是把mylib.lib添加到工程里面即可。

keil生成lib配置03.jpg

添加完成之后,我们再在main.c文件里面引用lib库里封装好的usMBCRC16()函数接口即可,当然,前提是我们要#include "crc_algorithem.h"头文件。

我们设定计算的数据为:

const uint8_t data[16] = {
    1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};

这16个数字的CRC计算结果应该是0x3B28;

接下来我们编译,运行,看看结果是否符合预期!

keil生成lib配置05.jpg

通过运行结果可以看到,我们在项目中没有实现crc16的算法,程序调用的是lib库中的实现算法,算法结果也符合预期。

总结

通过Keil的lib库,我们很好的隐藏了代码实现的业务逻辑与算法。这对我们的知识产权起到了一定的保护作用。这里也要注意一下:lib库是把.c编译成机器码,并不是加密混淆。理论上仍可反汇编,只是可读性极差。另外,我还发现,使用lib库后,在编译的时候还会加快速度——毕竟,不再需要编译lib库了嘛!

亲爱的网友们,你们都学会了吗?

欢迎关注我,我是你们的老朋友jobs





关键词: lib    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]