一、简介
本文是对16年的blackhat大会上PinDemonium通用动态脱壳工具介绍。
1. 通用脱壳工具简介
通用脱壳工具可以通过以下方法实现:
其中PinDemonium采用的就是DB的方法。
采用DBI主要原因是:
2. PinDemonium原理
通常,程序的一个内存地址要么可写,要么可执行,满足Write xor Execution (WxorX)规则。但是加了壳的软件会违反这条规则。
通用脱壳工具原理:加壳的可执行文件必需在运行时脱壳。脱壳过程中会向内存中写入新的代码,然后执行写入的代码。利用上述特性来构建通用脱壳工具。
通用脱壳工具必须解决的两个问题:
***个问题只能通过启发式的方法解决,因为脱壳过程什么时候结束是不可判定的。PinDemonium 综合多个文献中提出的启发式方法来增加找到OEP的可能性,并且重新构建一个可执行的版本。
第二个问题要找到Import Address Table(IAT),从而找到相关的API。
PinDemonium 也是利用通用脱壳工具的原理。记录被写过的地址来发现写后执行的内存区域,当被写过的内存区域要被执行时触发转储和分析功能,然后尝试找到程序所有的导入函数来重构一个可执行的程序。
3. PinDemonium特点
PinDemonium 先进性:
PinDemonium 主要特点:
(1) PinDemonium 的核心模块记录写过的地址(包括对远程进程的写),当发现写后执行的情况,就用 Scylla 对程序进行dump。
(2)对 Scylla 进行了改进:
(3)为了保持性能和简化识别写后执行代码的过程,忽略和脱壳无关的指令,如写栈和写Process Environment Block(PEB)
(4)通过设置 PinDemonium 的一些标志可以开启 PinDemonium 相应的功能来对付某些壳所使用的技巧
二、构成
PinDemonium 使用了两个第三方工具:插桩工具intel PIN和Scylla。
1. Intel PIN
PinDemonium 选择插桩来实现通用脱壳工具, 因为:
选择Intel PIN,因为PIN功能全面,文档丰富。
PIN 插桩的粒度可以是:
PIN插桩粒度如图1所示
图1
利用插桩可以实现多种功能,如图2所示,一个利用插桩计算程序指令数的例子。
图2
pintool是用户开发的dll来实现想要的功能。pintool 必须包含两个部分:
如图3所示,显示了PIN的流程。
图3
Scylla的两个主要功能是IAT搜索和Import Directory重构。其中,IAT搜索部分,Scylla使用两种技术搜索IAT:基本IAT搜索和高级IAT搜索。
(1)基本IAT搜索
(2)高级IAT搜索

对所有可执行页面而不是仅仅对包含开始地址的可执行页面来搜索IAT。
三、系统结构
PinDemonium系统结构如图4所示:
图4
从图中可以看出,PinDemonium主要包括5个模块:
1. WxorX handler module
WxorX handler module是PinDemonium的核心模块。WxorX handler module记录写过的地址(包括对远程进程的写),当发现写后执行的情况,就用Scylla对程序进行转储。
为了检测写后执行,实现的两个重要功能:
(1) Written addresses tracking:记录被写过的每个内存地址来创建 Write Interval(WI)。WI 是一个结构体,记录一片被写过的连续内存,包含以下信息:开始地址,结束地址,是否已分析的布尔标志,对 WI 所有启发式方法的结果。图5显示了对2个WI进行合并的三种情况。为了保持性能和简化识别写后执行代码的过程,忽略和脱壳无关的指令,如写栈和写Process Environment Block(PEB)。
图5
(2) Write xor Execution (WxorX) addresses notifier:检查现在执行的指令是否在WI中,如果是,执行以下分析:
WxorX addresses notifier 用于触发转储功能,当某个WI***次被违反WxorX规则进行转储。为了解决图6的情况,当同一个WI中的跳转大于阈值时也会进行转储。
图6
PinDemonium hook系统调用来发现对远程进程的写,用hashmap将pid映射为WI,监控用于执行注入载荷的相关函数,当发现对远程线程的写后执行时,PinDemonium转储远程进程被写过的内存并调用启发式方法对转储结果进行评价。
2. Hooking Module
Hooking Module 利用 Intel PIN 的功能对API和系统调用进行hook以达到跟踪程序行为的目的。图7显示的是对API的hook。
图7
图8显示的是对系统调用的hook。
图8
3. Dumping module
许多内存转储工具,只会转储目标程序的主模块,遗漏了动态内存区域(例如堆)上的代码,如图9所示。
图9
Dumping Module依赖于 Scylla。PinDemonium对 Scylla 进行了改进:将Scylla的PE重构模块增加了对动态内存区域(例如堆)的考虑。PinDemonium将堆上的WI标记为heap write interval,当heap write interval违反WxorX规则,不仅转储程序主模块,还向转储中添加新的节来包含heap write interval的内容并将Entry Point设在这个节内,如图10所示。
图10
图11显示的是利用Scylla来转储。
图11
4. IAT search and reconstruction Module
为了获得更好的结果,PinDemonium综合运用Scylla的基本IAT搜索和高级IAT搜索功能,如图12所示。
图12
5. IAT Fixing and Import Directory Reconstruction
没有能解决IAT混淆的通用技术,所以PinDemonium对Scylla进行改进,让分析人员能自己编写去混淆代码并集成到 PinDemonium 中。PinDemonium 实现了一种能够解决图13所使用的IAT混淆技术的算法。
图13
6. Heuristics implementation
PinDemonium 使用启发式方法对获得的转储进行评估,每个启发式方法可以在最终生成的报告中设置一个标志位,所有的的标志位帮助识别***的转储。有4种启发式方法:
(1) 熵:图14显示了加壳前后MessageBox程序的熵的情况。加壳后熵明显增加。所以可以对比脱壳前后熵的变化大小是否超过阈值来对脱壳结果进行判定。
图14
(2)跳到节外:程序脱壳完毕后,调到OEP执行时通常会从一个节跳到另一个节,利用这一特点来对脱壳结果进行判定。
(3)长跳转:如图15,程序脱壳完毕后,跳到原始代码去执行的情况通常不是(a)和(b)那种短跳转而是(c)那种长跳转,利用这一特点来对脱壳结果进行判定。
图15
(4) pushad popad:脱壳的过程中是否出现了pushad和popad这两条指令,如果都出现了就在报告中设置对应的标志位。
四、实验效果
实验一,已知加壳类型的实验,实验结果如图16:
图16
图17
五、使用
本人由于实验需求,利用vmware搭建了PinDemonium环境,实现批量脱壳。
通过这个指令可以实现样本的脱壳,脱壳结果截图如图18:
图18
设置 PinDemonium 的一些命令行参数可以开启PinDemonium相应的功能来对付某些壳所使用的技巧。
如何用PEID脱壳?
peid是用来查壳的哦,右下角按钮点下显示的是插件列表,其中有一些脱壳的插件,不过只是一些简单的压缩壳而已,比如upx等。 如果不会用OD手动脱壳的话,那就找脱壳机吧。 举个用PEID脱UPX壳的例子:先载入你的程序,然后点右下角的箭头按钮,然后选择unpacker for UPX,peid就会自动帮你脱了。 用PEID脱壳不推荐。 PEID强大的地方在与他的查壳功能和随时更新它的数据库。
如何给病毒加壳?
我说个简单的方法 修改PE头 插花指令 再加个壳 再用系统自带的捆绑软件iexpress ok了(一)壳的概念 作者编好软件后,编译成exe可执行文件。 1.有一些版权信息需要保护起来,不想让别人随便改动,如作者的姓名,即为了保护软件不被破解,通常都是采用加壳来进行保护。 2.需要把程序搞的小一点,从而方便使用。 于是,需要用到一些软件,它们能将exe可执行文件压缩, 3.在黑客界给木马等软件加壳脱壳以躲避杀毒软件。 实现上述功能,这些软件称为加壳软件。 (二)加壳软件最常见的加壳软件 ASPACK ,UPX,PEcompact 不常用的加壳软件WWPACK32;PE-PACK ;PETITE NEOLITE (三)侦测壳和软件所用编写语言的软件 因为脱壳之前要查他的壳的类型。 1.侦测壳的软件 简称(侦测壳的能力极强)。 2.侦测壳和软件所用编写语言的软件(两个功能合为一体,很棒),推荐language2000中文版(专门检测加壳类型)。 3.软件常用编写语言Delphi,VisualBasic(VB)---最难破,VisualC(VC)。 病毒要想生存,除了增加自身的变形能力以外,还可与程序加壳压缩联系起来。 我们先来看看病毒变形的目的,因为现在的反病毒软件,基于特征码检测,增加变形能力,使得特征码检测方法更加困难。 那么,如果再和程序加壳技术结合起来,那么将使的单单通过添加特征码方法解毒彻底失效,解毒时,必须同时更新扫描引擎,而现在并没有通用的解壳方法。 因此加壳压缩和变形结合起来,将使得反病毒厂商手忙脚乱,也使得反病毒软件用户痛苦不堪,频繁的更新,除了特征码,还有扫描引擎。 给平常的病毒加个壳,比如用upx,现在通常反病毒软件,对于常用的加密加壳压缩程序,都有相应的解壳程序。 效果并不好,所以如果病毒本是既是一好的变形加密加壳压缩程序,那么,目的是强迫更新扫描引擎,当然也是可以被动态解压检测出来的,只是增加了解毒的很多工作量。 实际上加壳技术不仅仅用于软件保护,也可用于好的病毒。 好的病毒不一定要非常快的传播速度,难于检测,难于查杀更重要一些,就像现在杀毒界的虚拟机技术,也不过是个雏形,有很多的功能并不能完全虚拟化,同时若加壳代码本身可变形,同时有多种加壳算法可供随机选择,那么就很难找出其中的规律以及关系。 总之,好的杀毒软件至少应该具有的技术功能之一就是要具备压缩还原技术:对Pklite、Diet、Exepack、Com2exe、Lzexe、Cpav等几百种压缩加壳软件自动还原,彻底解除隐藏较深的病毒,避免病毒死灰复燃。
网上的peid怎么扫描都撬不了壳
下载最新的PEiD V0.94加插件版迅雷高速下载:thunder://QUFodHRwOi8vdzEuZTY2Ni5jbi9ncmVlbi9QRWlELnJhclpa(会提示有病毒,其实没毒的,卡巴扫描没问题)使用里面的插件,PEiD通用脱壳工具,会产生一个新的可执行文件,跟被脱壳文件一样的,名字加了_而已。 插件在右下角“->”这个按钮下方,PEiD Generic Unpacker,下面还有几个专有Unpacker工具。 再用PEiD查看新产生的可执行文件,如果提示C++,Delphi等的说明已经脱壳成功。
发表评论