当前位置: 首页 > article >正文

AT89C51 利用SBIT寻址,并且在内存中实现伪动态密码的混淆

前置发现 && 分析

请添加图片描述

char bdata DB[2]; //char
sbit x = bdata DB[0]^7; //取内存地址数组[0]地址的的七位

这样我们可以对数组DB中索引0的位置进行修改…

例如,将密码A映射到真实密码C,这样做的好处是你的程序被逆向分析的时候,攻击者无法真正知道密码到底是什么…因为真密码没有明文保存在某段内存中(伪动态)

char bdata DB[2];  //char
DB[0]='A'; // 由于A的ASCII的十六进制是41->二进制 0100 0001
//我们可以通过sbit控制该地址上的某个位来进行偏移,达到我们的混淆效果
sbit x = bdata DB[0]^1;  //取内存地址数组[0]地址的的2位
// H <- L
x = 1
// 'C'的ASCII是43 二进制->0100 0011
// 将0100 0001 -> 0100 0011
// 假设我们的BD起始存储位置在内存0x80地址,则0x80首次存贮了0x41,通过x=1我们成功的将DB[0]中从A变成了C

实验

#include <REGX51.H>

sbit led = P2^0;      // Define LED connected to P2.0
sbit led2 = P2^1;     // Define second LED connected to P2.1
sbit button = P1^0;   // Define button connected to P1.0
char bdata fackPassword[5] = "G"; // Fake password (initially set to 'G')
sbit MY_REGISTER = fackPassword[0] ^ 2; // Confuse (no real function)

// Delay function
void Delay(unsigned int time) {
    while(time--); // Simple delay loop
}

// Main function
void main() {
    led = 0;   // Initialize LED to off
    led2 = 0;  // Initialize second LED to off

    while(1) { // Infinite loop
         
        MY_REGISTER = 0; // Repeated operation (can be omitted)
        // Check if the fake password is 'E'
        if (fackPassword[0] == 'E') {
            led = 1; // Turn on LED
        } else {
            led = 0; // Turn off LED
        }

        // Check if the fake password is 'C'
        if (fackPassword[0] == 'C') {
            led2 = 1; // Turn on second LED
        } else {
            led2 = 0; // Turn off second LED
        }
    } // End of infinite loop
}

这段demo中,我定义了一个假密码’G’,最总也就是从’G’修改成’C’。最后进入语句if (fackPassword[0] == 'C')并且led2=1

通过DEBUG调试,很明显这个G被修改成了C,意味着我们的混淆起作用了

请添加图片描述

再次修改代码,这次通过一个按钮来模拟混淆触发事件

#include <REGX51.H>

sbit led = P2^0;      // Define LED connected to P2.0
sbit led2 = P2^1;     // Define second LED connected to P2.1
sbit button = P1^0;   // Define button connected to P1.0
char bdata fackPassword[5] = "G"; // Fake password (initially set to 'G')
sbit MY_REGISTER = fackPassword[0] ^ 2; // Confuse (no real function)

// Delay function
void Delay(unsigned int time) {
    while(time--); // Simple delay loop
}

// Main function
void main() {
    led = 0;   // Initialize LED to off
    led2 = 0;  // Initialize second LED to off

    while(1) { // Infinite loop
        if (button == 0) { // Check if button is pressed
            Delay(100); // Debounce delay
            if (button == 0) { // Confirm button is still pressed
                MY_REGISTER = 0; // Update MY_REGISTER
                while(button == 0); // Wait until button is released
            }
        }

       

        // Check if the fake password is 'E'
        if (fackPassword[0] == 'G') {
            led = 1; // Turn on LED
        } else {
            led = 0; // Turn off LED
        }

        // Check if the fake password is 'C'
        if (fackPassword[0] == 'C') {
            led2 = 1; // Turn on second LED
        } else {
            led2 = 0; // Turn off second LED
        }
    } // End of infinite loop
}

为此我们画一个仿真图纸

请添加图片描述

编译后导入运行

请添加图片描述

P2.0的灯常亮,说明我们if (fackPassword[0] == 'G') 已经进入,并且if (fackPassword[0] == 'C') 不满足条件,从而P2.1灯无法点亮。

此时将我们的按钮按下…

请添加图片描述

P2.1被成功点亮,意味着我们成功进入if (fackPassword[0] == 'C') 判断条件

总结

所以我们知道了可以通过SBIT来使N -> N±X 为一个映射关系,所以我们可以随机自定义X的值,来实现N映射到不同的值,从而实现密码混淆。

例如,你有一个8位的密码12345678,你可以随机X的值,可能最后映射的值是abcdefgh。通过校验x值和映射的值来判断密码正确与否。你也可以将x变为随机的,这样就可以做到伪动态密码(在内存中情况)


http://www.kler.cn/news/322715.html

相关文章:

  • gRPC协议简介
  • C++的动态数组
  • 统信服务器操作系统【targetcli部署】
  • HarmonyOS应用开发(组件库)--组件模块化开发、工具包、设计模式(持续更新)
  • 【hadoop安装】
  • 微服务的优点及在云原生时代的合理落地方式
  • 光伏发电生活废水处理设备产地货源
  • 828华为云征文|华为云Flexus云服务器X实例之openEuler系统下搭建MaxKB开源知识库问答系统
  • 中国的互联网电商,终于还是“连上了”
  • 云手机可以挂在服务器使用吗?
  • 基于大数据技术的足球数据分析与可视化系统
  • 2024.9.27
  • 解决setMouseTracking(true)后还是无法触发mouseMoveEvent的问题
  • 神经网络(一):神经网络入门
  • vue echarts tooltip动态绑定模板,并且处理vue事件绑定
  • 每日论文6—16ISCAS一种新型低电流失配和变化电流转向电荷泵
  • 小学生管理系统项目
  • 前后端数据加密与解密
  • Win11家庭版升级专业版
  • 语言的输入
  • Thinkphp5x远程命令执行 靶场攻略
  • vue使用PDF.JS踩的坑--部署到服务器上显示pdf.mjs viewer.mjs找不到资源
  • Elasticsearch黑窗口启动乱码问题解决方案
  • 同声传译软件推荐哪个好?这些工具助你提升翻译效率
  • 物联网系统中声音拾取音频方案_咪头
  • element plus block报错
  • “创新驱动·融合发展”长三角软件产业盛会“2024南京软博会”
  • neo4j关系的创建删除 图的删除
  • Linux `readlink` 命令详解:轻松解析符号链接
  • C++在线开发环境搭建(WEBIDE)