Binary 反编译8051二进制文件,从EEPROM读取

Binary 反编译8051二进制文件,从EEPROM读取,binary,reverse-engineering,decompiling,8051,Binary,Reverse Engineering,Decompiling,8051,我正在尝试反编译Logitech Freedom 2.4无绳操纵杆的固件。我设法得到了一些EEPROM。 使用的EEPROM是微芯片25AA320,它是一个32Kbit SPI-EEPROM。MCU是一个nRF24E1G,包含一个8051 MCU。 ROM应该是4096字节,所以我认为我的读取程序在它上面循环了4次。 我设法提取了一个4kB的ROM,但文件的开头看起来不干净 我将这两个文件加载到IDA Pro和Ghidra中,并选择了8051处理器。它们不会产生任何有用的东西 有人能帮我反编译这

我正在尝试反编译Logitech Freedom 2.4无绳操纵杆的固件。我设法得到了一些EEPROM。 使用的EEPROM是微芯片25AA320,它是一个32Kbit SPI-EEPROM。MCU是一个nRF24E1G,包含一个8051 MCU。 ROM应该是4096字节,所以我认为我的读取程序在它上面循环了4次。 我设法提取了一个4kB的ROM,但文件的开头看起来不干净

我将这两个文件加载到IDA Pro和Ghidra中,并选择了8051处理器。它们不会产生任何有用的东西

有人能帮我反编译这个ROM吗

我用Arduino Sketch来转储rom。 与此python脚本一起使用

## Author: Arpan Das
## Date:   Fri Jan 11 12:16:59 2019 +0530
## URL: https://github.com/Cyberster/SPI-Based-EEPROM-Reader-Writer

## It listens to serial port and writes contents into a file
## requires pySerial to be installed 
import sys 
import serial
import time
start = time.time()

MEMORY_SIZE = 4096 # In bytes
serial_port = 'COM5'
baud_rate = 115200 # In arduino, Serial.begin(baud_rate)
write_to_file_path = "dump.rom"

output_file = open(write_to_file_path, "wb")
ser = serial.Serial(serial_port, baud_rate)

print("Press d for dump ROM else CTRL+C to exit.")
ch = sys.stdin.read(1)

if ch == 'd':
    ser.write('d')
    for i in range(MEMORY_SIZE/32): # i.e. MEMORY_SIZE / 32
        # wait until arduino response with 'W' i.e. 1 byte of data write request
        while (ser.read() != 'W'): continue
        ser.write('G') # sends back write request granted signal

        for j in range(32):
            byte = ser.read(1);
            output_file.write(byte);

        print(str(MEMORY_SIZE - (i * 32)) + " bytes remaining.")

print '\nIt took', time.time()-start, ' seconds.'

这就是我所做的,下一部分留给你。我的机器是Win10笔记本,但我使用unix工具,因为它们功能强大

首先,我将16KB转储划分为四个4KB部分。第一个与其他三个不同。提供的4KB转储与所有这些部件都不同。我没有进一步研究这个问题,只是从其他三个相等的部分中选取一个

$ split -b 4K LogitechFreedom2.4CordlessJoystick.rom part
$ cmp partaa partab
partaa partab differ: byte 1, line 1
$ cmp partab partac
$ cmp partac partad
$ cmp dump.rom partaa
dump.rom partaa differ: byte 9, line 1
$ cmp dump.rom partab
dump.rom partab differ: byte 1, line 1
从微控制器的数据表中,我了解到EEPROM的内容有一个至少3字节的标题,第61页第10.2章

这些字节是:

0b   Version = 00, Reserved = 00, SPEED = 0.5MHz, XO_FREQ = 16MHz
03   Offset to start of user program = 3
0f   Number of 256 bytes block = 15 
最后一个条目似乎关闭了1,因为第16个块中似乎也有代码

总之,这些字节看起来不错,所以我删掉了前3个字节

$ dd if=partad of=rom.bin bs=1 skip=3
4093+0 records in
4093+0 records out
4093 bytes (4,1 kB, 4,0 KiB) copied, 0,0270132 s, 152 kB/s
$ dd if=partad of=head.bin bs=1 count=3
3+0 records in
3+0 records out
3 bytes copied, 0,0043809 s, 0,7 kB/s
$ od -Ax -t x1 rom.bin > rom.hex
$ od -Ax -t x1 head.bin > head.hex
十六进制文件很适合将它们加载到编辑器中并四处查看

我将剩余的4093字节加载到一个我曾经编写过的反汇编程序中,并仔细查看了一下。看起来很有希望,所以我想你现在可以不用我了:

C0000:  ljmp    C0F54

C0003:  setb    021H.2
        reti

C000B:  xch     a,r5
        inc     r6
        xrl     a,r6
        mov     a,#0B2H
        movc    a,@a+pc
        movx    @r1,a
        mov     r7,a
        setb    021H.2
        reti

C0F54:  mov     psw,#000H
        mov     sp,#07BH
        mov     r0,#0FFH
        mov     @r0,#000H
        djnz    r0,C0F5C
        ljmp    C0C09

您是否阅读了数据表中有关EEPROM组织的章节?哦,请检查16K转储的4K页面是否正确。看起来前几个字节是错的。@thebusybee我检查过了。我不知道什么特征对应于我在问题中添加的用于转储EEPROM的Arduino代码。谢谢!我想您刚刚在反汇编程序中选择了8051指令集?如果是,您使用的是哪种拆装器Ghidra或IDA?Ghidra或IDA都没有。直到看到你的帖子,我才知道Ghidra,而IDA是非自由软件。我更喜欢自由/开源软件事实上,我使用了我在1999年左右编写的反汇编程序,但与当前的软件相比,它是原始的。很高兴知道这一点!我现在正在使用Ghidra,但我需要研究如何定义自定义指令集,因为MCU是8051指令的混合体,并且与Intel 8051不完全兼容