查看原文
其他

黑客免杀壳

计算机与网络安全 计算机与网络安全 2022-06-01

一次性进群,长期免费索取教程,没有付费教程。

教程列表见微信公众号底部菜单

进微信群回复公众号:微信群;QQ群:460500587



微信公众号:计算机与网络安全

ID:Computer-network

黑客写壳的目的之一就是能打造一个属于自己的免杀壳,而我们只有了解了免杀壳的原理后才能知道如何防御黑客入侵。单从文件免杀的角度来讲,一个简单的异或加密壳已经足以破坏绝大多数的特征码,但是如果想要使其做到内存免杀乃至行为免杀,就不那么简单了。


除此之外,由于几乎每个壳的Stub部分都是独一无二的,因此壳的Stub部分本身也是很容易被定为特征码的。例如目前比较出名的壳大多数都有此类问题,即便是使用这些壳去保护一个毫无恶意行为的程序,也会被杀毒软件误判为木马病毒。黑客为了避免此类事情发生在他们的壳上,他们除了在壳的冗余设计上多动脑筋外,限制壳的流通范围也是必不可少的。就一般情况来讲,专业的免杀壳应该都是仅在极小的范围内流通的。


一、免杀壳与加密壳的异同


我们经常能听到或在网络中看到一些人将免杀壳与加密壳混为一谈,其实这种观点并不准确。


免杀技术兴起之初,确实有一段时间免杀壳与加密壳发生了交集,但是随着反病毒厂商的启发式扫描的广泛应用,这种发生交集的情况也在随着时间的推移而逐渐减少。


免杀壳的一个最基本的功能就是要保证加壳前的程序与加壳后的程序不应该有太大的差异。换句话讲,就是黑客们不想让他们的木马在加上免杀壳后反而增加一些可疑特征,仅就这一点来讲,绝大多数的加密壳就已经被淘汰掉了。


我们知道,对于加壳后的程序,无论是其区段的数量、名称还是属性都未发生较为明显的变化,由此引来的就是多个区段具有可执行属性,亦或是区段数量与名称等异常情况,这无疑会大大增加加壳后程序的启发式特征。


免杀壳除了需要完成加密壳的大部分操作外,还要尽可能保证加壳后的程序与原程序不要有太大的差异,比如从PE文件结构的角度来讲要尽可能正常,从入口点的代码的角度来讲要尽可能接近于主流编译器生成程序的入口特征。而完成这些目标的最佳方式就是完全使用C++编写Stub部分,这样壳(Stub部分)的入口点“天生”就具有主流编译器生成程序的入口特征了。


总体而言,免杀壳的主要目的就是能尽可能破坏原有程序的结构,能通过钩子的方式尽可能破坏原有程序的敏感行为,并在此基础上尽可能避免出现PE文件异常的特征。而加密壳除了加密源程序外,其他的都不是它需要关注的。


二、导入表加密


导入表加密是指将PE文件的导入表部分替换掉或者干脆清除掉,并以另一种方式、另一种逻辑完成原导入表的功能。对PE文件进行导入表加密后会导致次PE文件的所有系统API调用及第三方API调用的信息丢失,使得其他人在未重建导入表的前提下,很难再对程序展开逆向分析与调试。


能阻止人的调试,那么阻止反病毒软件的分析肯定就更不在话下了,因此在黑客们制造免杀壳时也同样要考虑导入表加密的问题,只不过免杀壳中的导入表加密的目的并不是单纯地保护导入表本身,亦或是借此增加壳与原程序的耦合性,而是从减少目标程序的文件特征与行为特征处入手。


例如,黑客们可以通过打乱宿主程序代码对IAT处的指向,使其直接指向壳的Stub部分,并由Stub部分接管这些API调用请求,从而使得一些反病毒软件的启发式扫描引擎不能直接判断宿主程序的API调用信息。除此之外,黑客们还可以进一步对Stub部分接管过来的API请求多做一些必要的Hook过滤处理,从而使得目标程序的行为变得更加正常。


这种Hook操作有一个专有的名词叫做IAT Hook,其工作原理十分简单。因为运行后程序的IAT中保存有当前系统各个API函数的地址,因此当程序需要调用某个API时,就会在IAT的某处取出这个函数的地址并调用。而IAT Hook的原理就是将IAT中放置的API地址替换为黑客指定的地址,因此当程序调用并执行这些地址上的函数时,其实是先执行了黑客自己的Hook函数,在经过黑客Hook函数的过滤与修改后,这个调用请求最终才会被放行,进而真正地去调用系统API。


举例来说,如果有一个被加壳的宿主程序执行了将某个文件写入系统目录中的操作,而当这个操作被拦截后,黑客们就可以将其替换为更加“安全”的、不会被反病毒软件所察觉的方式执行这次敏感区域的文件写入操作。

三、代码混淆与代码乱序


代码混淆(Obfuscated code)是指将计算机程序的代码转换成一种功能上等价,但是难于阅读和理解的形式的行为。一般简单的二进制代码混淆通常较容易实现,因为利用合理的替换逻辑后,会很少涉及段间跳转指令的修复问题,更多的只是简单的代码膨胀。


而代码乱序变形则是指将原有的程序以逻辑结构为疆域分成若干个部分,并将其先后顺序随机颠倒,然后再用jmp指令串起来,以使其真正的执行顺序不会被破坏。这种代码乱序变形技术是复杂的代码混淆技术的基础,如果要相对整个程序的大部分代码进行混淆的话,那么势必会导致大片的代码体积变动,这种变动会导致原程序中大多数的偏移地址不再正确,而代码乱序技术则恰好最擅长解决这类问题。因此,代码混淆与代码乱序在大多数情况下都是同时出现的。


无论是代码混淆还是代码乱序,对于黑客来说,它们都是对抗文件查杀以及内存查杀的好办法,虽然简单的代码混淆更容易实现,但是收到的效果可能也可能是最差的。


一般情况下,黑客们在编写执行简单代码混淆的逻辑部分时,首先会尽可能地去收集一些指令长度相同且功能相近的不同指令,并将这些指令做成一一对应的表,而整个代码混淆的过程其实就是一个简单的查表并替换的过程。但是很显然这种方法非常笨拙,且扩展性非常有限,通常难以达到目的。


因此黑客们想到了更加复杂的混淆与代码乱序的方法,这些方法的优点是灵巧且扩展性非常强,黑客们可以随时加入新的混淆算法,也可以随时将代码乱序逻辑更新为更好的方案。可以说此时限制黑客们的似乎只有数学上的门槛。


被这样混淆过后的代码,体积会变得异常庞大,例如著名的加壳软件Themida甚至可以将一个几十KB大小的文件混淆为数MB之巨,由此可见其威力是多么的强大。


但是其实混淆与代码乱序的方法也是有所限制的,最大的不足就是要求被处理的目标程序必须具有重定位表,否则这一切就无法稳定的执行。


四、附加驱动


在壳中附加有能对抗主动防御的驱动曾经是一代黑客们的梦想,但是随着各种反病毒软件对于系统Ring0层的看守越发严密,这种附加有驱动的免杀壳正逐渐被黑客们所遗忘。


自从简单地使用正规方式加载驱动不再有效之后,黑客们始终都在不停地挖掘着各种各样的“奇技淫巧”,以试图通过各种渠道将自己的驱动加载到目标系统中,这种对抗一直持续到2010年,最终以反病毒厂商封锁所有驱动加载入口并取得战役的胜利而结束。


然而这一切并未因此而停止,随后黑客们将本地溢出攻击引入到免杀领域,他们不断地在反病毒厂商的白名单中寻找有漏洞的软件。由于这些软件能获得反病毒软件的信任,因此即便是它们偶尔做一些出格的动作也不会引起反病毒软件的注意。


因此当这些软件被攻破后,黑客们就可以披着伪装做任何自己想做的事了。一时间黑市上开始流通一些能废掉各个反病毒软件的独立可执行文件,只要购买者在运行自己的恶意软件前运行这些程序,那么他的恶意软件就不会被杀毒软件所发现,这与其他黑客想在壳上附加驱动的目的是基本一致的。


免杀壳中附加驱动与一般通过编程的方式向系统载入一个驱动没有多少不同,唯一不一样的地方可能就是普通情况下加载驱动时读取的是驱动文件,而在壳中读取的有可能是一块保存有驱动文件数据的空间。


五、结语


有关黑客免杀壳的讨论本来应该是一个非常庞大的选题,它包含加密与解密、反病毒、混淆算法、语义分析与系统内核等多个方面,可以说如果想要打造一个优秀的免杀壳是一件并不轻松的事。但是也正因如此,在这里仅能向大家展示一些例如避免出现异常PE特征的免杀壳的核心思想,以及有关代码混淆与乱序大致的技术要点。

微信公众号:计算机与网络安全

ID:Computer-network

【推荐书籍】

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存