危险漫步博客
新鲜的“黑客思维”就是从全新的角度看待黑客技术,从更高的层面去思考;专注于黑客精神及技术交流分享的独立博客。
文章2289 浏览18791525

对抗四大杀软——记一次不完美的免杀

很久很久以前网上流传着一个传说:江湖中四大高手东邪西毒南帝北丐分别代表着国外四个不同的杀毒软件。

一、麦咖啡就像东邪,玉树临风,俊朗潇洒,对敌招式繁多,机关重重,杀伐决断,从不迟疑,为江湖第一机智聪明之人,但因其心机太深,令人难以掌握。

二、卡巴斯基就好像西毒,凶猛强悍,神功盖世,对敌决不留情一出手狠辣,招招夺命,绝少失手,不愧为一代枭雄,但毕竟练的不是纯正内功,容易走火人魔,导致系统出问题。

三、诺顿就像南帝,雍容华贵,稳沉厚重,胸怀博大,练的是纯正内功,靠的是教化感人,对敌有慈悲心肠,一般采取隔离教化,使其不再作恶,很少杀人,称的上是一代宗师,但因其过于敦厚,不仅自己活的累,别人也为他感到累。

四、nod32就像北丐,来无影去无踪,潇潇洒洒,笑傲江湖,对敌用的是逍遥游和打狗棍法,江湖上少有对手,但因其过于轻浮,难免误事。

记得上一次和这四大杀软交手已经是三年前的事情了。当时用来测试的远控是pcshare,使用的方法是最为原始的特征码免杀。如今各种查杀技术、免杀技术不断的推陈出新,很多新技术甚至闻所未闻。所以出于学习探索的精神,我决定再会会这四大高手。这回用的远控是暗组的DRAT 5.0,使用的技术依旧是特征码免杀。

第一个对手是东邪:麦咖啡。说实话黄老邪的表现让我挺失望的。老规矩Myccl定位特征码,相信大家都很熟悉了,不过有个小细节也许会对免杀有一点帮助,就是填充的地方把默认的填充00改为填充其他的数值,在免杀的过程中有的杀软专门会对这个选项做干扰的。

特征码定位出来之后发现是一个ASCII字符,直接在C32asm里进行大小写翻转后就躲过麦咖啡的查杀了。把麦咖啡的监控全开运行了我们的远控服务端,小马在麦咖啡毫无反应的情况下默默的上线了。

初战告捷,但我不敢掉以轻心。接下来的对手是杀毒软件中公认的霸主:西毒卡巴斯基。测试用的杀软版本是卡巴斯基安全部队(很嚣张的名字啊……)定位方法依旧是使用MyCcl定位特征码。卡巴斯基依旧很卡,经过了痛苦的定位之后,特征码只有一个,位于输入表的ZwUmuapViewOfSection函数。这是很棘手的一种情况,输入表的特征码是不能乱改的,一不小心就会造成程序崩溃。在这里先科普一下:输入表也称之为“导入表”。平时当一个程序运行时,导入函数是被程序调用执行的,其执行的代码是不在主程序中的一小部分函数:其真正的代码却在DLL文件中。EXE主程序要找到这些需要导入的函数就要归结于“输入表”了,输入表就相当于EXE文件与DLL文件沟通的钥匙,所有的导入函数信息都会写入输入表中,在PE文件映射到内存后,windows将相应的DLL文件装入,EXE文件通过“输入表”找到相应的DLL中的导入函数,从而完成程序的正常运行。所以在这处特征码上程序调用了系统ntdll.dll中的ZwUnrnapViewOfSection函数,如果还是像之前的大小写翻转的话肯定是无法正常运行的。常见的输入表免杀方法诸如函数移位;加密输入表;重建输入表;将修改调用的dll后的“.”改为90;破坏指针等方法在卡巴的高启发杀毒机制下均告失败,简直就是追魂夺命千里寻踪。

难道真的没办法对付卡巴了吗?非也!仔细想想杀毒软件查杀病毒的原理:表面上卡巴是查杀ZwUnmapViewOfSection的位置,但是如果一个正常的文件也调用了ZwUnmapViewOfSection函数的话,是不是卡巴也会去进行查杀呢?答案当然是不。虽说卡巴名为西毒,但是也不至于蛮不讲理乱杀无辜吧。所以肯定是我们的小马在调用这个函数的时候行为上让卡巴大叔看不顺眼了。所以用OD导入目标文件,点击右键选择查找——当前模块中的名称(标签)。这时候就可以看到所有调用的函数了,拉到最下方可以看到ZwUnmapViewOfSection,选中后按回车就可以看到是哪里调用了这个函数了。幸好只有一个地方调用了这个函数,选中之后再按一下回车就可以到达函数的位置:

在OD的信息窗口可以看到如下信息。

改为CALL 7C92DEFO,也就是直接用硬编码的方式,直接从操作系统里的ntdll.dll中查找ZwUnmapViewOfSection函数;接下来把00413C34地址的JMP DWORD PTR DS:[<&ntdll.ZwUnmapViewOfS>修改为retn。为什么要这么改呢?各位看官仔细回想下,虽然实际上是00413D12这个地址调用了ZwUnmapViewOfSection之后加上一些其他的行为导致卡巴大叔对其进行查杀,但是在表面上(姑且让我这么去形容)卡巴还是杀00413C34这个位置的。所以我们要把它修改掉。当然直接nop肯定是行不通的,这样程序整体就会被破坏掉了,所以我们在这改为retn进行返回,这样程序就不会出错了。至于我之前说的副作用是什么呢,因为windows的每个版本,甚至是不同的SP号,里面的硬编码地址一般都是不一样的。所以我这样一修改后,无疑是让这个远控只能运行在我做免杀的这个操作系统版本下了。当然如果在拥有源码的情况下,我们可以通过判断目标操作系统版本号去选择相应的硬编码地址,但是现在的情况自然是没有远控的源码了,所以除了这招之外我想不到其他更好的方法进行杀毒软件高启发引擎下的输入表免杀了,哪位朋友有更好的方法的话还请多多指教。

文件表面免杀做好之后,还不能过早的庆祝胜利。因为卡巴最强悍的地方是他的主动防御。虽然文件已经免杀了,但是开着卡巴监控的情况下运行木马,卡巴还是会对其进行拦截,提示是“正在启动可能会造成损害的软件,没有数字签名,危险级别较高”既然有了这么明显的提示框了,那我们就给生成的服务端加个数字签名吧。使用数字签名工具对木马进行处理之后,再次运行,卡巴大叔果然不再进行拦截了。试了下功能无损,不卡不弹窗。

成功阻击两大高手,接下来当然要乘胜追击了。下一个目标是有南帝之称的杀毒软件一一诺顿。还是用Myccl进行特征码定位。但是很神奇的事情发生了:杀软居然一个样本分块也不杀!传说中杀毒软件高启发干扰定位的特征之一就是所有的样本都不查杀。为此我还特意的换了个特征码定位器MutiICC1。结果事实证明是我疏忽了,诺顿根本就不查杀我们的小马!那一刻我彻底斯巴达了!难道诺顿真的像南帝一样拥有着慈悲心肠不杀我们的马儿?但接下来的事实就让人大跌眼镜了:开着诺顿的防护运行小马后,小马没有像预期那样消失不见,客户端也没有提示上线。过了几秒之后右下角弹出了个警告窗口“SONAR已删除风险222.exe”。原来是诺顿的主动防御在搞鬼。这回没办法对其进行定位了,但是我们还有杀招:数字签名。依旧对生成的服务端加个数字签名,不能是复制的签名,因为复制其他软件的数字签名诺顿也是会杀的。加好了数字签名后,在诺顿的防护下运行小马,果然这回不报毒了,小马正常上线。在这里顺带提一下,有的同学也许会偷懒直接对DRAT里的server.dat去加数字签名,这样做是行不通的,生成的服务端会因为文件被修改而造成数字签名失效。所以必须要生成了一个正常的服务端后再对其进行数字签名。

最后要过的杀软是北丐:NOD32。依旧是老方法Myccl定位目标文件,可是定位来定位去渐渐的发现情况不对了……NOD32把生成的样本全杀了!这是NOD32的高启发引擎搞的鬼,百度了下貌似Myccl已经被NOD32给吃透了,所以这里得换个特征码定位工具。我用的是multiCcL,在设置定位精度的时候把精度设置为10,因为NOD32的高启发干扰性比较强,所以把精度设置得低一点。经过再次定位之后终于得到了真实的特征码。在C32ASM里查看了下发现又是定位到了输入表里,但是NOD32明显比卡巴要狠,定位到了两个函数上:CopyFileA和CloseHandle。单独删掉其中的一个函数NOD32还是会杀的,必须两个都填充掉才可以躲过NOD32的追杀。在这里依旧是使用对付卡巴的特征码修改方法进行修改,由于调用了CloseHandle的地方比较多,所以这个特征码改起来是个体力活!经过辛苦的修改过后,NOD32终于对我的小马网开一面了。

到这里整个免杀过程就全部结束了。危险漫步鏖战四大杀软的结果是:伤敌一于自损八百。小马只能在指定的操作系统上线,但是幸运的是功能无损,而且主动防御也能顺利的绕过去。至于文章里遗留的问题,还望有哪位大大能够多多指点迷津。