打印

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

[复制链接]
5488|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 叶春勇 于 2021-9-28 11:09 编辑

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

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

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

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

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

五、switch case 机构
参考代码,特征明显
                             LAB_CODE_0094                                   XREF[1]:     CODE:00c9(j)  
       CODE:0094 e5 08           MOV        A,BANK1_R0                                       = ??
       CODE:0096 14              DEC        A
       CODE:0097 60 12           JZ         LAB_CODE_00ab
       CODE:0099 14              DEC        A
       CODE:009a 60 14           JZ         LAB_CODE_00b0
       CODE:009c 14              DEC        A
       CODE:009d 60 16           JZ         LAB_CODE_00b5
       CODE:009f 14              DEC        A
       CODE:00a0 60 18           JZ         LAB_CODE_00ba
       CODE:00a2 24 04           ADD        A,#0x4
       CODE:00a4 70 19           JNZ        LAB_CODE_00bf
       CODE:00a6 75 09 0a        MOV        BANK1_R1,#0xa                                    = ??
       CODE:00a9 80 17           SJMP       LAB_CODE_00c2
                             LAB_CODE_00ab                                   XREF[1]:     CODE:0097(j)  
       CODE:00ab 75 09 01        MOV        BANK1_R1,#0x1                                    = ??
       CODE:00ae 80 12           SJMP       LAB_CODE_00c2
                             LAB_CODE_00b0                                   XREF[1]:     CODE:009a(j)  
       CODE:00b0 75 09 21        MOV        BANK1_R1,#0x21                                   = ??
       CODE:00b3 80 0d           SJMP       LAB_CODE_00c2
                             LAB_CODE_00b5                                   XREF[1]:     CODE:009d(j)  
       CODE:00b5 75 09 0b        MOV        BANK1_R1,#0xb                                    = ??
       CODE:00b8 80 08           SJMP       LAB_CODE_00c2
                             LAB_CODE_00ba                                   XREF[1]:     CODE:00a0(j)  
       CODE:00ba 75 09 16        MOV        BANK1_R1,#0x16                                   = ??
       CODE:00bd 80 03           SJMP       LAB_CODE_00c2
                             LAB_CODE_00bf                                   XREF[1]:     CODE:00a4(j)  
       CODE:00bf e4              CLR        A
       CODE:00c0 f5 09           MOV        BANK1_R1,A                                       = ??
                             LAB_CODE_00c2                                   XREF[5]:     CODE:00a9(j), CODE:00ae(j),
                                                                                          CODE:00b3(j), CODE:00b8(j),
                                                                                          CODE:00bd(j)  
       CODE:00c2 05 08           INC        BANK1_R0                                         = ??
       CODE:00c4 53 08 03        ANL        BANK1_R0,#0x3                                    = ??
       CODE:00c7 05 09           INC        BANK1_R1                                         = ??
       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折腾的

基本够用了。

使用特权

评论回复
5
叶春勇|  楼主 | 2021-9-29 11:20 | 只看该作者
补,多分支,跟switch case结构一样,裸奔中状态机简单的也有这样写的。
if(cond1) do1();
else if (cond2) do2();
....
else don();

汇编定式:

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

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

151

主题

4810

帖子

50

粉丝