上位机图像处理和嵌入式模块部署(linux程序加解密)

news2024/11/13 10:27:01

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        我们平时在开发程序的时候,如果仅仅是自己使用,那么代码和使用场景都是自己控制的,一般来说问题不大。但是程序如果是给别人使用的,总是会担心,这个程序会不会被客户用作其他的用途。所以这个时候,我们就要想办法保护自己的权益,保证这个程序只能在特别类型的板子、甚至是某个单一板子上面运行。

        当然,在实施的过程当中,还不能特别复杂。最起码说,不能一个板子一个编译版本。但是一个版本可以给一个license文件,这是可以的。

1、特定的板子有自己的cpuid和mac地址

        不同的板子,特别是linux板子,上面的cpuid和mac地址,一般都是唯一的。如果需要获取cpuid,输入cat /proc/cpuinfo即可,


feixiaoxing@raspberrypi:~/Desktop/module $ cat /proc/cpuinfo
processor       : 0
BogoMIPS        : 108.00
Features        : fp asimd evtstrm crc32 cpuid
CPU implementer : 0x41
CPU architecture: 8
CPU variant     : 0x0
CPU part        : 0xd08
CPU revision    : 3

processor       : 1
BogoMIPS        : 108.00
Features        : fp asimd evtstrm crc32 cpuid
CPU implementer : 0x41
CPU architecture: 8
CPU variant     : 0x0
CPU part        : 0xd08
CPU revision    : 3

processor       : 2
BogoMIPS        : 108.00
Features        : fp asimd evtstrm crc32 cpuid
CPU implementer : 0x41
CPU architecture: 8
CPU variant     : 0x0
CPU part        : 0xd08
CPU revision    : 3

processor       : 3
BogoMIPS        : 108.00
Features        : fp asimd evtstrm crc32 cpuid
CPU implementer : 0x41
CPU architecture: 8
CPU variant     : 0x0
CPU part        : 0xd08
CPU revision    : 3

Revision        : c03115
Serial          : 1000000082145aa2
Model           : Raspberry Pi 4 Model B Rev 1.5

        如果需要获取mac地址的话,则可以通过ifconfig命令获取,

feixiaoxing@raspberrypi:~/Desktop/module $ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.97  netmask 255.255.255.0  broadcast 192.168.0.255
        inet6 fe80::60b9:1158:5415:a5  prefixlen 64  scopeid 0x20<link>
        ether d8:3a:dd:ab:00:ba  txqueuelen 1000  (Ethernet)
        RX packets 2535  bytes 231312 (225.8 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 3190  bytes 254851 (248.8 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 1758  bytes 177511 (173.3 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1758  bytes 177511 (173.3 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.50.163  netmask 255.255.255.0  broadcast 192.168.50.255
        inet6 fe80::dbcb:56e0:b11e:4202  prefixlen 64  scopeid 0x20<link>
        ether d8:3a:dd:ab:00:bb  txqueuelen 1000  (Ethernet)
        RX packets 444  bytes 70922 (69.2 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 95  bytes 54553 (53.2 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

2、直接检验法

        所谓的直接检验法,就是判断程序的cpuid和mac是不是和期望的数值是一致的。如果是一致的,就继续运行;反之则停止运行。这种方法比较简单,也是直觉上比较容易想到的方法。但是缺点也是比较明显,那就是有多少个板子,就要做多少个版本。要是板子不多,这种方法问题不大,但是一旦遇到量产的情况,就复杂了。

​
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void get_cpu_info() {
    FILE *cpuinfo = fopen("/proc/cpuinfo", "r");
    if (!cpuinfo) {
        perror("fopen");
        return;
    }

    char line[256];
    while (fgets(line, sizeof(line), cpuinfo)) {
        if (strncmp(line, "Serial", 6) == 0) {
            printf("%s", line);
            break;
        }
    }

    fclose(cpuinfo);
}

int main() {
    get_cpu_info();
    return 0;
}

        如果是获取eth0 mac地址,那么可以这么来处理,

#include <stdio.h>
#include <stdlib.h>

int main() {
    FILE *fp;
    char mac_addr[18]; // MAC 地址的格式是 "XX:XX:XX:XX:XX:XX",共 17 个字符,加上 '\0' 是 18 个字符。

    // 打开文件 /sys/class/net/eth0/address 以读取 MAC 地址
    fp = fopen("/sys/class/net/eth0/address", "r");
    if (fp == NULL) {
        perror("Failed to open file");
        return EXIT_FAILURE;
    }

    // 读取文件内容到 mac_addr
    if (fgets(mac_addr, sizeof(mac_addr), fp) != NULL) {
        // 打印读取到的 MAC 地址
        printf("MAC Address: %s\n", mac_addr);
    } else {
        perror("Failed to read MAC address");
    }

    // 关闭文件
    fclose(fp);

    return EXIT_SUCCESS;
}

3、用非对称rsa加密代替单一加密

        所谓的非对称加密,就是说加密的密码、解密的密码是不一样的。假设我们给客户发一个可执行程序,那么程序需要运行的话,那么需要一个license文件。这个license文件其实就是对cpuid和mac的加密。这种情况下,我们就需要把解密的密钥写在代码里面。所以就会存在一种情况,有些客户会饶过你直接和开发人员联系。这样的话就存在很大的泄密风险。

        用非对称加密的话,开发人员就算把解密的密钥写在代码里面,但是只要加密的密钥自己牢牢掌握,就不存在泄密的风险。这对于保护自己的利益,是非常重要的。

4、利用驱动解决板子类型的问题

        如果觉得单一加密的方法还是不足以解决问题,可以通过驱动加载的方法来解决开发板类型匹配的问题。我们都知道,每一个linux都有特定的kernel类型与之匹配,那么可以完全通过这一点来达到我们的目的。终端程序如果需要起来,需要先通过设备节点,获取license信息。如果没有看到设备节点,拒绝启动。同样的,看到设备节点,但没法获取license信息,也拒绝启动。

        相关参数的方法可以通过module_param的方法来处理。假设驱动代码是这样的,

#include <linux/init.h>
#include <linux/sched.h>
#include <linux/module.h>
 
MODULE_LICENSE("GPL");
MODULE_AUTHOR("feixiaoxing");
MODULE_DESCRIPTION("This is just a hello module!\n");

static int my_param = 0;
static char* my_str_param = "default_string";

module_param(my_param, int, S_IRUGO);
module_param(my_str_param, charp, S_IRUGO);

 
static int __init hello_init(void)
{
        printk(KERN_EMERG "%d\n", my_param);
        printk(KERN_EMERG "%s\n", my_str_param);
        printk(KERN_EMERG "hello, init\n");
        return 0;
}
 
static void __exit hello_exit(void)
{
        printk(KERN_EMERG "hello, exit\n");
}
 
module_init(hello_init);
module_exit(hello_exit);

        接下来就是准备好makefile文件,

ifneq ($(KERNELRELEASE),)
obj-m := hello.o
 
else
PWD  := $(shell pwd)
KVER := $(shell uname -r)
KDIR := /lib/modules/$(KVER)/build
all:
	$(MAKE) -C $(KDIR) M=$(PWD) modules
clean:
	rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions hello.mod modules.order Module.symvers
endif

        make之后,就可以看到hello.ko文件。接下来,就可以通过sudo insmod hello.ko my_param=2 my_str_param="hello"传进去。确认参数有没有真的传进去,可以通过sudo dmesg看下。

5、时间限制法

        前面说的方法没有时间限制,这是不太合适的。特别是前期试用的时候,客户有可能试用之后还没有付费的意愿。这个时候只能通过时间来进行限制了。比如这个时间可以是一个星期、一个月等等,具体多长时间可以灵活进行处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2059212.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

开放式耳机好还是入耳式耳机好?2024五款热销开放式耳机推荐!

开放式耳机与入耳式耳机各有优缺点&#xff0c;适合不同的使用场景和用户需求。 开放式耳机的优点主要包括&#xff1a; 1. 佩戴舒适性好&#xff0c;由于设计宽松&#xff0c;不会给耳朵带来压迫感&#xff0c;适合长时间使用 。 2. 透气性能好&#xff0c;尤其在夏天或运动…

C盘爆满为什么都要——关闭休眠功能?关了会有什么影响?

C盘爆满为什么都要——关闭休眠功能&#xff1f;关了会有什么影响&#xff1f; 很多C盘爆满的用户中&#xff0c;都会有一个名字是hiberfil.sys的文件&#xff0c;当启用休眠功能时&#xff0c;系统状态&#xff08;包括打开的应用程序和文件&#xff09;会保存到硬盘上的hibe…

第二证券:美股小幅收跌,纳指与标普止步八连涨

当地时间8月20日&#xff0c;美股三大指数小幅收跌。截至收盘&#xff0c;道指跌61.56点&#xff0c;跌幅为0.15%&#xff0c;报40834.97点&#xff1b;纳指跌59.83点&#xff0c;跌幅为0.33%&#xff0c;报17816.94点&#xff1b;标普500指数跌11.13点&#xff0c;跌幅为0.20%…

【18】中级提升1

题目一 策略&#xff1a; 每次将绳子右端点放在一个点上&#xff0c;看绳子往左可以覆盖多少个点。 如何知道左边覆盖几个点&#xff1f; 在绳子右端点cur左边有序区域找第一个大于等于arr[cur]-L的位置 滑动窗口 每次绳子左侧放在一个点上&#xff0c;然后有边界向右走&…

用 ChatGPT 写文章、论文,你有哪些绝活?

最强 AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频百万播放量https://aitools.jurilu.com/绝活不敢说&#xff0c;但是&#xff0c;学会了这个&#xff0c;以前一周写万字&#xff0c;现在两个小时就能搞定&#xff0c;写…

Codeforces EPIC August 2024(Div.1+Div.2) A~E

A. Distanced Coloring &#xff08;思维&#xff09; 题意&#xff1a; 给出一个 n m n\times m nm 网格和一个正整数 k k k。 现在要用用一些颜色为网格着色&#xff0c;并满足以下条件&#xff1a; 如果 ( x 1 , y 1 ) (x_1,y_1) (x1​,y1​) 、 ( x 2 , y 2 ) (x_2…

测试环境频繁报:RedisCommandInterruptedException: Command interrupted

比较奇葩的是&#xff1a;本机&#xff0c;开发&#xff0c;生产都没问题&#xff0c;就测试环境有这问题&#xff0c;导致docker容器不停重启&#xff0c;就是起不来。 本机中断程序&#xff0c;同样也会报这个问题 排查了半天&#xff0c;找到原因&#xff0c;应该是redis在…

技术分享-商城篇-支付回调(十四)

概述 在前面我们说到B2C商城中的订单支付模块&#xff0c;也有聊到支付回调&#xff0c;先来了解一下&#xff0c;为什么我们不能在支付完成当前通知同步去更新支付状态&#xff0c;这样不是更加快捷实时吗&#xff1f;为什么一定要走异步回调通知&#xff1f;带着这些问题&am…

深度学习基础—Batch Norm

对于一个神经网络我们知道&#xff0c;归一化输入特征是加速网络训练的技巧之一&#xff0c;因为归一化后&#xff0c;损失函数的图像就会由狭长变得更圆&#xff0c;那么这是否启发我们&#xff0c;在深度更深模型中&#xff0c;对各层的输出进行归一化&#xff0c;有益于下一…

PythonStudio 控件使用常用方式(三十一)TUpDown

PythonStudio是一个极强的开发Python的IDE工具&#xff0c;官网地址是&#xff1a;https://glsite.com/ &#xff0c;在官网可以下载最新版的PythonStudio&#xff0c;同时&#xff0c;在使用PythonStudio时&#xff0c;它也能及时为用户升到最新版本。它使用的是Delphi的控件&…

从零到一:Spring Boot 与 RocketMQ 的完美集成指南

1.Rocket的概念与原理 RocketMQ 是一款由阿里巴巴开源的分布式消息中间件&#xff0c;最初用于支持阿里巴巴的海量业务。它基于发布-订阅模型&#xff0c;具备高吞吐、低延迟、高可用和强一致性的特点&#xff0c;适用于消息队列、大规模数据流处理等场景。以下是对 RocketMQ …

docker连接宿主机redis,提示Connection refused

目录 一、测试环境 二、问题现象 三、问题总结 一、测试环境 centos 7 redis-5.0.14 docker-26.0.1 二、问题现象 服务器重启后docker连接宿主机redis&#xff0c;提示Connection refused Reconnecting, last destination was /172.25.xxx.x:6379 …

4种回收站数据恢复方法,让数据快速恢复!

回收站里的重要数据怎么突然就消失得无影无踪了&#xff1f;别慌&#xff01;别慌&#xff01;在这里&#xff0c;为您精心准备了4种回收站数据恢复方法&#xff0c;这五种回收站数据恢复方法都是经过实际测试的&#xff0c;完全可以帮我们找回那些被删除的数据&#xff01; 回…

高杰:远程工作8年,平衡了工作与生活,但仍然对收入感到焦虑

这是《开发者说》的第14期&#xff0c;本期我们邀请的开发者是高杰&#xff0c;毕业于上海交大&#xff0c;因拆迁搬家到了郊区&#xff0c;忍受不了长时间的通勤&#xff0c;开始走上远程工作的道路&#xff0c;至今从事远程开发8年有余&#xff0c;他应该是国内最早从事远程工…

C语言提高(2)

calloc void *calloc(size_t namber&#xff0c;size_t size); 功能&#xff1a;在内存动态存储区中分配namber块长度为size字节的连续区域。calloc自动将分配的内存置0 namber&#xff1a;所需内存单元数量 size&#xff1a;每个内存单元的大小&#xff08;单位&#xff1a;字…

第二证券:融券余额,较历史高位下降逾九成!

在多种要素归纳影响下&#xff0c;近年融券余额和转融券余额持续下降&#xff0c;其间融券余额已较前史高位下降逾九成&#xff0c;而转融券余额年内降幅也已逾越九成。 有专家在接受证券时报记者采访时认为&#xff0c;融券和转融券余额大幅减少减轻了商场兜销压力&#xff0…

OV SSL证书:让您的网站与众不同

在当今高度竞争的数字世界中&#xff0c;拥有一个安全、可信的网站对于吸引和保留客户至关重要。组织验证&#xff08;OV&#xff09;SSL证书不仅可以为网站提供强大的加密保护&#xff0c;还能通过验证组织的真实身份来增强用户的信任感。本文将探讨OV SSL证书如何帮助您的网站…

背包问题有前提

前言&#xff1a;这个有大前提的背包感觉不能用二进制拆分&#xff0c;不然搞不清楚 注意三维的顺便&#xff0c;第一维度是枚举物品&#xff0c;第二维度是倒序枚举空间&#xff0c;第三维度是枚举数量 题目地址 #include<bits/stdc.h> using namespace std;#define …

XSS-Jquery.html()+DOM破坏

目录 靶场网址&#xff1a;​ https://xss.pwnfunction.com/challenges/ww3/ ​ 分析代码&#xff1a; Jquery.html()解析原理&#xff1a; DOM-clobbering JS作用域&作用域链 ​编辑 靶场网址&#xff1a;​ https://xss.pwnfunction.com/challenges/ww3/ ​ 分析代…

全液冷服务器革命:CPU、内存、PCIe高效散热新方案

在国家十四五规划大力发展数字经济的背景下&#xff0c;数据中心作为算力的核心载体&#xff0c;其基础设施成为支撑数字经济的“数字底座”&#xff0c;但同时也面临巨大的碳排放压力。随着芯片与服务器功耗的上升&#xff0c;单机柜功率密度不断增大&#xff0c;传统风冷散热…