• 基于嵌入式的密码访问的门锁系统


    目录
    第一部分 功能描述 1
    第二部分 设计方案 1
    一、 mylock 程序 1
    二、 lock_guard 监控程序 3
    第三部分 安全设计描述 4
    一、 抗干扰设计 4
    2、睡眠避干扰 4
    据此,编写出用来 patch 的 python 脚本(嵌入式-Patch_nop+call.py): 6
    4、看门狗及运行监视程序 7
    5、冷热启动及初始化 8
    对于逆向工程的防御: 17
    对于爆破密码的防御: 18
    1、 密钥文件再加密 18
    2、 敏感变量及时清理 18
    第四部分 软件设计 19
    第五部分 设计总结 22
    第一部分 功能描述
    本次实验选题为基于密码访问的门锁系统,类似于现代智能家居中的智能门
    锁。在本次实验中,我实现了通过键盘输入密码,若正确开启门锁(电机),若错误给出提示;并通过 LED 显示提示语以及密码输入的结果;还可以通过连续敲击特殊键,输入正确密码和新密码实现密码的更改。 本文转载自http://www.biyezuopin.vip/onews.asp?id=15598
    第二部分 设计方案
    为了达到实验目标,在本次实验中我编写了两个程序:主程序 mylock 以及监控程序 lock_guard,接下来分开介绍两个程序的设计方案。
    一、 mylock 程序
    使用了双线程,其中主线程负责接受输入以及进行 hash 校验等,led 线程负责控制 led 输出相应的提示语及结果。
    主线程的主要架构如下(mylock/main.c):

    #include
    #include
    #include
    #include
    #include
    #include"lock_guard.h"
    
    
    //获取当前时间,精确到毫秒
    long long getCurrentTime(void)
    {
    	struct timeval tv;
    	gettimeofday(&tv, NULL);
    	return tv.tv_sec * 1000 + tv.tv_usec / 1000;
    }
    
    char last_wcd_buf[WCD_BUF_SIZE] = {};
    int wcd_wait_time = 0;
    int restart_time_sum = 0;
    char keyfile_buf[MAX_FILE_SIZE];
    
    //检查看门狗缓冲区
    // 0 正常 其他 静止
    int check_wcd_buf(){
    	char buf[WCD_BUF_SIZE];
    	int fd, readfileflag;
    	
    	memset(buf, 0, sizeof(buf));
    	
    	
    	fd = open(wcd_buf_fname, O_RDONLY);
    	if(fd < 0)
    	{
    		return -1;
    	}
    	
    	//读取文件,并检测是否出错 
    	readfileflag = read(fd, buf, WCD_BUF_SIZE);
    	if(readfileflag <= 0){
    		return -1;
    	}
    	close(fd);	
    	
    	if(strcmp(last_wcd_buf, buf) == 0){
    		printf("[INFO]\tDetect wcd_buf unchange!\n");
    		return 1;
    	}
    	
    	memset(last_wcd_buf, 0, sizeof(last_wcd_buf));
    	stpcpy(last_wcd_buf, buf);
    	
    	return 0;
    }
    
    //检查keyfilecounter 
    int check_keyfile_counter(){
    	unsigned char buf[KEYFILE_BUFF_SIZE];
    	char tmp1[FILE_PATH_SIZE], tmp2[FILE_PATH_SIZE];
    	int fd, readfileflag, i;
    	
    	memset(buf, 0, sizeof(buf));
    	
    	fd = open(KEYFILE_COUNTER_PATH, O_RDONLY);
    	if(fd < 0)
    	{
    		return -1;
    	}
    	
    	//读取文件,并检测是否出错 
    	readfileflag = read(fd, buf, KEYFILE_BUFF_SIZE);
    	if(readfileflag <= 0){
    		return -1;
    	}
    	close(fd);	
    	
    	i=0;
    	while(buf[i] == 0){
    		if(buf[i] != MAX_CHANGE_KEYFILE[i])
    			return 0;
    		i++;
    	}
    	
    	//达到更换的标准
    	for(i=0; i<KEYFILE_NUM; i++){
    		memset(keyfile_buf, 0, sizeof(keyfile_buf));
    		file_cmp_read(KEY_FILE_PATH[i], keyfile_buf);
    		//sprintf(tmp1, "touch ../mylock/keyfile/keyfile%d.new", i);
    		sprintf(tmp1, "touch %s.new", KEY_FILE_PATH[i]);
    		system(tmp1);
    		//sprintf(tmp2, "rm ../mylock/keyfile/keyfile%d", i);
    		sprintf(tmp2, "rm %s", KEY_FILE_PATH[i]);
    		system(tmp2);
    		//sprintf(tmp1, "mv ../mylock/keyfile/keyfile%d.new ../mylock/keyfile/keyfile%d", i, i);
    		sprintf(tmp1, "mv %s.new %s", KEY_FILE_PATH[i], KEY_FILE_PATH[i]);
    		system(tmp1);
    		file_cmp_write(KEY_FILE_PATH[i], keyfile_buf);
    	}
    	
    	return 0;
    }
    
    int restart_process(){
    					
    	printf("[WARING]\tRestarting process\n");
    	system("killall mylock");
    	
    	file_cmp(MYLOCK_AND_BAK_PATH, MYLOCK_FILE_CHECK_NUM);
    	
    	check_keyfile_counter();
    	
    	system("mylock/mylock");
    	return 0;
    }
    
    int reboot_machine(){
    	printf("[ERROR]\tReboot Machine!\n");
    	system("reboot");
    	return 0;
    }
    
    int main(){
    	int count_wcd = 0;
    	printf("[INFO] Lock_Guard Start!\n");
    	
    	while(1){
    		if(getCurrentTime() % LOCK_GUARD_TIME_SLICE == 0){
    			
    			
    			//检查缓冲区
    			if(check_wcd_buf() == 0){
    				wcd_wait_time = 0;
    				restart_time_sum = 0;
    				continue;
    			}
    			
    			//buf无变化
    			wcd_wait_time ++;
    			if(wcd_wait_time > WCD_RESTART_TIME){
    				//需要重启程序
    				
    				restart_process();
    				wcd_wait_time = 0;
    				restart_time_sum ++;
    				
    				//重启机器
    				if(restart_time_sum > MAX_TIME_RESTART_FAIL){
    					
    					reboot_machine();
    				}
    			}
    						
    			
    		}
    		
    		
    		
    		
    		
    		
    		
    		
    		
    	}
    	
    	
    	
    	
    	
    	return 0;
    }
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    day13迭代器和模块
    中国医学影像设备行业市场供需预测及投资价值研究报告
    一起来看看AMD最新显卡驱动22.11.1!
    QQ2 微信红包
    【VMware vSphere】使用vSphere Lifecycle Manager(vLCM)管理独立主机和集群的生命周期。
    AVL树的底层实现
    基于python的民宿旅馆消费数据分析系统
    公司员工微信如何管理?
    【Linux】Linux基本使用和Web程序部署,我奶奶都能看懂
    JeecgBoot 框架升级至 Spring Boot3 的实战步骤
  • 原文地址:https://blog.csdn.net/newlw/article/details/126686505