一线红队带你从O到无限进步
本文章所涉及所有内容均是大佬上课说讲的内容,其中做了一下基础的补充,高深的技术后面会慢慢在文章中出现
一线在职红队在线性感分享技术,从c语言开始基础带你慢慢进入终端对抗(免杀但是不止免杀)的大门。
紧接上文
结构体
结构体基本认知
结构是值的集合,这个值称为成员变量。
结构的中每个成员变量都可以是不同类型。
结构体的声明
语法:
struct abc
{
int a;
int b;
};
例子:
描述一个学生需要一些数据:姓名、年龄、性别、学号
struct student
{
char name[100];
int age;
char gender[100];
char number[100];
};
void main()
{
struct student stu1;//创建结构体变量
}
结构体别名
语法:
typedef struct student {
char name[100];
int age;
char gender[100];
char number[100];
} Stu;
例子:
typedef struct student {
char name[100];
int age;
char gender[100];
char number[100];
} Stu;
void main()
{
Stu aaa;
struct student abc;//这两种创建方式出来的结果是一样的
}
结构体初始化
语法:
typedef struct student {
char name[100];
int age;
char gender[100];
char number[100];
} Stu;
void main()
{
Stu aaa = {0};
struct student abc = {"xxx",1,"x","xxxx"};
}
例子:
typedef struct student {
char name[100];
int age;
char gender[100];
char number[100];
} Stu;
void main()
{
Stu aaa = {0};//设置结构体中的值全为0
struct student abc = {"泾弦安全",1,"男","1000000000000000"};//按照结构体中的顺序赋值
}
结构体成员的访问
语法:
typedef struct student {
char name[100];
int age;
char gender[100];
char number[100];
} Stu;
void main()
{
Stu aaa = {0};
struct student abc = {"xxx",1,"x","xxxx"};
printf("%s:namen",abc.name);
printf("%d:agen",abc.age);
printf("%s:gendern",abc.gender);
printf("%s:numbern",abc.number);
}
例子
typedef struct student {
char name[100];
int age;
char gender[100];
char number[100];
} Stu;
void main()
{
Stu aaa = {0};
struct student abc = {"泾弦安全",1,"男","1000000000000000"};//按照结构体中的顺序赋值
printf("%s:namen",abc.name);
printf("%d:agen",abc.age);
printf("%s:gendern",abc.gender);
printf("%s:numbern",abc.number);
//打印结果;
泾弦安全
1
男
1000000000000000
}
结构体成员的类型
语法:
struct Student
{
char name[20];
int age;
char sex[10];
char id[20];
};
struct School
{
char school_name[30];
struct Stu s;
char* pc;
};
int main()
{
char arr[] = "xxn";
struct School abc = { "xxxx", {"xx", 18, "x", "xxxx"}, arr };
printf("学校 - 名字:%sn", abx.school_name);
printf("学生 - 姓名:%sn", JLD.s.name);
printf("年龄:%dn", JLD.s.age);
printf("性别:%sn", JLD.s.sex);
printf("学号:%sn", JLD.s.id);
printf("地址 - %sn", abx.pc);
return 0;
}
例子:
struct Student
{
char name[20];
int age;
char sex[10];
char id[20];
};
struct School
{
char school_name[30];
struct Stu s; //可以嵌套其他结构
char* pc;//定义指针
};
int main()
{
char arr[] = "泾弦大厦n";
struct School abc = { "泾弦安全", {"TZ", 18, "男", "0001"}, arr };//其中的大括号就是给嵌套的结构体赋值
printf("学校 - 名字:%sn", abx.school_name);
printf("学生 - 姓名:%sn", abc.s.name);
printf("年龄:%dn", abc.s.age);
printf("性别:%sn", abc.s.sex);
printf("学号:%sn", abc.s.id);
printf("地址 - %sn", abc.pc);
return 0;
}
使用typedef定义结构类型和结构体指针类型的别名
语法:
typedef struct person
{
char *name;
int age;
char score;
} inform, *Pform;
例子:
typedef struct Student
{
char *name;
int age;
char score;
}inform, *Pform;
void main()
{
Pform abc; // 使用 Pform 作为 inform 结构体的指针类型
abc = (Pform)malloc(sizeof(inform)); // 分配内存
if (abc != NULL) {
abc->name = "John Doe"; // 赋值
abc->age = 20;
abc->sex = 'M'; // 假设 'M' 代表男性,'F' 代表女性
}
// 打印信息
printf("姓名: %sn", abc->name);
printf("年龄: %dn", abc->age);
printf("性别: %cn", abc->sex);
free(abc); // 释放内存
}
终端对抗技术讲解
动态调用
为什么需要使用动态调用,是因为我们在代码使用的API函数都会在程序的导出表中记录,为了规避杀毒软件的静态查杀而使用的到的。
这里可以看到第一个函数就是VirtualAlloc,这里我们就需要使用动态调用的方式去隐藏函数
这就是使用动态调用的代码(注意这里使用了loadlibrary这类函数,实际我们也需要隐藏,但是会用到其他方法),我们成功打印了我们需要的内容。
我们在来查看的时候发现以及没有VirtualAlloc函数了,以此类推这样的方法也可以隐藏其他函数
原文始发于微信公众号(泾弦安全):免杀对抗从0开始(三)
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论