真真假假虚虚实实--天下无贼之论述
菜地公告:转载本贴要注明菜地! 详情参见: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条评论)
登录后参与讨论