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

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 offled2 = 0;  // Initialize second LED to offwhile(1) { // Infinite loopMY_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 offled2 = 0;  // Initialize second LED to offwhile(1) { // Infinite loopif (button == 0) { // Check if button is pressedDelay(100); // Debounce delayif (button == 0) { // Confirm button is still pressedMY_REGISTER = 0; // Update MY_REGISTERwhile(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.mrgr.cn/news/37848.html

相关文章:

  • 设计模式之迭代器模式
  • 前端练习总结(1)
  • 解决方案:如何将字段名转成列,并将对应权重数值做好拼接
  • SQLite百万级数据量高性能读写
  • 基于springboot的书店图书销售管理系统的设计与实现 (含源码+sql+视频导入教程)
  • 技术速递|适用于 .NET 和 .NET MAUI Android 应用程序的 Android 资产包
  • ROS理论与实践学习笔记——2 ROS通信机制之通信机制实践
  • Redis篇(Java操作Redis)
  • 【MySQL】数据库表的基本查询——增删查改
  • 每日OJ_牛客_OR59字符串中找出连续最长的数字串_双指针_C++_Java
  • 【RabbitMQ】面试题
  • 这五本大模型书籍,让你从大模型零基础到精通,非常详细收藏我这一篇就够了
  • 在AI时代,程序员如何保持核心竞争力
  • Markdown语法总结
  • JAVA连接HDFS使用案例
  • OJ在线评测系统 将代码沙箱开放为API 跑通前端后端整个项目 请求对接口
  • 通义千问:让我的编程工作效率翻倍的秘密武器
  • H.264编码介绍
  • 【漏洞复现】公交IC卡收单管理系统 SQL注入致RCE漏洞复现
  • 洛谷 AT_abc275_c [ABC275C] Counting Squares 题解