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


    目录
    第一部分 功能描述 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

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

  • 相关阅读:
    036、目标检测-锚框
    锂热电池检测设备 你一定没见过这种检测方式!
    解决:华为ensp软件中AR和AC,AP设备无法启动报错“40”的问题
    51单片机学习笔记1 简介及开发环境
    JavaScript 多维数组构建与遍历以及示例和详细代码解释为什么这样写(1)
    Vue3 SFC 和 TSX 方式自定义组件实现 v-model
    JVM-类加载子系统
    六、项目实战---识别猫和狗
    开源即时通讯GGTalk 8.0发布,增加Linux客户端,支持在统信UOS、银河麒麟上运行!
    【MySQL】用户与权限管理
  • 原文地址:https://blog.csdn.net/newlw/article/details/126686505