如何从二进制代码中确定 USB 控制器的指令集?

逆向工程 固件 USB
2021-06-30 17:15:22

我正在对 USB 控制器进行逆向工程。控制器芯片的名称是“UD6810”,它似乎是另一个芯片的中文克隆(因为很多关于它的结果已通过 DMCA 请求从 Google 中删除)。我找到了一个可以成功刷新固件的程序。

但是,我显然需要先确定指令集,然后才能对其进行修改。我在网上找到的数据表似乎缺少这些关键信息,而且文档通常很难找到。我有二进制代码,因为我既可以在闪烁程序的文件中看到它,又可以在它闪烁芯片时在 USB 流量中捕获它。

如何确定指令集?

1个回答

我不会回答您在标题中提出的问题,而是您实际需要的内容。

它是 8051 衍生品的可能性约为 99%。我不知道一个不使用的中国 USB 控制器。当然,虽然我还没有看到所有这些。

我从 flashboot.ru 为这个控制器下载了一个随机 MPTOOL,它有一些二进制文件。它们确实看起来像 8051 代码:

ROM:1B24             RESET_0:                                ; CODE XREF: RESETj
ROM:1B24 75 81 7E                    mov     SP, #RAM_7E     ; Stack Pointer
ROM:1B27 02 1B 65                    ljmp    ROM_1B65
ROM:1B2A             ; ---------------------------------------------------------------------------
ROM:1B2A
ROM:1B2A             ROM_1B2A:                               ; CODE XREF: RESET_0+48j
ROM:1B2A 02 1D 20                    ljmp    ROM_1D20
ROM:1B2D             ; ---------------------------------------------------------------------------
ROM:1B2D
ROM:1B2D             ROM_1B2D:                               ; CODE XREF: RESET_0+5Fj
ROM:1B2D E4                          clr     A
ROM:1B2E 93                          movc    A, @A+DPTR
ROM:1B2F A3                          inc     DPTR
ROM:1B30 F8                          mov     R0, A
ROM:1B31
ROM:1B31             ROM_1B31:                               ; CODE XREF: RESET_0+17j
ROM:1B31 E4                          clr     A
ROM:1B32 93                          movc    A, @A+DPTR
ROM:1B33 A3                          inc     DPTR
ROM:1B34 40 03                       jc      ROM_1B39
ROM:1B36 F6                          mov     @R0, A
ROM:1B37 80 01                       sjmp    ROM_1B3A

(这是Keil C51编译器产生的典型启动)

在 8051 二进制文件中看到的一些常见操作码:

02 xx xx   ljmp (absolute)
12 xx xx   lcall (absolute)
22         ret
E4         clr A
90 xx xx   mov DPTR, xxxx
A3         inc DPTR