51单片机反汇编笔记_定式篇

[复制链接]
 楼主| 叶春勇 发表于 2021-9-28 10:52 | 显示全部楼层 |阅读模式
本帖最后由 叶春勇 于 2021-9-28 11:09 编辑

最近机缘巧合复习了一下51单片机的反汇编,查了个参数。
在PC机上的反汇编有很多学习资料,但是嵌入式的好少。以下是我根据PC机的反汇编套路,对keil c51的程序结构进行分析。
首先是程序定式:
一、单分支
C代码
  1. C语言单分支
  2. if(cond)
  3. {
  4.         do_something();
  5. }
keil c51汇编器的定式:
  1. 单分支定式:
  2. IF_BEGIN:
  3.         JXX        IF_END
  4.         ...
  5. IF_END:
论述:
1、jxx代表条件跳转
2、c的条件,满足则执行。汇编的条件,满足则跳走,不满足则执行。所以c语言的条件与汇编相反。
3、jxx 往“下”跳,即往高地址跳。与下面所述的循环定式往“上”跳,相反。

二、双分支
c代码:
  1. if(cond)
  2. {
  3.         do_something_1();
  4. }
  5. else
  6. {
  7.         do_something_2();
  8. }
keil c51汇编器的定式:
  1. IF_BEGIN:
  2.      JXX        ELSE_BEGIN
  3.       ...
  4. IF_END:
  5.      XJMP ELSE_END
  6. ELSE_BEGIN:
  7.       ...
  8. ELSE_END:
论述:
1、相比单分支,有一个xJMP,通常是sjmp
2、与C语言条件相反。

三、do_while循环
c语言代码
  1. do
  2. {
  3.         do_something();
  4. } while(cond);
keil c51 汇编定式:
  1. DO_BEGIN:
  2.     ...
  3.     JXX DO_BEGIN
论述:
1、循环往“上”跳,即往低地址跳。鉴别条件分支结构和循环结构的关键
2、按PC机的汇编器的优化,编译器喜欢把while和for循环往do while循环优化。

四、while循环
C语言:
  1. while(cond)
  2. {
  3.         do_something();
  4. }
keil c51汇编器定式:
  1. WHILE_BEGIN:
  2.     ...
  3.     JXX        WHILE_END
  4. BODY:
  5.     ...
  6.     XJMP WHILE_BEGIN
  7. WHILE_END:
论述:
1、相比do while循环多了一个xjmp,通常是sjmp指令。
2、往上跳

五:for循环
C语言:
  1. for(INIT,COND,STEP)
  2. {
  3.         do_something();
  4. }
keil c51 汇编定式:
  1. FOR_INIT:
  2.     ...
  3. FOR_COND:
  4.     ...
  5.     JXX WHILE_END
  6. BODY:
  7.     ...
  8. FOR_STEP:
  9.     ...
  10.     XJMP FOR_COND
  11. WHILE_END:
论述:
1、为了让人用着舒服,汇编代码复杂多了。
2、for循环,是if+dowhile循环的混合体。

五、switch case 机构
参考代码,特征明显
  1.                              LAB_CODE_0094                                   XREF[1]:     CODE:00c9(j)  
  2.        CODE:0094 e5 08           MOV        A,BANK1_R0                                       = ??
  3.        CODE:0096 14              DEC        A
  4.        CODE:0097 60 12           JZ         LAB_CODE_00ab
  5.        CODE:0099 14              DEC        A
  6.        CODE:009a 60 14           JZ         LAB_CODE_00b0
  7.        CODE:009c 14              DEC        A
  8.        CODE:009d 60 16           JZ         LAB_CODE_00b5
  9.        CODE:009f 14              DEC        A
  10.        CODE:00a0 60 18           JZ         LAB_CODE_00ba
  11.        CODE:00a2 24 04           ADD        A,#0x4
  12.        CODE:00a4 70 19           JNZ        LAB_CODE_00bf
  13.        CODE:00a6 75 09 0a        MOV        BANK1_R1,#0xa                                    = ??
  14.        CODE:00a9 80 17           SJMP       LAB_CODE_00c2
  15.                              LAB_CODE_00ab                                   XREF[1]:     CODE:0097(j)  
  16.        CODE:00ab 75 09 01        MOV        BANK1_R1,#0x1                                    = ??
  17.        CODE:00ae 80 12           SJMP       LAB_CODE_00c2
  18.                              LAB_CODE_00b0                                   XREF[1]:     CODE:009a(j)  
  19.        CODE:00b0 75 09 21        MOV        BANK1_R1,#0x21                                   = ??
  20.        CODE:00b3 80 0d           SJMP       LAB_CODE_00c2
  21.                              LAB_CODE_00b5                                   XREF[1]:     CODE:009d(j)  
  22.        CODE:00b5 75 09 0b        MOV        BANK1_R1,#0xb                                    = ??
  23.        CODE:00b8 80 08           SJMP       LAB_CODE_00c2
  24.                              LAB_CODE_00ba                                   XREF[1]:     CODE:00a0(j)  
  25.        CODE:00ba 75 09 16        MOV        BANK1_R1,#0x16                                   = ??
  26.        CODE:00bd 80 03           SJMP       LAB_CODE_00c2
  27.                              LAB_CODE_00bf                                   XREF[1]:     CODE:00a4(j)  
  28.        CODE:00bf e4              CLR        A
  29.        CODE:00c0 f5 09           MOV        BANK1_R1,A                                       = ??
  30.                              LAB_CODE_00c2                                   XREF[5]:     CODE:00a9(j), CODE:00ae(j),
  31.                                                                                           CODE:00b3(j), CODE:00b8(j),
  32.                                                                                           CODE:00bd(j)  
  33.        CODE:00c2 05 08           INC        BANK1_R0                                         = ??
  34.        CODE:00c4 53 08 03        ANL        BANK1_R0,#0x3                                    = ??
  35.        CODE:00c7 05 09           INC        BANK1_R1                                         = ??
  36.        CODE:00c9 80 c9           SJMP       LAB_CODE_0094
多个条件跳转,规则且对齐的往下跳,且与某个变量有关。
 楼主| 叶春勇 发表于 2021-9-28 11:21 | 显示全部楼层
综上所述:
1、与PC机的程序结构大部分相同
2、程序结构的识别,逆向工程的基础,根据反汇编的代码迅速反推出C语言的程序
3、由于8位机,对于16位,32位,浮点,基本都要进行算法扩展。算法分析,比pc机稍微复杂一些。
xxdcq 发表于 2021-9-29 10:25 | 显示全部楼层
能把数据和代码分开的反汇编才是高质量的好汇编
 楼主| 叶春勇 发表于 2021-9-29 10:50 | 显示全部楼层
xxdcq 发表于 2021-9-29 10:25
能把数据和代码分开的反汇编才是高质量的好汇编

你说的数据与代码的区分,这个是基本功。嵌入式的程序结构还是很清晰的。
51单片机,前面的基本都是跳转,程序结构很好分析。
通用反汇编软件一般不做这些。我测试了一下ghidra去弄一下stm32f303cbt6,用的是俄罗斯的数字电桥uLCR的固件,基本不能识别。

这个固件有访问GUID

很容易锁定程序是怎么使用guid折腾的

基本够用了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 叶春勇 发表于 2021-9-29 11:20 | 显示全部楼层
补,多分支,跟switch case结构一样,裸奔中状态机简单的也有这样写的。
  1. if(cond1) do1();
  2. else if (cond2) do2();
  3. ....
  4. else don();

汇编定式:

论述:
1、跟双分支类似,
2、xjmp(else)往一个标号跳

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

151

主题

4810

帖子

50

粉丝
快速回复 在线客服 返回列表 返回顶部

151

主题

4810

帖子

50

粉丝
快速回复 在线客服 返回列表 返回顶部