打印

**花的时间肯定要多得多

[复制链接]
3122|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hotpower|  楼主 | 2007-11-13 20:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
真真假假虚虚实实--天下无贼之论述

菜地公告:转载本贴要注明菜地!
详情参见:http://www.**/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 于西安大雁塔菜地.

沙发
hotpower|  楼主 | 2007-11-13 20:54 | 只看该作者

沙发自己坐~~~

使用特权

评论回复
板凳
hotpower|  楼主 | 2007-11-13 21:08 | 只看该作者

估计来看的都和下图一样~~~

使用特权

评论回复
地板
315avr| | 2007-11-13 21:17 | 只看该作者

不懂也顶

使用特权

评论回复
5
hotpower|  楼主 | 2007-11-13 21:20 | 只看该作者

您老顶俺都不好意思了~~~

使用特权

评论回复
6
xwj| | 2007-11-14 00:04 | 只看该作者

说说怎样打造安全的防**系统

老Hotpower讲的手段还是太简单了,不会增加太多的破解难度哦
没双向交互时PC路径就一定是死的,用虚拟机跑一趟就全出来了

稍微智能一点的反编译器都会尝试每个条件的分支,总有正确的,再稍微人工干涉一下就能找到入口了

因此反汇编只能对付下一般的反编译手段罢了

大多反编译器,没有入口的会当成数据段,从而丢失很多程序段
其实只要对没认出的数据段逐个字节开始假设、反汇编,判断RET和跳转的合法性,就能很容易的尝试出隐藏的入口的

不过51的指令有单字节、双字节、3字节的,存在指令对齐问题,一般反编译器要么当数据要么当地址,真要对付它应该搞出一段虚虚实实、你套我我套你的迷宫代码,让自动反汇编或人工反汇编的都转的晕头转向
以显著增加别人破解的难度和工作量


一直觉得,要真正反破解的话需要一整套的必要手段:
1、程序明码、暗码的版权显示,既保证起诉条件也逼着别人不得不去改代码;
2、程序完整性检测、陷阱,并分散到程序的各个关键点上,逼得别人改代码时非得去仔细分析你的各个陷阱,增加他的工作量;
3、 尽量采用多个难以破解读出的器件,双先握手动态生成程序入口甚至代码,把程序入口藏入真正的数据段中,并用花指令增加程序的可读性,破坏机器反汇编、人工反汇编以及虚拟机运行的条件,让破解者去伤神吧;
4、利用51的指令单字节、双字节、3字节的指令对齐问题,指令、数据中套指令,搞出一段虚虚实实、你套我我套你的迷宫代码,让自动反汇编或人工反汇编的都转的晕头转向
5、硬件欺骗、器件欺骗、在辅助别的心理弱点欺骗,这个就看各人的智慧了

让别人不能破解的关键前提还是第3点:尽量采用多个难以破解读出的器件,这点不能保证的话一切都是免谈



要做一套完整的反破解程序是非常费神的事,想让别人花多少精力破解自己也要花差不多同样多的精力来设计,除非是关键技术,否则一般懒得费这个神:-)
主要还是靠保证产品的更新速度、性价比、竞争力等来占领市场,间接的让别人的破解变得无意义才是上策


矛和盾的较量一定得充分利用人的心理,真真假假、虚虚实实的去玩人、玩死机器:-)

很多点子说穿了就没意思了,
再深层次的秘密武器还是私下讨论吧:-)

使用特权

评论回复
7
hotpower|  楼主 | 2007-11-14 00:52 | 只看该作者

我晕~~~俺那时说过不允许虚拟机跑了吗???

使用特权

评论回复
8
wolfererer| | 2007-11-14 08:35 | 只看该作者

**花的时间肯定要多得多

强烈支持LZ

使用特权

评论回复
9
McuPlayer| | 2007-11-14 08:53 | 只看该作者

老X给大叔补充的很好

还有一招,让程序在RAM里面跑,初始化的时候才从ROM解密出来。
当然了,最好不要一次解完,第一次故意解一些没有用的代码。
基于6502CPU的很多游戏机都是这么做的。

使用特权

评论回复
10
hotpower|  楼主 | 2007-11-14 08:57 | 只看该作者

叹息~~~无法与你们地球人沟通~~~郁闷之极...

使用特权

评论回复
11
农民讲习所| | 2007-11-14 09:44 | 只看该作者

你那个编码方案用坐标表示不是更简单吗?

8215 (x1,y1) (x2,y2)
用**啊,前,后什么的多不严谨

使用特权

评论回复
12
hotpower|  楼主 | 2007-11-14 13:04 | 只看该作者

看来所长不是棋手~~~俺有比赛资格证书~~~

俺就是用此编码做的象棋程序~~~

使用特权

评论回复
13
农民讲习所| | 2007-11-14 13:46 | 只看该作者

俺以前拿过市大学生象棋比赛第三名

使用特权

评论回复
14
hotpower|  楼主 | 2007-11-14 14:01 | 只看该作者

怪不得~~~下棋人都晕~~~

使用特权

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

本版积分规则

1460

主题

21619

帖子

508

粉丝