壳在免杀中的应用
一次性进群,长期免费索取教程,没有付费教程。
教程列表见微信公众号底部菜单
进微信群回复公众号:微信群;QQ群:16004488
微信公众号:计算机与网络安全
ID:Computer-network
计算机世界里的壳将有用的东西保护在里面,以防他人窥探,只有当系统运行它时,它才会把一直保存的东西释放到内存中并运行。反病毒与反查杀都是在加壳与攻壳中实现的。
一、壳的基础知识
对于现在的壳来说,根据作用与加壳后的不同效果,可以将其分为两类,一类是压缩壳,另一类是加密壳。但不管是压缩壳还是加密壳,它们的大致原理与执行流程都是一样的,应用程序加壳后就会变成PE文件里的一段数据,在执行加壳文件时会先执行壳,再由壳将已加密的程序解密并还原到内存中去,其整体运行流程如图1所示。
图1 加壳程序的执行过程
下面我们一起来看看壳的加载详情,首先系统加载程序并运行壳,这时壳会加载自己运行时所需要的API函数,然后将已加密的节区解密,如果是压缩壳还要解压,并按照PE文件节的定义将其放到正确的内存位置上,再进行重定位,最后跳转到入口点开始运行原程序。
上面只是壳的解压并运行的一个综述,相信通过上面的介绍大家已经可以对壳的运行模式有一个基本的了解了。下面会将壳的运行过程进一步展开,尽可能详细地讲解其每一步操作。
加载API函数:通过上面的介绍我们知道,想要运行加壳程序需要先加载API函数,但是究竟什么是API呢?API也叫做“应用程序编程接口”,它是Windows提供给编程人员的一系列函数,应用程序通过调用这些函数来完成对操作系统的一系列操作。现在大家不用详细了解,只要知道应用程序执行的每一个操作都要调用系统的API来进行就可以了。虽然壳执行解密操作时,一定会用到一些API函数,但是一般情况下加壳之后的应用程序不会找到多少API,有时甚至只有区区几个,很显然这些API是不足以满足壳的需要的。而之所以我们看不到什么有用的API,是因为一些有用的API已经被壳隐藏起来了,只有在壳的运行过程中才会动态地将其所需要的API全部加载。
解密节区:壳会对已经压缩成资源的原应用程序数据进行逐节区解密,然后释放到合适的内存位置上。
进行代码重定位:壳需要对已解密的程序进行重定位,因为有一些壳会将原程序中保存重定位信息的节区去掉,以此来保证程序被压缩得更好,并且更加不容易被破解。所以在将运行流程交给原程序之前,还要将其进行重定位操作。在重定位工作中最重要的信息要数基地址(ImageBase)了,一般,EXE文件的基地址都为0x00400000,而且程序运行后系统给程序提供的基地址恰恰也是这个基址,所以在这种情况下并不需要进行重定位。但是事实并不总是如此乐观,例如动态链接库(DLL)文件,操作系统不可能保证每一次DLL运行时都能给其提供相同的基地址,所以在这种情况下重定位就显得很重要了。
转到入口点:最后壳跳到原程序的入口点,将执行流程交给原程序,此时被加密的原程序才能真正运行起来。
以上就是壳的解压过程了,那么它的压缩过程是什么样的呢?对于这个问题就要大家自己研究了,对于免杀或脱壳来说,它的压缩过程是不必详细了解的,因为那是壳的作者需要思考的问题。
二、壳在免杀领域的应用
基于加密压缩原理的加壳技术肯定会让加密后的文件有非常大的变化,所以如果反病毒软件没有将其脱壳还原的话,肯定是无法查杀其中的病毒的。因此在免杀刚刚开始盛行的时候,加壳免杀的方法受到很多初学者的追捧,因为其操作简便,而且当时的反病毒技术也不像现在这样先进,所以往往只需点击几下鼠标就可以达到比较满意的免杀效果。但是随着反病毒厂商技术的不断成熟,自动脱壳、虚拟机脱壳的技术不断被应用到最新的反病毒产品中,加壳的免杀效果也大打折扣了,用加壳的免杀方法正被逐渐淘汰。但是加壳免杀作为一种曾经有效的免杀手段,我们还是有必要了解一下的,而且随着时代的进步,加壳免杀技术也诞生了不少新的思路和技巧。下面就为大家简要介绍一下加壳免杀的具体思路与各种技巧。
1、加壳的免杀原理
我们知道,被加壳的原程序会被外面的壳重新排列(压缩)一遍,这就相当于加了一层保护。基于壳的种类不同,加壳后的应用程序体积有可能会变得更大,也有可能被压缩得更小,但是不管是哪种类型,加壳以后的程序代码都是没有人能读懂的。这样,杀毒软件自然也就找不到已经定义好的特征码了。如果加壳程序运行时碰到了算法先进的内存扫描器,程序被还原的瞬间还是有可能暴露自己的特征码的。但是就目前的杀毒软件来讲,一款陌生的或经过修改的强壳还是可以达到很明显的免杀效果的。
除此之外,经过加密壳或虚拟机处理过的程序即便是被还原也会掺杂着大量的立即代码与花指令,所以对于这部分病毒木马而言,反病毒公司一般情况下就会将特征码定位在壳本身的代码上,以后凡是碰到用此款壳加密过的软件将会全部报毒。这样虽然大大增加了误报率,但是却保护了用户的安全。
2、FreeRes多重加壳
关于FreeRes,可以说它是加壳免杀的一个里程碑,FreeRes软件原作者的意图是想通过这款软件将已压缩加密的程序解压并释放,从而有利于汉化爱好者进行汉化操作。但是它的这种特殊功能很快就被黑客发现并加以利用了。
在此之前,黑客们为了对抗杀毒软件的自动脱壳功能,发现了一些重复加壳的规律,使得某些壳可以与其他一些壳重复使用,这也就是最原始的加多层壳的方法。但是杀毒软件厂商很快就做出了反应,这使得仅有的一些加壳组合迅速被破解,有限的组合方式很快就不再适用了。在这个背景下,于是诞生了FreeRes加多层壳的方法,它使得黑客可以无限次数地为应用程序加壳,最重要的是里面没有绝对的组合规律,也就是说理论上FreeRes可以帮助你用任何加壳软件对一个软件进行多次加壳。
下面为大家演示一下FreeRes加多层壳的操作步骤。首先打开FreeRes,依次选择“文件”→“打开”,打开已加壳文件DTools,之后会弹出一个提示框,提示我们已载入的资源可能已被压缩,单击“是”按钮继续。
这里需要提醒大家注意的是,如果你单击了“是”按钮,或资源已经被成功载入的话,那么就说明此时这个程序已经被执行了。也就是说,如果你此时正在用木马做实验,那么木马已经被运行了,因此大家一定要注意安全(例如使用自己生成的可以卸载的木马,并且不要选择自动删除功能)。下面依次选择“功能”→“建立可编辑资源”,如图2所示。此时会弹出对话框告知我们“已经建立了可编辑资源!”。
图2 建立可编辑资源
现在资源已经被成功释放,我们可以进行二次加壳了。打开eXPressor后将已释放的DTools拖拽到它的界面中加载。然后单击“开始压缩”按钮进行加壳。到现在为止,算上程序本身所带的那层壳,我们已经为程序加了两层壳,如果大家想加更多的壳只需重复上面的步骤即可。
三、壳的修改技巧
壳既然具有加密功能,并且每个壳都有不同的特征,那么我们是否能将免杀的思想应用于壳上呢?壳的流程改变了,自然特定的检查方式与脱壳方式也就对它无效了。下面通过两个例子教大家从两个不同的方面来了解壳的修改技巧。
1、壳的初级修改
壳的修改方法其实与特征码基本一致,无非是上下两句互换、同意语句替换等。下面就来演示一下壳的修改方法。
首先给一个应用程序加上一个北斗的壳,然后用OllyDbg打开。在修改壳的代码时,记住一定要在入口点附近修改,我们可以看到入口点附近的代码如下所示:
其中0041D88E就是入口点。我们可以看到,程序开头先是两个压栈操作,随后是一个调用与一个出栈操作,如果在这3条指令上修改的话,成功率肯定不会很高。接着往下看,是一个传送指令,将7传送给eax,随后在下一条指令里又将eax与ebp相加,因为这是在程序的开头处,所以一般情况下eax应该是初始的空值。那么这里就有两种方案可行了。
将第5条指令mov eax,7删除,然后再将第6条指令的sub ebp,eax改为add ebp,-7,这样可保证本段指令的结果不发生变化。
先将mov eax,7改为mov eax,-7,然后再将sub ebp,eax改为add ebp,eax,这样依然可以使程序本段指令的结果不发生变化。
但是如果像上面那样更改,第一种方法会导致eax不能被赋值,也就是说eax的值经过本段指令后仍然为空,而第二种方法则可能导致eax带了一个错误的值继续后面的其他运算,所以这两种修改方法都有可能导致程序运行错误,这点需要大家注意。这里使用的是第二种方案,然后依次单击右键→“复制到可执行文件”→“选择”→再次单击右键→“保存文件”,从而将修改之后的程序保存,最后执行一下以确定其完全正常。虽然在运行上看不出丝毫变化,但是经过这样的更改之后,用PEID查一下壳就会看出其中的奥妙,如图3所示。从图中可以发现改过之后的程序已经不能被PEID所识别了。而且就目前来讲,这种通过修改壳来实现的免杀方法绕过卡巴斯基还是比较有效的!
图3 修改之后的效果
2、制作通用补丁
通过上面简单的讲解,相信大家对壳的修改已经不陌生了,但是每次免杀时都修改一次是不是会很麻烦?于是黑客想到了使用补丁。
(1)壳的深度修改
要想制作通用的补丁,就要先寻找壳的特征。为了比较壳本身代码的特征范围,这里要准备两个文件,而且它们之间的差异越大越好,这样更容易发现壳本身的特征。除此之外,其中一个文件一定要能被反病毒软件查杀,这样有利于我们验证修改后的效果。
我准备的是一个707KB的NBSI与一个108KB的强行删除工具killbox,其中的NBSI会被杀毒软件查杀。首先分别将这两个工具加壳,然后再分别用OllyDbg加载这两个文件,找出它们的相同之处。通过简单的比对可知,这两个程序的前500条指令基本是一样的,只有极个别的跳转与传送指令有异,因此可以忽略不计。这就意味着前500条指令便是我们的舞台,既然可以在这么大的范围内修改,可想而知机会还是很多的。
接下来就是对壳进行修改了,在对壳进行修改时,必须要搞清楚怎样的修改能达到预期的目的,这样才能在多种修改方案中进行取舍,从而使我们对修改结果感到满意。如果想修改壳的特征,那么就应该在靠近入口点的地方进行修改,例如前面所讲述的修改方法。但是如果想修改壳的流程,那么就应该修改一些跳转或调用指令,以及带借进位的运算。根据一般情况来说首先应该选择更改壳的特征,一是因为修改特征比较容易,二是可为以后的修改打下一点基础。为了便于验证,这里使用加了壳的NBSI来做实验,为了能有效地将壳的特征破坏掉,我们在靠近文件的入口点处将第4行与第5行分别修改如下:
也就是将原来的赋值语句mov eax,7给改成了mov eax,-7,因为eax在下面马上就会被调用,所以我又将下面那句加法指令给改成了减法指令,其实只是在做加减法的小把戏而已。这样更改后虽然可以欺骗PEID,但是欺骗不了杀毒软件,所以还要进行一些更为大胆的修改。
继续往下看,在第18行看到了一个sub指令,并且在第20行还有一个add指令,如图4所示。
图4 待修改指令
下面我们就把它们分别修改如下:
其中sbb是带借位的减法运算,adc是带进位的加法运算,只要上述运算不进位或借位的话此修改就会成功,保存一下,然后运行,得知程序功能正常,而且已经不会被杀毒软件所查杀了。
但是有的朋友或许会感到困惑,为什么更改这两句就一定管用呢?其实这就是汇编基础与经验的结合了。粗略地看了一下程序的前500行指令,发现其中有很多的跳转指令,这就意味着我们应该尽量在第一个跳转前做有效的修改,因为我们不能确定在那个跳转之后,哪些指令肯定会被执行,而哪些则很少执行,所以我此时的注意力就主要集中在了前50行的指令里。在这50行指令中有两个跳转,而且第一个je跳转前有一条比较指令cmp al,0,我们知道je的意思是等于则跳,也就是说如果cmp al,0成立的话就会跳转到第16行指令,否则就会执行下面那个大跨度的跳转,如图5所示。
图5 0x004B2566处有一个大跨度跳转
其实,我一开始修改的是第6条指令add ebp,eax,即将其修改成adc ebp,eax,但是保存后程序不能运行,因此才尝试修改第18行指令。从中也可看出,壳的修改其实是很难一次就完成的,但是如果我们坚持尝试下去就一定会成功,特别是对于经验缺乏的初学者来说更应如此。
(2)提取壳的特征数据
壳已经修改成功,接下来就要开始制作补丁了。想要制作出具有良好通用性的补丁,首先要做的就是提取好壳的特征,也就是在加过壳的文件中提取出能判定这个壳的特征字符,PEID就是利用这种方法来判定壳的种类的。
通过上面的操作已经得知两个程序都加了北斗的壳,而且已经知道修改哪些地方后壳就不会再被查杀。那么,现在就可以开始提取这两个程序的特征码了,先用OllyDbg打开那两个加过壳且没有修改过的程序,如图6所示。
图6 两个加壳程序的起始部分反汇编代码
通过上一步的修改信息可知,我们所修改的最后一条指令为第18行的语句,那么就可以将这两个程序从入口点开始的前20条指令分别复制出来,并将其粘贴到记事本中,然后将空格与换行符去掉,最后便会得到如下数据:
以上第一段数据是最终从“killbox[加壳后].exe”中提取出来的十六进制码,第二段数据是“nbsi[加壳后].exe”的十六进制码。
接下来找出两段十六进制码的不同之处,不同的地方用"?"代替,得出如下十六进制码:
现在回到OllyDbg,粗略地查看一下,发现不同之处多为表1中所示的指令。
不难发现十六进制数据区的前4个字节都为操作指令,后面的8位为操作数,而且两个程序的不同之处正是这些操作数。因此为了保证补丁的通用性,我们要将这后面的8位操作数用"?"代替。替换后的加壳特征如下所示:
现在再将修改好的“nbsi[修改后].exe”的十六进制码提取出来,如下所示:
然后将“nbsi[修改后].exe”的十六进制码与上面的加壳特征做比对,并将不同之处替换到加壳特征里,处理完毕后得到的最终加壳特征如下所示:
加粗的字体即为后来替换进去的内容("F9FFFFFF03",B95?前边的“1”和195?的"“1”为替换进去的内容),现在我们已经将最终的加壳特征完美地提取出来了。
(3)制作通用补丁
现在打开CodeFusion Wizard,这是一款制作补丁的软件。我们可以根据自己的喜好填写一下版权信息,填写完毕后单击“下一步”按钮进入下一个界面。然后单击界面中“需补丁的文件”后的“+”号,如图7所示。
图7 添加需补丁的文件
在弹出的界面中单击“所有文件”按钮,以保证补丁的通用性。然后再单击“需补丁的数据”后的“+”号,弹出如图8所示的对话框。
图8 单击“+”号后弹出的对话框
接着单击其中的“查找和替换”按钮,在弹出的对话框中单击左下角的“普通查找及替换”按钮,并将我们提取出来的加壳特征复制到的“数据[查找]”栏里,将最终加壳特征复制到“数据[置换]”栏中。为了保证补丁的通用性,“开始偏移(S):”后面的信息不用填写,保持默认即可,这样它就会从偏移为0x0000000处开始搜索特征字符,最后填写的效果如图9所示。
图9 编辑查找/替换数据信息
最后单击“下一步”按钮进入最后一个页面,并单击其中的“创建Win32可执行程序!(M)”即可成功创建补丁。我们用创建的补丁处理一下其他使用北斗加壳的木马,发现PEID识别不了,杀毒软件也不查杀了,而且木马依然运行良好!
微信公众号:计算机与网络安全
ID:Computer-network