当前常用的加壳技术.docVIP

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
当前常用的加壳技术

首先声明,不要被这个题目所迷惑,我所谓的流行只是我以为他应该要流行,并不是说一定就是现在所流行的技术,再者,我很菜,错误之处,请各位海涵. 我并不太清楚壳的历史,因为关于它的特殊性再加上我所能了解的信息也非常局限性,在我看来第一款壳应该就是upx,但是或许事实并不是这样,因为地下壳是那么的多.而我并不知道第一款加密或者意想加密的壳是哪个,一是因为加密这个定义比较模糊,二是我根本不收集壳并研究.加壳的中心思想我想不外乎只有两点,一是尽可能的隐藏所能隐藏的东西,二是尽最大能力的拖延脱壳者的时间,让脱壳者那颗并没有无限大的忍耐度的心再也受不了为止. IAT加密与解密的早期战场: 早期的壳大多于只加密这个东东,因为他便利,加密起来也简单.正如我所说我并不研究壳,所以很有可能我的思路是错误的. 一种简单的加密思路是将被加密程序的IAT数据保存于壳内,然后新建立一个IAT导入表,里面只导入壳需要使用到的函数,比如很多壳都喜欢只导入LoadLibrary和GetProcAddress两个函数,这样其他函数可以再通过这两个函数来动态定位.关于后来例如Asprotect这样的每个dll导入一个函数的做法完全是为了更好的兼容性.将这些数据保存于壳内后,壳在Loader执行的时候就手动加载每一个dll填充每一个函数,这是一种非常简单的加密手段,目的正如我上面所说的,隐藏信息. 我想应该是这种方法很快就不够用了,因为他脱起来也较简单,等壳装载完毕后,直接用REC就可以修复.这导致了新加密方法的使用. 新的IAT加密方法和上面的加密方法基本上差不多,但是在最后填充函数地址的时候,也就是在壳加载了函数所在DLL和获得函数地址之后并不直接填充到IAT跳转描述表里面,而是保存起来,然后将跳转描述表里面相应位置填充为指向壳的一段代码,这段代码负责动态解密跳转到真正的函数地址.形成一个代理模式.这种方法仍然是现在流行的方法,大部分的加密壳都是基于这个原理的,只不过实现手段上不同而已.有的壳是直接跳转到壳里,然后立马又跳回真正的函数地址,我很能理解这样做的原因,因为我知道写一个复杂的代码连接引擎并不是很容易.大部分壳这个过程是动态的,也就是在loader的时候动态生成跳转代码的,这有一个很致命的缺点,因为这样或多或少的会形成一个magic jmp,因为一般并不是所有函数都能被代理,所以必须还得考虑兼容性的问题,所以很多壳只代理了一部分函数,其他函数也只是获取地址然后填充,这样一个简单的过程,但是他们又不注意将需要代理的函数在加壳时给予区分,而是在loader里面判断是否加密,所以导致magic jmp,这样把所有信息行为都暴露给脱壳者是很不划算的. 还有一种较上面方法好一点的就是他们模拟了一些代码,也就是一些函数在壳里自己实现,来增加脱壳者修复的难度,但是从某个角度来说,这样的用处并不大.当然我们所考虑的情况都是再不使用SDK的情况下. 我不得不说关于IAT加密并不会留住加密和解密的步伐,因为一般程序只有少量的导入数据,而且大部分函数都要直接跳转到真正的函数入口,而写壳的不可能将所有的函数都模拟起来,实际上模拟起来也并不难修复.所以注定这个早期的战场迟早会被淡化,加壳和脱壳会寻找新的火拼点. CODE现在流行和将来流行的火拼点: 很早我就意思到加壳迟早会回归到这上面来,早期没有人过多于将精力放在这上面是因为处理代码远比处理IAT难度要大,要复杂,要考虑得多. 代码处理流行的技术在我了解的有以下几种主要方式. 1.VM 2.代码变形 3.代码乱序 4.代码寄生 5.花指令 6.代码抽取 还有一种早期我用过的代码移位技术我这里并没有列为主要技术,因为它是这里面最容易被还原的技术,但是可以用来和上面的技术组合,将是很不错的. 首先我们来看看VM,我不知道这技术是什么时候开始被使用的,但是很显然的,他将成为现在和将来壳所发展的趋势,尤其是在cpu执行速度越来越快的今天.我这里并不想教你怎样写一个VM,但是我会或多或少的给你一些建议. 首先让我来阐述一下VM的工作原理,VM就是我们平常说的虚拟技术,他是将原来的代码变成OPCODE,然后写一个虚拟机来解释执行OPCODE来完成原来代码的功能.核心原理也逃不出文章一开始我所说的两点.但是到如今使用也不多的原因是因为实现难度比较大,因为写好一个虚拟机引擎并不容易,你将必须有非常好的构架,否则你将不容易成功.你必须增加OPCODE的灵活性来代替你翻译

文档评论(0)

junjun37473 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档