AT89C51 Intel HEX手工结构分析 反汇编工具

news2024/9/20 14:00:21

在不查询格式情况下分析确定 Intel HEX 格式

Hex文件内容

image.png

:0300000002090BE7
:0C090B00787FE4F6D8FD7581080208F63C
:01091700419E
:1008F60078087C007D007BFF7A0979177E007F01EE
:050906001208D080FE84
:10080000E709F608DFFA8046E709F208DFFA803EDA
:1008100088828C83E709F0A3DFFA8032E309F608C7
:10082000DFFA8078E309F208DFFA807088828C832F
:10083000E309F0A3DFFA806489828A83E0A3F608E3
:10084000DFFA805889828A83E0A3F208DFFA804CBD
:1008500080D280FA80C680D4806980F28033801094
:1008600080A680EA809A80A880DA80E280CA8033FD
:1008700089828A83ECFAE493A3C8C582C8CCC58375
:10088000CCF0A3C8C582C8CCC583CCDFE9DEE78045
:100890000D89828A83E493A3F608DFF9ECFAA9F0C4
:1008A000EDFB2289828A83ECFAE0A3C8C582C8CC1A
:1008B000C583CCF0A3C8C582C8CCC583CCDFEADE33
:1008C000E880DB89828A83E493A3F208DFF980CC95
:1008D00088F0EF60010E4E60C388F0ED2402B4048E
:1008E0000050B9F582EB2402B4040050AF23234535
:0608F00082239008507302
:00000001FF

返回Keil中分析反汇编程序

机器码为02090B

在第一行中

:03000000-02090B-E7

image-1.png

而在第二行090B作为段地址,由此推断第二个位置是存放2Bytes的地址的

:0C-090B-00787FE4F6D8FD7581080208F6-3C

跟进地址090B后发现首个机器码是

C:0x090B 787F MOV R0,#0x7F0850EB - 1

所以现在需要分隔00

:0C-090B-00-787FE4F6D8FD7581080208F6-3C

image-2.png

仔细发现前0C似乎是一个长度大小,转为10进制为12。计算载荷长度为24,由此推断0C是12Bytes。

image-3.png

现在确定了每一段的结构

:<载荷长度>:<段地址>:<类型>:<载荷>:<校验>

def parse_hex_file(hex_file_path):
    """Parse Intel HEX file and return a list of (address, data_bytes) tuples."""
    records = []
    try:
        with open(hex_file_path, 'r') as file:
            for line in file:
                line = line.strip()
                if not line or line[0] != ':':
                    continue
                record_length = int(line[1:3], 16)
                address = int(line[3:7], 16)
                record_type = int(line[7:9], 16)
                data = line[9:9 + record_length * 2]
                checksum = int(line[9 + record_length * 2:11 + record_length * 2], 16)
                if record_type == 0x00:  # Data record
                    data_bytes = bytearray.fromhex(data)
                    records.append((address, data_bytes))
                elif record_type == 0x01:  # End of File record
                    break
    except Exception as e:
        print(f"Error reading file: {e}")
    return records

def hex_to_assembly(data_bytes, start_address):
    """Convert a byte array to C51 assembly code."""
    assembly_code = []
    i = 0
    while i < len(data_bytes):
        opcode = data_bytes[i]
        if opcode == 0x02 and i + 2 < len(data_bytes):  # LJMP addr
            addr = (data_bytes[i + 1] << 8) | data_bytes[i + 2]
            assembly_code.append(f"LJMP {addr:04X}")
            i += 3
        elif opcode == 0x78:  # MOV R0, #data
            data = data_bytes[i + 1]
            assembly_code.append(f"MOV R0, #{data:02X}")
            i += 2
        elif opcode == 0xE4:  # CLR A
            assembly_code.append("CLR A")
            i += 1
        elif opcode == 0xF6:  # MOV @R0, A
            assembly_code.append("MOV @R0, A")
            i += 1
        elif opcode == 0xD8 and i + 2 < len(data_bytes):  # DJNZ R0, addr
            addr = (data_bytes[i + 1] << 8) | data_bytes[i + 2]
            assembly_code.append(f"DJNZ R0, {addr:04X}")
            i += 3
        elif opcode == 0x75 and i + 2 < len(data_bytes):  # MOV Rn, data
            reg = data_bytes[i + 1]
            data = data_bytes[i + 2]
            assembly_code.append(f"MOV R{reg}, #{data:02X}")
            i += 3
        elif opcode == 0x80 and i + 1 < len(data_bytes):  # SJMP addr
            offset = data_bytes[i + 1]
            address = start_address + i + 2 + offset
            assembly_code.append(f"SJMP {address:04X}")
            i += 2
        elif opcode == 0x90 and i + 1 < len(data_bytes):  # NOP
            assembly_code.append("NOP")
            i += 1
        else:
            # Handle other opcodes or unknown opcodes
            assembly_code.append(f"DB {opcode:02X}")  # Unknown opcode
            i += 1

    return assembly_code

def main():
    hex_file_path = "test.hex"  # Path to your .hex file
    data_records = parse_hex_file(hex_file_path)

    for address, data_bytes in data_records:
        print(f"Address: {address:04X}")
        assembly_code = hex_to_assembly(data_bytes, address)
        for line in assembly_code:
            print(f"    {line}")

if __name__ == "__main__":
    main()

通过以上简单的程序可以进行反汇编

image-4.png

反汇编

除了使用IDA Pro反汇编,如果你没有IDA正版激活,还可以使用免费版的8051 Disassembler

https://www.spicelogic.com/Products/8051-disassembler-1

image-5.png

利用场景:LCD解锁系统,若密码忘记,则可以通过仅存在hex文件,来反汇编分析出解锁密码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2139728.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++基础面试题 | C++中的构造函数可以是虚函数吗? C++中的析构函数一定要是虚函数吗?

文章目录 问题一&#xff1a;在C中&#xff0c;构造函数不能是虚函数。问题二&#xff1a;析构函数不一定需要声明为虚函数&#xff0c;但在多态环境下&#xff0c;建议一定将其声明为虚函数。示例虚函数总结 问题一&#xff1a;在C中&#xff0c;构造函数不能是虚函数。 这是…

PMP--一模--解题--81-90

文章目录 4.整合管理81、 [单选] 一位先前不活跃的干系人参与程度突然增加&#xff0c;这种意外的参与导致了一些变更请求。项目经理应该做什么&#xff1f; 4.整合管理82、 [单选] 公司的新产品系列将在两个月内发布&#xff0c;95%的项目任务均已完成。但是&#xff0c;管理层…

二分算法——优选算法

个人主页&#xff1a;敲上瘾-CSDN博客 个人专栏&#xff1a;游戏、数据结构、c语言基础、c学习、算法 本章我们来学习的是二分查找算法&#xff0c;二分算法的应用非常广泛&#xff0c;不仅限于数组查找&#xff0c;还可以用于解决各种搜索问题、查找极值问题等。在数据结构和算…

无人机飞手培训机构组建及市场分析

飞手培训机构是专门为培养无人机飞行员&#xff08;飞手&#xff09;而设立的教育机构。这些机构通过提供专业的培训课程&#xff0c;帮助学员掌握无人机飞行技术、了解相关法规、提升实战能力&#xff0c;并最终获得相关证书&#xff0c;以便在航拍摄影、农业植保、物流配送、…

MS SQL Server 实战 排查多列之间的值是否重复

目录 需求 范例运行环境 数据样本设计 功能实现 上传EXCEL文件到数据库 SQL语句 小结 需求 在日常的应用中&#xff0c;排查列重复记录是经常遇到的一个问题&#xff0c;但某些需求下&#xff0c;需要我们排查一组列之间是否有重复值的情况。比如我们有一组题库数据&…

django实现开发、测试、生产环境配置区分

文章目录 一、为什么要区分开发 (dev)、测试 (test) 和生产 (prod) 环境二、django项目如何通过配置实现环境配置的区分1、针对不同的环境创建不同的设置文件settings.py2、在设置文件中根据需要进行配置区分3、根据不同的环境运行使用不同的设置文件 任何实际的软件项目中都要…

使用Python打造全自动wx好友添加器:批量操作,高效省时的社交神器

在现代的数字营销和社交扩展中&#xff0c;自动化操作可以显著提高效率。尤其是wx这种广泛使用的即时通讯工具&#xff0c;很多用户有批量添加好友的需求&#xff0c;但手动操作费时费力。本教程将详细介绍如何使用 Python 开发一个自动化工具&#xff0c;帮助你批量添加wx好友…

宏任务和微任务+超全面试真题(持续更新ing

概念 微任务和宏任务是在异步编程中经常使用的概念&#xff0c;用于管理任务的执行顺序和优先级。 宏任务&#xff1a;setTimeout, setInterval&#xff0c;I/O 操作和 UI 渲染等。微任务&#xff1a; Promise 回调、async/await等 微任务通常比宏任务具有更高的优先级。 执…

C#基础(11)函数重载

前言 前面我们已经完成了ref和out补充知识点的学习&#xff0c;以及函数参数相关的学习&#xff0c;今天便再次为函数补充一个知识点&#xff1a;函数重载。 函数重载是指在同一个作用域中&#xff0c;可以有多个同名函数&#xff0c;但参数列表不同。它的发展可以追溯到早期…

【Chrome】开发一个Chrome扩展以及常见问题的解决方案

前言 本文介绍开发chrome扩展很重要的几种操作&#xff0c;如&#xff1a;操作网页dom、发送请求、渲染弹层、不同沙盒环境的通信方式、扩展与网页的通信方式、遇到iframe时的操作等。最终会提供一个简单的案例&#xff0c;其中涵盖了上述操作。 还有一些本人相关文章&#x…

HashMap 详解

哈希表 哈希表又叫散列表&#xff0c;或者映射、字典都是指哈希表&#xff0c;哈希表是通过关键码映射到数组的某个位置来访问的数据结构&#xff0c;实现这个映射的函数就是哈希函数&#xff0c;哈希表结合了数组和链表的优点&#xff0c;查找和插入操作的时间复杂度都是O(1)。…

MySQL篇(高级字符串函数/正则表达式)(持续更新迭代)

目录 讲点一&#xff1a;高级字符串函数 一、简介 二、常见字符串函数 1. CONCAT() 2. SUBSTRING() 3. LENGTH() 4. REPLACE() 5. TRIM() 6. UPPER() 7. LOWER() 8. LEFT() 9. RIGHT() 10. INSTR() 11. LENTH(str) 讲点二&#xff1a;正则表达式 一、简介 二、…

AIGC实战——多模态模型Flamingo

AIGC实战——多模态模型Flamingo 0. 前言1. Flamingo 架构2. 视觉编码器3. Perceiver 重采样器4. 语言模型5. FIamingo 应用小结系列链接 0. 前言 我们已经学习了文本生成图像模型 DALL.E 2&#xff0c;在本节中&#xff0c;我们将探索另一种多模态模型 Flamingo&#xff0c;它…

学习使用在windows系统上安装nodejs以及环境配置图文教程整理

学习使用在windows系统上安装nodejs以及环境配置图文教程整理 Node.js 介绍Node.js 安装1、Node.js下载2、Node.js安装3、Node.js测试4、Node.js安装目录5、Node.js环境变量配置6、配置镜像站&#xff0c;提升速度7、检查镜像站配置8、测试环境变量是否生效9、安装cnpm Node.js…

jwt报错,位置:找不到符号 parseClaimsJws(java.lang.String)

报错显示如图 报错信息为&#xff1a; E:\idea\project\tlias\src\main\java\org\itheima\tlias\utils\JwtUtils.java:36:17 java: 找不到符号 符号: 方法 parseClaimsJws(java.lang.String) 位置: 接口 io.jsonwebtoken.JwtParserBuilder 解决办法 项目使用的是最新…

p12docker 进入容器的命令和拷贝的命令

进入当前正在运行的容器 第一种方式是执行docker exec -it 8d57ffda7a29 /bin/bash这个时候可以根据docker容器的id进入到指定id的容器当中***(这个是比较常用的)*** 老师的笔记 第二种方式是docker attach 8d57ffda7a29 这里还是直接引用老师的笔记吧 从容器内部拷贝文…

HAL库学习梳理——GPIO

笔者跟着B站铁头山羊视频学习 STM32-HAL库 开发教程。有一说一&#xff0c;这个教程自诩为“最佳教程&#xff0c;没有之一~”&#xff0c;确实有点东西。像我这种看视频想睡觉的入门小白来说&#xff0c;感觉捡到宝了。下面对这些课程的应用做一个梳理。 省流&#xff1a; HA…

2-3.Android 存储之存储空间(私有空间、公共空间)

一、内部存储与外部存储 内部存储指位于设备的内部存储空间 外部存储指位于设备的外部存储介质&#xff0c;例如&#xff0c;SD 卡 简单理解&#xff0c;内部存储就是存储在手机自身&#xff0c;外部存储就是存储在手机可以外接的东西&#xff0c;好比电脑的硬盘和 U 盘 二、…

7-1 两个有序链表序列的交集

已知两个非降序链表序列S1与S2&#xff0c;设计函数构造出S1与S2的交集新链表S3。 输入格式: 输入分两行&#xff0c;分别在每行给出由若干个正整数构成的非降序序列&#xff0c;用−1表示序列的结尾&#xff08;−1不属于这个序列&#xff09;。数字用空格间隔。 输出格式:…

『功能项目』切换职业技能面板【49】

我们打开上一篇48切换职业面板的项目&#xff0c; 本章要做的事情是制作第二职业法师技能面板、第三职业面板并且完成切换 双击打开Canvas进入预制体空间 复制三个技能栏面板 重命名 设置第一技能栏 设置第二职业技能栏 设置第三职业技能栏 修改脚本&#xff1a;ChangeProfess…