- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)