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