汇编和反汇编中和源码保护和数据代码分离之矛与盾的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 于西安大雁塔菜地.
|
|
用户1177291 2010-12-16 10:40
用户1006913 2008-5-29 11:17
用户564854 2007-11-14 00:12
没双向交互时PC路径就一定是死的,用虚拟机跑一趟就全出来了
稍微智能一点的反编译器都会尝试每个条件的分支,总有正确的,再稍微人工干涉一下就能找到入口了
因此反汇编只能对付下一般的反编译手段罢了
大多反编译器,没有入口的会当成数据段,从而丢失很多程序段
其实只要对没认出的数据段逐个字节开始假设、反汇编,判断RET和跳转的合法性,就能很容易的尝试出隐藏的入口的
不过51的指令有单字节、双字节、3字节的,存在指令对齐问题,一般反编译器要么当数据要么当地址,真要对付它应该搞出一段虚虚实实、你套我我套你的迷宫代码,让自动反汇编或人工反汇编的都转的晕头转向
以显著增加别人破解的难度和工作量
一直觉得,要真正反破解的话需要一整套的必要手段:
1、程序明码、暗码的版权显示,既保证起诉条件也逼着别人不得不去改代码;
2、程序完整性检测、陷阱,并分散到程序的各个关键点上,逼得别人改代码时非得去仔细分析你的各个陷阱,增加他的工作量;
3、 尽量采用多个难以破解读出的器件,双先握手动态生成程序入口甚至代码,把程序入口藏入真正的数据段中,并用花指令增加程序的可读性,破坏机器反汇编、人工反汇编以及虚拟机运行的条件,让破解者去伤神吧;
4、利用51的指令单字节、双字节、3字节的指令对齐问题,指令、数据中套指令,搞出一段虚虚实实、你套我我套你的迷宫代码,让自动反汇编或人工反汇编的都转的晕头转向
5、硬件欺骗、器件欺骗、在辅助别的心理弱点欺骗,这个就看各人的智慧了
让别人不能破解的关键前提还是第3点:尽量采用多个难以破解读出的器件,这点不能保证的话一切都是免谈
要做一套完整的反破解程序是非常费神的事,想让别人花多少精力破解自己也要花差不多同样多的精力来设计,除非是关键技术,否则一般懒得费这个神:-)
主要还是靠保证产品的更新速度、性价比、竞争力等来占领市场,间接的让别人的破解变得无意义才是上策
矛和盾的较量一定得充分利用人的心理,真真假假、虚虚实实的去玩人、玩死机器:-)
很多点子说穿了就没意思了,
再深层次的秘密武器还是私下讨论吧:-)