资源描述:
《软件保护壳技术专题》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、软件保护壳技术专题-变形引擎的构建<目录>1.需要变形的部分22.花指令的构建32.1产生随机寄存器42.2产生随机的清052.3产生随机的JMP82.4产生异常代码82.5利用MODRM/SIB143.构建解密头144.另一种变形(1)155.另一种变形(2)166.总结191.需要变形的部分19壳的变形技术主要来自于病毒。病毒变形主要目的为了躲避杀毒软件的查杀,壳的变形也无非是这个。当然还有目的是为了延长破解时间,消耗Cracker的精力。现在看一个经典的变形结构,也确认哪部分是用来变形的壳加载段----------解密头壳主体被加密的部分密
2、钥储存----------大多数情况下,壳加载器的结构就是这三个部分。解密头对壳主体进行解密后再跳入到壳主体进行运行。这里就可以很明显的看出 壳主体是很容易进行变形的,只要每次加密的密钥不一样最后的队列肯定不一样。现在解密头是固定的,所以这里是最需要进行变形的。以上这个结构绝对是经典多态的结构,再复杂的变形也是从以上这个简单的结构开始的。下面看一段简单的CODE。代码:call deltadelta:pop esiadd esi, offset Packet - offset deltamov edi, esimov ecx, offset De
3、coder - offset Packetmov eax, esiadd eax, offset Decoder - offset Packetmov bl, byte ptr [eax]@@:lodsbxor al, bl19stosbloop @B;; 这里解密后直接进去壳主体Packet:;........壳主体Decoder:db 099h以上就是简单的ASM代码。这里的算法是XOR当然比较简单,当然在解密之前要首先保证代码段是可写属性。现在开始变形解密头要如何变形呢?这里可以看出其实总共解密头也没几个字节,提出两种通用方式。一个就是添加
4、花指令构建将花指令丢到解密头每条指令中间。一个就是等价的代码替换,寄存器的替换。总之解密头是我们自己编写的。我们可以精心的去构建一段代码,并将此按照我们自己的规则进行模板化。每当生成新的壳解密头时进行填充。当然也可以用一些复杂的规则去扩大这个结构。自定义的模板规则,复杂的花指令生成等等。产生解密模板的时候可以适当的运用一些编译原理的技术。首先产生一个自己可以理解的中间指令,然后再翻译成X86代码。这样的好处是可以无限的扩充模板的形势,变形力度很大。在病毒上可能实现要麻烦些,毕竟病毒要考虑到自身体积的大小,但是壳却不用考虑那么多。另外一点要说明的是
5、做变形的时候不要拘泥于此格式,可以尽量发挥想象来做。例如把解密分段,或者将解密先写入到栈中在执行。总之达到恶心Cracker的目的就成。2.花指令的构建花指令的构建方法有很多种,但是原理都是相同的在不影响运行上下文的情况下,产生一些无效的指令。同样下文以例子展出,如果自己做的,尽量发挥想象力。不用拘泥于这篇文章或者某篇文章。192.1产生随机寄存器每条指令对寄存器的操作的编码都有一些规则,具体是什么规则可以读下INTEL的编码规则。这个专题里也有一篇是讲反汇编引擎的,不过为了不产生歧义还是推荐去看INTEL的手册。这里也不讲IA32的编码规则了。
6、直接来看些具体的例子$R表示寄存器,IMM(X)表示立即数,例如MOV $R, IMM32,形如类似的移动语句。OPCODE是B8 IMM32 这样的。B8表示MOV EAX, 可以在OD里查看B9为MOV ECX,这里有个排序:从EAX开始为EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI这样的顺序。如果翻看MODRM/SIB规则可以看到这个排序规则,至于为什么要这样排。只能去问INTEL公司了。INTEL手册里也没说明。总之MOV $R, IMM32可以变成为B8 B9 BA BB .... 按照以上那个排序选取寄
7、存器。其他指令也一样例如POP $R是从58开始的.所以每次选取之需要很简单的一个随机模8就可以了。 但是这里要排除一个意外就是esp。ESP控制着堆栈指针稍微有些不细心就会造成程序运行错误。为了保险还是把它T出去好了。不过不是非要排除ESP。如果你的花指令产生器构建的够精密,模板够好。也可以把ESP的变换也加进来。为了稳定,按照我谨慎的性格还是将它排除在外。SHOW段代码。C++的。代码:const DWORD Registry_Eax = 0x00;const DWORD Registry_Ecx = 0x01;const DWORD Reg
8、istry_Edx = 0x02;const DWORD Registry_Ebx = 0x03;const DWORD Registr