原创 真真假假虚虚实实--天下无贼之论述

2007-11-13 20:56 3686 5 5 分类: MCU/ 嵌入式
hotpower 发表于 2007-11-13 20:54 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

楼主: 真真假假虚虚实实--天下无贼之论述


真真假假虚虚实实--天下无贼之论述

菜地公告:转载本贴要注明菜地!
详情参见:http://www.ednchina.com/blog/hotpower/58716/message.aspx

欺骗之术: 用无关代码来隐蔽后面需要怕人偷看的代码入口地址和立即数据。
调用和跳转指令是将反汇编引向歧途的最好方法和手段。
也使虚拟机花费更大的精力和时间,这正是我们最最需要的。

我们应该采用的代码:
LJMP,AJMP,SJMP,JZ/JNZ,CJNE,DJNZ,JB/JBC/JNB,JC/JNC
LCALL,ACALL,RET/RETI

这里特别要注意采用的条件必须事先已知!!!

例1:
DEC   B;这里我们假定知道B不等于1.既不可能发生去错误地执行DW 0200H;

我们可用下列代码序列代替:
DJNZ  B,$+4
DW    0200H;伪造残缺的LJMP指令,实际是越过DB 02H,而直接执行NOP空操作语句!!!
MOV   DPTR,#1234H

编译器强制编译为
DJNZ  B,$+4   这里强行反汇编将会放弃对步长的校验!!!(下面看它如何臭美)
LJMP  0090H   这里的90H是MOV DPTR的操作码,它被DW 0200H“借用”为低位地址
LCALL 34XXH      这条指令是什么已无任何疑义,因为90H被借用,本句肯定错~~~

例2:
CLR   A;事先已知或确定为0
.................
JZ    $+3;
DW    1200H;  伪造残缺的LCALL指令,实际是越过DB 12H,而直接执行NOP空操作语句!!!
MOV   DPTR,#0000H

编译器强制编译为
CLR   A
.................
JZ    $+3
LCALL 0090H  这里的90H是MOV DPTR的操作码,它被DW 1200H“借用”为低位地址
NOP          原DPH的00H
NOP             原DPL的00H

从上述2例分析,用分枝语句借用后面的代码是可行的,但是它使反汇编者可以提高
跟踪调试或虚拟机来找出正确的PC线路,这样将欺骗代码删除或以NOP指令填充,程序
将会被完全解码!!!

所以我们不能让它的阴谋得逞!!!

故欺骗代码也将是我们保护的重点,就如保护代码和数据,但方法不同。

最简单的几种方法:
1.将欺骗代码都变为我们需要的数据
例如:
         MOV   DPTR,#DATATAB;明着欺骗,告诉反汇编程序,DATATAB是数据区!!!
         CLR   A
         MOVC  A,@A+DPTR;取出合法数据12H
         MOV   B,A
         INC   DPTR
         CLR   A
         MOVC  A,@A+DPTR;取出合法数据00H
         ADD   A,B
         CJNE  A,#12H,XXXXX;欺骗码修改,注意:这样做也将会收到简单的攻击!!!以后讲
..........................................
         CLR   A;事先已知或确定为0
.................
         JZ    $+3;
DATATAB:
         DW    1200H;  伪造残缺的LCALL指令,实际是越过DB 12H,而直接执行NOP空操作语句!!!
         MOV   DPTR,#0000H
.................
这样做后,欺骗代码就保护下来了~~~

2.将欺骗代码都变为我们不需要的代码入口地址
例如:
         MOV   A,DPL
         RL    A
         ADD   A,DPL
         MOV   DPTR,#JUMPTAB;明着欺骗,告诉反汇编程序,DATATAB是数据区不是跳转区!!!
         JMP   @A+DPTR;?
JUMPTAB:
         LJMP  DATATAB;欺骗代码1
         LJMP  XXXXXXX;欺骗代码2
..........................................
         CLR   A;事先已知或确定为0
.................
         JZ    $+3;
DATATAB:
         DW    1200H;  伪造残缺的LCALL指令,实际是越过DB 12H,而直接执行NOP空操作语句!!!
         MOV   DPTR,#0000H
.................
这样做后,所有的欺骗代码就有可能保护下来了~~~

3. 同理也可用MOVC来保护
         MOV   DPTR,#BUFF;明着欺骗,告诉反汇编程序,DATATAB是数据区或跳转区!!!
         RL    A
         MOVC  A,@A+DPTR
.............................................................
BUFF:
         DW    DATATAB;欺骗代码1
         DW    XXXXXXX;欺骗代码2
..........................................
         CLR   A;事先已知或确定为0
.................
         JZ    $+3;
DATATAB:
         DW    1200H;  伪造残缺的LCALL指令,实际是越过DB 12H,而直接执行NOP空操作语句!!!
         MOV   DPTR,#0000H
.................


如果再狠点,可将三者结合,我看虚拟机如何倒塌我???

最后还有很多着,由于时间和精力的关系,且听下次分解~~~
本故事纯属虚构,若有雷同,纯属偶然...

雁塔山野村夫  菜农HotPower   
                           2007.11.13 于西安大雁塔菜地.

文章评论0条评论)

登录后参与讨论
我要评论
0
5
关闭 站长推荐上一条 /2 下一条