原创 汇编和反汇编中和源码保护和数据代码分离之矛与盾的PK

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

楼主: 汇编和反汇编中和源码保护和数据代码分离之矛与盾的PK


汇编和反汇编中和源码保护和数据代码分离之矛与盾的PK

大千世界无奇不有--苍天大地,打雷闪电,刮风下雨.
                  正义邪恶,刀客剑侠,猛男超女.
不知哪个属于你自己~~~

晕~~~这头起的下面的白话文就不好写了~~~还是随意为好~~~

本文将以51代码来讲述汇编和反汇编的攻守关系及具体对策.
实际上在C语言上也会得到启发的,菜农就暂且放过.

同时由于篇幅所限,二次(多次)扫描,数据代码分离,虚拟机等
反汇编的"黑话"也将越过~~~

当然被人反汇编是很荣幸的事,别学菜农的领导被骗上当拿菜农
所有的源代码(连人带机)让母校"反汇编",你说可气不可气???

现在开讲(最后自然是请听下次分解这种卖嘴的话了~~~):

在正常的汇编中,一般不可能想着要被人反汇编,故其暴露的
部分太多.
由于受指令助记符约束太多,数据的存取一般要通过特殊指令.
一般是通过专用寄存器DPTR,R0/R1,PC等来指出具体的存取地址.


故反汇编程序就可通过多次扫描后并通过虚拟机来模拟运行
来将代码和数据分离。

这些专用寄存器如果采用立即数寻址方式,就会很明显地把自己
的意图暴露.

例如常用的ACC/DPTR和MOVC指令的组合.
应该尽量地少用MOV DPTR,#XXXXH.

即使不能避免或为了高速寻址,也应该让它远离MOVC A,@A+DPTR;
最好在函数(子程序)外来调用。即参数DPTR在函数外部先设置好.

只要你用下列简单子程序就能把反汇编气晕~~~
除非他亲自赤身上阵来PK~~~

MOV   DPTR,#1234H
;最好隔几行或其他调用
LCALL MOVCex
MOV   DPTR,#5678H
LCALL MOVCex
MOV   DPTR,#XXXXH
LCALL MOVCex
......................  
MOVCex:
;最好加些气晕虚拟机的玩意~~~
      MOVC A,@A+DPTR;
      RET

再一个也是最为重要的就是对代码的入口地址的保护,这是双方PK的焦点所在!!!

例如:
    MOV   DPTR,#LXXXX
    JMP   @A+DPTR;?
............................
LXXXX:    
    LJMP  L1234
    LJMP  L5678
    LJMP  LYYYY
......................

看见DPTR后面那个'?'了吗???那是菜农的特别提示,告诉注意敌人可能有多种逃生手段.
LJMP,AJMP,SJMP,JZ/JNZ,CJNE,DJNZ,JB/JBC/JNB,JC/JNC
LCALL,ACALL,RET/RETI
它们都有按一定固定规律的固定间隔(长度).
有些像上例中是有序的.

哈哈~~~这些都是本分的读书人----脾气太好,肯定不会练摊买鸡蛋~~~
这种程序如被反汇编,将会被100%的还原为源程序,若知道变量的具体名称,反出来的
要比原作者的更为整齐~~~这是没加注解~~~
不过这是菜农的强项~~~没图纸不知用途俺照注解~~~

所以对代码地址和数据语句的保护(反解读)将是我们对付这些恶人的---急所~~~
晕!!!怎么出来了围棋的术语???看来我们编程也不要走“愚型”~~~

在51代码中,每条指令都有操作码和操作数之分,但每条指令必须有1个操作码---指令名.
在我们关心的几条指令如:
LJMP,AJMP,SJMP,JZ/JNZ,CJNE,DJNZ,JB/JBC/JNB,JC/JNC
LCALL,ACALL,RET/RETI
PUSH/POP

实际上防解读和防程序飞是一个道理.
程序飞是PC没按编程者的意愿掉入了不是编程者的代码集合!!!

这是因为任意一组(1~3个字节)代码序列都会组成一条新的指令!!!
其第1个字节必为指令操作码!!!根据操作码的不同得到不同的长度。
这些重新组合的指令序列集合就组成了新的程序!!!
这个随机产生的“程序”所具备的功能只有鬼才知道!!!

这就是程序飞的“道理”~~~

反汇编碰壁后,也会用虚拟机模拟程序飞来扫描程序的“合理性”.
如果我们不用代码保护的手段来对付虚拟机的骚扰,那么带来的结果只能让对手扒光~~~

菜农“研制的农药”就是为对付HotPower这种“小人”!!!

有人说俺左右互搏~~~说实话以前没事关灯自己下盲棋~~~不杀自己没别人呀~~~

哈哈~~~走题了~~~

如果我们利用条件跳转指令,在不影响程序正常运行的情况下,并在不影响速度时,
采用一些手段也并非“卑鄙”,虽然很“下流”,只要让反汇编的人眼晕即可~~~

看官请看下列几句:
.........................................................................
    JNB   ACC.7,$+4;;ACC.7恒为0,肯定运行NOP;ACALL COMMANDEXEC;
    DW    1200H;把它拉下水~~~ ;低8位为NOP指令
    ACALL COMMANDEXEC;执行命令,哈哈~~~执行完后直接跳回MAINLOOP
.........................................................................
    CLR   A
    JZ    $+3;肯定运行NOP;MOV   DPTR,#TESTDATA
    DW    1200H;低8位为NOP指令
    MOV   DPTR,#TESTDATA
.........................................................................
;返回前对付反汇编!!!让它找不到RETI指令
    CLR   A
    JZ    $+3;肯定运行NOP;RETI
    DW    1200H;低8位为NOP指令
;用RETI迷惑反汇编,以为是某个中断服务程序
    RETI;返回到MAINLOOP

前2个是保护代码或数据地址的,最后1个是保护程序出口的.

菜农所说的“保护”2字并非不让盗窃者运行程序,而是不让他"看".

他即使有菜农的倒塌脑浆,也让他扒层皮~~~
哈哈~~~

但是的但是!!!这还不足以打退阶级敌人的邪念,因为他们可以强行汇编,分段
反汇编后再组合到一起。

故我们还有CRC代码数据保护及改写问题~~~就先到这里,拍砖吧,俺接着...

有些网友期待“天下无贼”,俺会努力的,但不敢祈望,但"治安"应该会好些点的~~~

由于时间的精力的关系,听下次分解~~~
本故事纯属虚构,若有雷同,纯属偶然...

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

文章评论1条评论)

登录后参与讨论

用户1177291 2010-12-16 10:40

谢谢楼主,正在学习

用户1006913 2008-5-29 11:17

对老人家的敬仰之情如滔滔江水绵绵不绝,亦如黄河泛滥一发不可收拾

用户564854 2007-11-14 00:12

天下无贼--我也来说说怎样打造安全的防破解系统

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

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

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

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

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


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

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



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


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

很多点子说穿了就没意思了,
再深层次的秘密武器还是私下讨论吧:-)
相关推荐阅读
雁塔菜农 2012-04-05 17:51
2012年度新唐Cortex-M0助学开发套件有约束条件赠送申报贴
2012年度新唐Cortex-M0助学套件从4月起每月有约束条件发放16套。 申报人必须是21ic或 EDNC 会员 并具备1月的会龄。 申报时必须注明“遵守约束条件,缴纳250元订金,上...
雁塔菜农 2012-04-05 17:04
2012年度Cortex-M0助学园地推广框图
...
雁塔菜农 2012-04-01 17:59
2012年度Cortex-M0助学园地奖励计划细则
抢楼请点击:菜地公告:即日起创建《菜农Cortex-M0助学园地》(盖楼入口) 每月10号和25号的下午2:50进行2次抢楼,规则同去年12月的疯狂抢楼活动。 奖品由21IC、北航、广州迪圣...
雁塔菜农 2012-02-03 08:19
菜农谋略:搞定牛人宋俊德,对女牛人孙昌旭说:“记住,俺是雁塔菜农~~~ ”
http://www.baidu.com/s?wd=%B2%CB%C5%A9%D0%A6%CC%B8%A1%B6%D0%C2%C0%CB%C3%FB%C8%CB%D0%A7%D3%A6%A1%B7...
我要评论
1
4
关闭 站长推荐上一条 /2 下一条