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

news/2024/9/28 1:22:55 标签: .net

前置发现 && 分析

请添加图片描述

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.niftyadmin.cn/n/5680022.html

相关文章

【C++】托管类和托管函数

托管类和托管函数 1. 托管类 托管类是指在 .NET 环境中运行的类&#xff0c;它们由公共语言运行时&#xff08;CLR&#xff09;管理。托管类具有以下特点&#xff1a; 自动内存管理&#xff1a;托管类的实例由 CLR 的垃圾回收机制管理&#xff0c;自动处理内存的分配和释放。…

[SwiftUI 开发] @dynamicCallable 与 callAsFunction:将类型实例作为函数调用

在 Swift 中&#xff0c;dynamicCallable 和 callAsFunction 提供了两种将类型实例作为函数调用的方式。 1. callAsFunction 对于 callAsFunction&#xff0c;只需实现名为 callAsFunction 的方法&#xff0c;参数和返回值可自行任意定义。 例如&#xff0c;考虑一个ShapeCal…

Vercel部署/前端部署

Vercel 部署 今天要讲的是如何对别人向自己的开源仓库提的PR进行自动代码审核 1. 注册并登录Vercel 访问 Vercel官网点击右上角的"Sign Up"选择使用GitHub、GitLab、Bitbucket或邮箱注册完成注册流程并登录 2. 连接代码仓库 在Vercel仪表板,点击"New Proje…

JavaEE——多线程Thread 类及常见方法

目录 一、Thread(String name) 二、是否后台线程 isDeamon() 三、是否存活 isAlive() 四、run()方法和start()方法的区别 五、中断线程 法一&#xff1a; 法二&#xff1a; 六、线程等待join() 七、线程休眠sleep() 一、Thread(String name) 定义&#xff1a;这个东西…

初识Vue3(详细版)

目录 前言 Vue3简介 spring 和Vue3 区别 创建Vue3工程 1 使用vite 构建 0 前提;安装好node.js(node.js作为JavaScript的运行环境&#xff09; 1 打开终端&#xff0c;切换到桌面&#xff08;或自己专门创建一个文件夹单独放置&#xff09; 2 输入命令&#xff1a;npm ge…

怎样用云手机进行TikTok矩阵运营?

在运营TikTok矩阵时&#xff0c;许多用户常常面临操作复杂、设备过多等问题。如果你也感到操作繁琐&#xff0c;不妨考虑使用云手机。云手机具备丰富的功能&#xff0c;能够帮助电商卖家快速打造高效的TikTok矩阵。接下来&#xff0c;我们将详细解析这些功能如何提升你的运营效…

【4.6】图搜索算法-DFS和BFS解合并二叉树

一、题目 给定两个二叉树&#xff0c;想象当你将它们中的一个覆盖到另一个上时&#xff0c;两个二叉树的一些节点便会重叠。你需要将他们合并为一个新的二叉树。合并的规则是 如果两个节点重叠&#xff0c;那么将他们的 值相加作为节点合并后的新值&#xff0c;否则不为 NUL L…

浅谈抗量子密码学:保护未来的数字安全

一、引言 随着量子计算机技术的发展&#xff0c;传统的加密算法面临前所未有的挑战。量子计算机利用量子位&#xff08;qubits&#xff09;的特性&#xff0c;能够在理论上比经典计算机更快地破解现有的加密系统。为了应对这一威胁&#xff0c;研究者们正在开发所谓的“抗量子…