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

devtools/2024/10/15 23:46:15/

在不查询格式情况下分析确定 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] != ':':continuerecord_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 recorddata_bytes = bytearray.fromhex(data)records.append((address, data_bytes))elif record_type == 0x01:  # End of File recordbreakexcept Exception as e:print(f"Error reading file: {e}")return recordsdef hex_to_assembly(data_bytes, start_address):"""Convert a byte array to C51 assembly code."""assembly_code = []i = 0while i < len(data_bytes):opcode = data_bytes[i]if opcode == 0x02 and i + 2 < len(data_bytes):  # LJMP addraddr = (data_bytes[i + 1] << 8) | data_bytes[i + 2]assembly_code.append(f"LJMP {addr:04X}")i += 3elif opcode == 0x78:  # MOV R0, #datadata = data_bytes[i + 1]assembly_code.append(f"MOV R0, #{data:02X}")i += 2elif opcode == 0xE4:  # CLR Aassembly_code.append("CLR A")i += 1elif opcode == 0xF6:  # MOV @R0, Aassembly_code.append("MOV @R0, A")i += 1elif opcode == 0xD8 and i + 2 < len(data_bytes):  # DJNZ R0, addraddr = (data_bytes[i + 1] << 8) | data_bytes[i + 2]assembly_code.append(f"DJNZ R0, {addr:04X}")i += 3elif opcode == 0x75 and i + 2 < len(data_bytes):  # MOV Rn, datareg = data_bytes[i + 1]data = data_bytes[i + 2]assembly_code.append(f"MOV R{reg}, #{data:02X}")i += 3elif opcode == 0x80 and i + 1 < len(data_bytes):  # SJMP addroffset = data_bytes[i + 1]address = start_address + i + 2 + offsetassembly_code.append(f"SJMP {address:04X}")i += 2elif opcode == 0x90 and i + 1 < len(data_bytes):  # NOPassembly_code.append("NOP")i += 1else:# Handle other opcodes or unknown opcodesassembly_code.append(f"DB {opcode:02X}")  # Unknown opcodei += 1return assembly_codedef main():hex_file_path = "test.hex"  # Path to your .hex filedata_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.ppmy.cn/devtools/112764.html

相关文章

小说阅读书城微信小程序

小说阅读书城微信小程序 摘 要 当今时代&#xff0c;是信息大爆炸的时代&#xff0c;人们每天都能接收到数不清的各类信息&#xff0c;其形式不仅包含传统的文字和图片&#xff0c;还有视频、音频等多阅读资料源也较以往增长了太多。因此市面上各种阅读类应用的用户体验参差不…

(181)时序收敛--->(31)时序收敛三一

1 目录 (a)FPGA简介 (b)Verilog简介 (c)时钟简介 (d)时序收敛三一 (e)结束 1 FPGA简介 (a)FPGA(Field Programmable Gate Array)是在PAL (可编程阵列逻辑)、GAL(通用阵列逻辑)等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域…

CMake构建学习笔记15-组建第一个程序项目

文章目录 1 概述2 具体案例2.1 代码编写2.2 构建配置2.3 依赖库配置 3 构建结果 1 概述 在前文中论述的都是如何使用CMake构建第三方依赖库&#xff0c;不过这些库都是别人的程序项目&#xff0c;那么如何使用CMake组织构建一个属于自己的C/C程序项目呢&#xff1f;本文我们就…

【自动化测试】UI自动化的分类、如何选择合适的自动化测试工具以及其中appium的设计理念、引擎和引擎如何工作

引言 UI自动化测试主要针对软件的用户界面进行测试&#xff0c;以确保用户界面元素的交互和功能符合预期 文章目录 引言一、UI自动化的分类1.1 基于代码的自动化测试1.2 基于录制/回放的自动化测试1.3 基于框架的自动化测试1.4 按测试对象分类1.5 按测试层次分类1.6 按测试执行…

R语言论文插图模板第10期—正负柱状图

在之前的文章中&#xff0c;分享了R语言各式柱状图的绘制模板&#xff1a; 进一步&#xff0c;再来分享一种特殊的柱状图&#xff1a;正负柱状图。 先来看一下成品效果&#xff1a; 特别提示&#xff1a;本期内容『数据代码』已上传资源群中&#xff0c;加群的朋友请自行下载。…

龙蜥8.9系统hadoop3.3.6上spark3.5.2安装(伪分布)

继续接着上篇的环境安装。 1、去清华的镜像源下载相关文件 https://mirrors.tuna.tsinghua.edu.cn/apache/spark/spark-3.5.2/ 2、解压缩 tar zxvf spark-3.5.2-bin-hadoop3.tgz3、移动到适当位置 mv spark-3.5.2-bin-hadoop3 /app/spark-34、下载scala https://www.scala-la…

54. 二叉搜索树的第 k 大节点

comments: true difficulty: 简单 edit_url: https://github.com/doocs/leetcode/edit/main/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9854.%20%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E7%9A%84%E7%AC%ACk%E5%A4%A7%E8%8A%82%E7%82%B9/README.md 面试题 54. 二叉搜索树的第 k 大…

【加密算法基础——对称加密和非对称加密】

对称加密与非对称加密 对称加密和非对称加密是两种基本的加密方法&#xff0c;各自有不同的特点和用途。以下是详细比较&#xff1a; 1. 对称加密 特点 密钥: 使用相同的密钥进行加密和解密。发送方和接收方必须共享这个密钥。速度: 通常速度较快&#xff0c;适合处理大量数…