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

发布于:2022-12-30 ⋅ 阅读:(396) ⋅ 点赞:(0)

目录
第一部分 功能描述 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<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<sys/time.h>
#include<fcntl.h>
#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;
}













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

本文含有隐藏内容,请 开通VIP 后查看