反编译8051二进制,从EEPROM读取
Decompiling 8051 binary, read from EEPROM
我正在尝试反编译 Logitech Freedom 2.4 Cordless Joystick 的固件。我设法得到了一些 EEPROM。 (here)
使用的EEPROM是Microchip 25AA320,它是一个32Kbit的SPI-EEPROM。 MCU 是一个 nRF24E1G ,包含一个 8051 MCU。
ROM 应该是 4096 字节,所以我认为我的阅读程序自己循环了 4 次。
我设法提取了一个 4kB ROM (here),但文件的开头看起来不干净。
我将这两个文件加载到 IDA Pro 和 Ghidra 中并选择了 8051 处理器。它们不会产生任何有用的东西。
谁能帮我反编译这个ROM?
我用了this 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
从微控制器的数据 sheet 我得知 EEPROM 的内容有一个 header 至少 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
最后一个条目好像差了一个,因为第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
我正在尝试反编译 Logitech Freedom 2.4 Cordless Joystick 的固件。我设法得到了一些 EEPROM。 (here) 使用的EEPROM是Microchip 25AA320,它是一个32Kbit的SPI-EEPROM。 MCU 是一个 nRF24E1G ,包含一个 8051 MCU。 ROM 应该是 4096 字节,所以我认为我的阅读程序自己循环了 4 次。 我设法提取了一个 4kB ROM (here),但文件的开头看起来不干净。
我将这两个文件加载到 IDA Pro 和 Ghidra 中并选择了 8051 处理器。它们不会产生任何有用的东西。
谁能帮我反编译这个ROM?
我用了this 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
从微控制器的数据 sheet 我得知 EEPROM 的内容有一个 header 至少 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
最后一个条目好像差了一个,因为第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