软件保护壳技术专题.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
软件保护壳技术专题

软件保护壳技术专题 - 变形引擎的构建 目录 1.需要变形的部分 2 2.花指令的构建 3 2.1产生随机寄存器 4 2.2产生随机的清0 5 2.3产生随机的JMP 8 2.4产生异常代码 8 2.5利用MODRM/SIB 14 3.构建解密头 14 4.另一种变形(1) 15 5.另一种变形(2) 16 6.总结 19 1.需要变形的部分 壳的变形技术主要来自于病毒。病毒变形主要目的为了躲避杀毒软件的查杀,壳的变形也无非是这个。当然还有目的是为了延长破解时间,消耗Cracker的精力。现在看一个经典的变形结构,也确认哪部分是用来变形的壳加载段 ---------- 解密头 壳主体被加密的部分 密钥储存 ---------- 大多数情况下,壳加载器的结构就是这三个部分。解密头对壳主体进行解密后再跳入到壳主体进行运行。这里就可以很明显的看出?壳主体是很容易进行变形的,只要每次加密的密钥不一样最后的队列肯定不一样。现在解密头是固定的,所以这里是最需要进行变形的。以上这个结构绝对是经典多态的结构,再复杂的变形也是从以上这个简单的结构开始的。下面看一段简单的CODE。 代码: call?delta delta: pop?esi add?esi,?offset?Packet?-?offset?delta mov?edi,?esi mov?ecx,?offset?Decoder?-?offset?Packet mov?eax,?esi add?eax,?offset?Decoder?-?offset?Packet mov?bl,?byte?ptr?[eax] @@: lodsb xor?al,?bl stosb loop?@B ;;?这里解密后直接进去壳主体 Packet: ;........壳主体 Decoder: db?099h 以上就是简单的ASM代码。这里的算法是XOR当然比较简单,当然在解密之前要首先保证代码段是可写属性。现在开始变形解密头要如何变形呢?这里可以看出其实总共解密头也没几个字节,提出两种通用方式。一个就是添加花指令构建将花指令丢到解密头每条指令中间。一个就是等价的代码替换,寄存器的替换。总之解密头是我们自己编写的。我们可以精心的去构建一段代码,并将此按照我们自己的规则进行模板化。 每当生成新的壳解密头时进行填充。当然也可以用一些复杂的规则去扩大这个结构。自定义的模板规则,复杂的花指令生成等等。产生解密模板的时候可以适当的运用一些编译原理的技术。首先产生一个自己可以理解的中间指令,然后再翻译成X86代码。这样的好处是可以无限的扩充模板的形势,变形力度很大。在病毒上可能实现要麻烦些,毕竟病毒要考虑到自身体积的大小,但是壳却不用考虑那么多。另外一点要说明的是做变形的时候不要拘泥于此格式,可以尽量发挥想象来做。例如把解密分段,或者将解密先写入到栈中在执行。总之达到恶心Cracker的目的就成。 2.花指令的构建 花指令的构建方法有很多种,但是原理都是相同的在不影响运行上下文的情况下,产生一些无效的指令。同样下文以例子展出,如果自己做的,尽量发挥想象力。不用拘泥于这篇文章或者某篇文章。 2.1产生随机寄存器 每条指令对寄存器的操作的编码都有一些规则,具体是什么规则可以读下INTEL的编码规则。这个专题里也有一篇是讲反汇编引擎的,不过为了不产生歧义还是推荐去看INTEL的手册。这里也不讲IA32的编码规则了。直接来看些具体的例子$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?....?按照以上那个排序选取寄存器。其他指令也一样例如POP?$R是从58开始的.所以每次选取之需要很简单的一个随机模8就可以了。?但是这里要排除一个意外就是esp。ESP控制着堆栈指针稍微有些不细心就会造成程序运行错误。为了保险还是把它T出去好了。不过不是非要排除ESP。如果你的花指令产生器构建的够精密,模板够好。也可以把ESP的变换也加进来。为了稳定,按照我谨慎的性格还是将它排除在外。SHOW段代码。C++的。 代码: const?DWORD?Registry_Eax?

文档评论(0)

yy556911 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档