矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 13939|回复: 51

今天做8051反汇编

[复制链接]
发表于 2013-12-8 10:50:46 | |阅读模式
第一次做反汇编。本来以为很困难,结果进展神速。如果知道原程序在做什么,做反汇编就容易多了。

这个反汇编不是为了盗版,而是想改嵌入程序,把硬件做其它用途。

原来以为原程序是用C写的。现在看起来,是用汇编写的。这样反而容易解开。

反汇编首先就是把标签一个个改成有意义的东西。

比如,读按钮,写入闪存,等等。这样原来的数字渐渐就变得有意义了。

估计几天就能全部解开。

当然需要了解各端口的用途。以下是一段例子, write_flash 等文字原来是类似 Q063F 之类没有意义的数字。看懂以后就改成有意义的标签。

Q064A:             ACALL Q0699
                   ACALL write_bit
                   MOV   A,DPH
                   RLC   A
                   ANL   A,#0EH
                   ORL   A,#A1H
                   ACALL write_flash
                   ACALL read_bit
                   JC    Q064A
                   ACALL read_flash
                   AJMP  Q067B
Q065F:             MOV   R0,#40H
Q0661:             MOV   R7,#10H
Q0663:             ACALL Q0699
Q0665:             MOV   A,@R0

如果有人需要做反汇编,可以和我讨论。

     
发表于 2013-12-8 10:54:16 |
楼主高手啊,研究过刷winCE 刷MCU字库吗?
发表于 2013-12-8 11:16:58 |
高!学习了!
 楼主| 发表于 2013-12-8 11:43:18 |
zsmax2008 发表于 2013-12-8 10:54
楼主高手啊,研究过刷winCE 刷MCU字库吗?

没研究过,这个应该和操作系统有关。
     
发表于 2013-12-8 12:10:40 |
本帖最后由 蓝绿黄 于 2013-12-8 12:16 编辑

楼主,反汇编是将机器语言(对于51来说就是HEX或BIN文件)还原成汇编语言或高级语言。
你贴出来的那段是从机器语言还原过来的?原来的机器语言是什么样的?

这是一个HEX文件,把它还原成汇编才叫反汇编吧
QQ截图20131208121353.png
 楼主| 发表于 2013-12-8 13:41:52 |
蓝绿黄 发表于 2013-12-8 12:10
楼主,反汇编是将机器语言(对于51来说就是HEX或BIN文件)还原成汇编语言或高级语言。
你贴出来的那段是从 ...

机器语言格式有两种,hex 或者 bin.  你显示的是hex。我的原来是 bin

无论何者,可以用工具直接翻译成汇编。但是里面都是数字,标签也没有意义。所以无法改动。

必须把这些数字标签改成有意义的说明,才能了解程序在做什么,才能进一步更改程序。
     
发表于 2013-12-8 22:32:20 |
本帖最后由 chi_mei 于 2013-12-8 22:38 编辑

程序经过汇编后就是机器码,标号都没有了。反汇编时会把数据也反汇编成程序。除非你能通过看程序找到其中的数据,不然无法看懂。再有你得知道主程序的开始地址,如果从0000H开始反汇编,不一定出来什么程序呢。
     
发表于 2013-12-8 23:00:33 |
有专门的反汇编软件的,以前在某单位做软件的人做过,将解密出来的代码经过反汇编软件翻译后可读懂的,关键要对芯片口了如指掌才能读懂。
 楼主| 发表于 2013-12-9 08:12:36 |
SANSEN 发表于 2013-12-8 23:00
有专门的反汇编软件的,以前在某单位做软件的人做过,将解密出来的代码经过反汇编软件翻译后可读懂的,关键 ...

是的,上面提过。

从机器码变成汇编只需要用工具,不到一秒完成。

但里面的标签全部是没有意义的数字。所以无法了解其内容,也就无法更改。

如何从没有意义的标签还原整个程序,这是关键。

整个过程很像破解军事密码,或者像拼图,开始毫无头绪,但是解出越多,就越容易解出其它部分。

拼完一部分,就把标签改成有意义的名字(函数的名字)

我先从读写闪存部分下手,因为里面的端口很容易看出来。

最困难的部分是,查出变量的意义。
     
发表于 2013-12-9 08:36:53 |
反汇编,最简单的就是51DASM,要是好的话就用IDA。
发表于 2013-12-9 08:54:58 |
楼主来个一步一步的嘛
想学习一下  但是没时间弄

现在还在学C呢  虽然一开始学的汇编  

还有就是hex的话要去掉开头的标示和结尾的CRC哦。。
     
发表于 2013-12-9 09:52:51 |
我原来用的是ME-52A仿真器,可以直接反汇编。不过现在的电脑都没有并口,无法使用了。反汇编容易,但是反汇编出来的程序可能根本不是原来的程序。51的指令有3字节的,从第一个字节反汇编是正确的,从其他字节反汇编就乱了。
fhb.JPG
 楼主| 发表于 2013-12-9 09:54:19 |
xou822 发表于 2013-12-9 08:54
楼主来个一步一步的嘛
想学习一下  但是没时间弄

要能做反汇编,需要对系统很熟悉。

刚开始,你拿到手的是类似下面这段

Q0685:             ACALL Q067B
                   SJMP  Q0670
Q0689:             MOV   0AH,#02H
                   AJMP  Q073D
Q068E:             MOV   0AH,#80H
                   AJMP  Q073D
Q0693:             ACALL Q068E
                   DEC   A
                   JNZ   Q0693
                   RET

不知道干啥。但你一步步解开,把数字用有意义的名字代替,就知道了。比如下面这段,就是解开的了。就是写一个字符到闪存。

write_byte:        MOV   R2,#08H ; write 8 bits from A to flash
f06C8:             RLC   A
                   MOV   fdata,C
                   NOP
                   SETB  clock        ; clock data
                   NOP
                   NOP
                   CLR   clock
                   DJNZ  R2,f06C8
                   RET

 楼主| 发表于 2013-12-9 09:56:24 |
chi_mei 发表于 2013-12-9 09:52
我原来用的是ME-52A仿真器,可以直接反汇编。不过现在的电脑都没有并口,无法使用了。反汇编容易,但是反汇 ...

一般而言,反汇编还不至于造成位置错乱,因为错乱会产生一些不存在的指令。
 楼主| 发表于 2013-12-9 10:22:07 |
最难的是这种很简短的

                   SETB  20H.5
                   JB    20H.5,$
                   RET

懂汇编的人看看,那个JB指令似乎无用?
20H.5变量的作用是什么,完全不知道,只能慢慢像拼图一样猜。

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2024-4-26 02:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表