原创 HotC51共产儿童团第六课:让逆向者(包括菜农)回家卖豆腐

2009-2-24 20:31 2757 3 3 分类: MCU/ 嵌入式
HotC51 发表于 2009-2-24 20:30 裸奔式实时操作系统HotTask51 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

楼主: HotC51共产儿童团第六课:让逆向者(包括菜农)回家卖豆腐


逆向者乃反汇编之人也。

反汇编乃将机器码变成助记符是的汇编文本。

汇编乃一切人类语言之编译之终点也。

有正向者即人类语言至机器语言者,反逆向之正统也。盾者。仁慈也。

逆向至正向途中必遇盾者,用矛刺之。杀戮也。

有盾必生矛,有矛必伤盾。常理也。

此循环何解???盾磨豆腐,矛叫卖也。

哈哈~~~什么乱七八糟的“鸟语”???

同为“矛盾之身”的菜农就给团员们揭开“矛盾之迷”~~~

开课:

在汇编语言中,指令被编码,

即告诉机器要做什么事情。此码叫操作码。认为命令也可。

命令可能需要一些数据,即操作数。

由于CPU的位数不同,编码方式不同,可能还需要一些操作数。

故有操作数1、2、N之多。

一般为操作码后跟N个操作码,MCS51为N=0~2

反汇编的最高境界---代码数据分离。

一般需要对每个分支语句进行2次扫描。

扫描遇到终止语句时,停止扫描。

扫描时先取出操作码(扫描的当前首个代码)。

在MCS51中只有0xA5是intel保留的一个操作码,至今不知干什么。

其他0x00~0xff都是合法的操作码,从NOP(0x00)直到MOV R7,A(0xff)

在操作码里可得到后跟几个操作数,是分支语句这2个最重要的信息。

菜农的“超级反汇编”的“反汇编扫描标志位”:

/**********************************************
*      一次反汇编扫描函数disasm51sm1()        *
*              反汇编扫描标志位               *
*        奇  地  址          偶  地  址       *
*    D7   D6   D5   D4   D3   D2   D1   D0    *
*   进点 出点 尾码 扫描 进点 出点 尾码 扫描   *
*              反汇编优化标志位               *
*    D7   D6   D5   D4   D3   D2   D1   D0    *
*   跳转 继续 第一类型  第二类型  指令字节数  *
**********************************************/

哈哈~~~什么阶级敌人都跑不出此圈套~~~

在扫描时,将结果跳入“扫描图”中,形象说明一下:
C---操作码(扫描成功)
N---操作数(扫描成功)
D---纯数据(未扫描或扫描非法)

随后二次扫描分类(子程序,跳转,数据等)
/**********************************************
*      二次反汇编扫描函数disasm51sm2()        *
*              反汇编扫描标志位               *
*    D7   D6   D5   D4                        *
*   进点 出点 尾码 扫描       注       解     *
* 0  0    0    0    0         未定义NOP       *
* 1  0    0    0    1         一般指令        *
* 2  0    0    1    0                         *
* 3  0    0    1    1         尾码            *
* 4  0    1    0    0         MOV DPTR,#      *
* 5  0    1    0    1                         *
* 6  0    1    1    0         DW              *
* 7  0    1    1    1                         *
* 8  1    0    0    0                         *
* 9  1    0    0    1 L有进点一般指令         *
* A  1    0    1    0                         *
* B  1    0    1    1 S                       *
* C  1    1    0    0  有进点 MOV DPTR,#      *
* D  1    1    0    1 L                       *
* E  1    1    1    0                         *
* F  1    1    1    1 S                       *
**********************************************/

这次就可得到结果:
RESET:    LJMP  L2000
EXTI0:    CLR   008H
    JNB   0C2H,L001D
    SETB  0C2H
    MOV   DPTR,#1F20H
    MOV   A,#000H
    MOVC  A,@A+DPTR
    CJNE  A,#00FH,L0018
EXTI1:    ACALL S03AA
    LJMP  L0800
L0018:    ORL   0B1H,#002H
TIMER1:    SJMP  $
L001D:    MOV   085H,#0FBH
    SETB  0C1H
    SETB  0C3H
    SETB  0C0H
    MOV   SP,#03AH
    ACALL S0047
L002B:    ACALL S00E7
    CJNE  A,#055H,L002B

哈哈~~~比人写的整齐~~~
如何知道原作者对L002B的标号,那么,除注解外,将和源程序写的一样~~~

而且绝对整齐~~~

那么我们革命群众如何对付俺这种人呢???

俺自己坦白吧~~~(望逆向者原谅~~~)

因为“逆向守则”规定:

分支跳入(或调用)地址必须是未反汇编过的区域,或为操作码的地址处。
否则,扫描失败,放弃本次扫描。认为这是一片数据区域(即都是 DB  XXH)

若强行反汇编,虽然看到的都是“代码”,但编译器则通不过汇编。

既然我告诉了“逆向的帮规”,革命群众如何利用它来保护自己呢???

菜农为了不“背叛帮规”,也将指定

“正向守则”:

1. 利用汇编跳入操作数而不影响源程序
如:
   JNZ  L0 - 1;//A<>0,跳入L0上的#00,即NOP语句
   MOV  A,     /*操作码*/
          #00  /*操作数一*/  /*L0-1:操作码 NOP*/
L0:
   ..............

此“守则”未破坏程序流程,而且可能对“流水线”,“强实时”等有好处

2. 掩盖所有的数据区,让敌人反出来的都是“代码”~~~

   MOV DPTR,#BUFF
   CLR A
   JNZ BUFF;此句不可能执行,因为上句A=0,主要是引导阶级敌人入坑~~~
   MOVC A,@A+DPTR
   RET
BUFF:;以后将讲如何不让敌人改写下列字符串~~~
   DB “菜农在此华容道等候曹贼多时了,看刀~~~哈哈~~~”,00H


总之,给他来个“真真假假,虚虚实实”~~~

这样的“核裂变”将会成让敌人自动撤退~~~让逆向者(包括菜农)回家卖豆腐

哈哈~~~俺也省心~~~否则中外的逆向总让俺反汇编闹心~~~

还是让俺卖豆腐去吧~~~

课毕
团长今天高兴唱了一天的“红旗飘飘”~~~

HotC51@126.com   2009.2.24 于菜地。
团部:http://group.ednchina.com/1623/

天下无贼论
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
3
关闭 站长推荐上一条 /3 下一条