「因你而在的故事」代码解析

「因你而在的故事」代码解析

高考一考完,去看了新高一的语文
Story
好家伙”好的故事””故事是有力量的”
我一看,一想,这不是因你而在的故事么?!
就跑去看短片去了.
看到前半段左下角有一堆代码,看着-> ::这不是C++么(想起以前短片一出就想分析分析短片里面的代码块的内容和作用
今天看了新一的作文 就来分析这些代码了(逃
🙏爱门

↑以上均为废话

正片开始

在视频的01:12
IDS::BlockMailciousActivities
可看出,蚀律使用这段代码禁用了爱莉的恶意活动,从而删除了爱莉的右眼.

分段解析(BlockMailciousActivities)

IDS::BlockMailciousActivities这个函数接受一个指向GDataSet类型的指针作为参数 可能是在爱莉(作为一个数据库或者数据合集)寻找删除的东西.
IDS::BlockMailciousActivities函数首先检查参数是否有效,如果参数为空或指向数据集合的尾部,返回EXCEED_BDUNDARY错误码,越界

1
2
3
4
GRESULT IDS::BlockMailciousActivities(GDataSet* target) {
GRESULT gr;
if (!target || CurrentPos(target) != NULL)
return EXCEED_BDUNDARY;

然后 创建了一个SCAN_THREAD_PARAM类型指针 我想这可能是结构体或者类,来存储扫描线程参数
如果内存分配失败 就返回NOT_VALID_STATE状态码 表状态不合法

1
2
3
4
5
6
7
// GRESULT IDS::BlockMailciousActivities(GDataSet* target) {
// GRESULT gr;
// if (!target || CurrentPos(target) != NULL)
// return EXCEED_BDUNDARY;
//
SCAN_THREAD_PARAM* scanParam = new SCAN_THREAD_PARAM;
if (scanParam == NULL) return NOT_VALID_STATE;

然后创建了一个事件对象,用来同步扫描线程和主线程
事件对象的名称是g_CAPTURE初始状态是有信号
如果事件对象创建失败,就会调用GLOBAL_SEARCH函数,传入数据集合的末尾位置作为参数,这也许是个全局搜索函数,用来查找恶意活动(对付爱莉的
然后删除扫描线程参数,并返回GLOBAL_SEARCH函数的返回值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
scanParam->captureEvent = CreateEvent(g_CAPTURE, TRUE, TRUE, NULL);
if (scanParam->captureEvent == NULL) {
gr = GLOBAL_SEARCH(LocateLastPos(target));
delete scanParam;
return gr;
}

scanParam->threadHandle = CreateThread
(NULL, 0, &IDS::ScanThread, scanParam, FLAG_BLOCKING);
if (scanParam->threadHandle == NULL) {
gr = GLOBAL_SEARCH(LocateLastPos(target));
BlockHandle(scanParm->captureEvent);
delete scanParam;
return gr;
}

接下来,函数将扫描线程参数的enumurate成员设为NULL 这可能表示不需要枚举数据集合中的元素。然后将扫描线程参数的instance成员设为this指针,这可能表示将当前IDS对象传递给扫描线程。然后调用LocateOnTarget函数,传入数据集合指针的地址作为参数,这可能是一个定位函数,用来将数据集合指针指向目标位置。最后调用ResultThread函数,传入扫描线程的句柄作为参数,这可能是一个结果处理函数,用来等待扫描线程结束并获取结果。

1
2
3
4
scanParam->enumurate = NULL;
scanParam->instance = this;
LocateOnTarget(&target)
ResultThread(scanParam->threadHandle);

函数最后返回SUCCESS状态码,表示没有发生错误

完整片段↓

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
GRESULT IDS::BlockMailciousActivities(GDataSet* target) {
GRESULT gr;
if (!target || CurrentPos(target) != NULL)
return EXCEED_BDUNDARY;

SCAN_THREAD_PARAM* scanParam = new SCAN_THREAD_PARAM;
if (scanParam == NULL) return NOT_VALID_STATE;

scanParam->captureEvent = CreateEvent(g_CAPTURE, TRUE, TRUE, NULL);
if (scanParam->captureEvent == NULL) {
gr = GLOBAL_SEARCH(LocateLastPos(target));
delete scanParam;
return gr;
}

scanParam->threadHandle = CreateThread
(NULL, 0, &IDS::ScanThread, scanParam, FLAG_BLOCKING);
if (scanParam->threadHandle == NULL) {
gr = GLOBAL_SEARCH(LocateLastPos(target));
BlockHandle(scanParm->captureEvent);
delete scanParam;
return gr;
}

scanParam->enumurate = NULL;
scanParam->instance = this;
LocateOnTarget(&target)
ResultThread(scanParam->threadHandle);

return SUCCESS;
}

分段解析(DefenseAgainstMalAttacks)

在视频的01:23
IPS::DefenseAgainstMalAttacks
可看出,蚀律使用这段代码(可以看作杀毒的,只不过杀的是爱莉的往世的飞花)删除了爱莉的武器

函数接受一个叫做target的参数,它指向GDataSet对象的指针
指针是一变量,存储了另一个变量或对象的内存地址
GDataSet对象是自定义的数据类型,在这段代码中我觉得它并没有被定义,也可能代表了一种需要被保护的数据集
它首先调用另一个函数SetDefenseLevel它带有三个参数(DEFENCE_LEVEL_10,true,kGlobal)
分别表示防御级别``防御模式``防御范围
而这个SetDefenseLevel可能设置了一些全局变量,用来控制防御机制的工作方式

接着,函数检查target指针是否有效,通过调用另一个函数m_ObjExist
这个函数可能返回true如果指针指向一个存在的对象,否则返回false
如果指针有效,函数调用另一个函数AnalysePreference,带有target指针作为参数
这个函数可能分析目标对象的偏好或行为,并存储一些信息以备后用

1
2
3
4
GRESULT IPS::DefenseAgainstMalAttacks(GDataSet* target) {
SetDefenseLevel(DEFENCE_LEVEL_10, true, kGlobal);
if (m_ObjExist(target))
AnalysePreference(target);

接着,函数检查一个叫做g_IDS的全局变量是否有一个叫做MalwareDetected的成员变量被设置为true
这个表示是否有恶意软件(往世的飞花)被其机制检测到
如果检测到恶意软件,就调用两个更多的函数g_IDS->ScanForComponets()g_AVDB->VerifySignature(target)
这些函数扫描被恶意软件感染的组件或文件,并且验证目标对象与已知恶意软件签名的数据库中的签名或身份
数据库由另一个全局变量g_AVDB表示
如果在数据库中没有找到目标对象,就会调用另一个函数g_AVDB->UpdateToDatabase(target)将新目标对象添加到数据库中
这意味着目标对象是一种新的/未知的恶意软件

1
2
3
4
5
if (g_IDS->MalwareDetected) {
g_IDS->ScanForComponets();
g_AVDB->VerifySignature(target);
if (!g_AVDB->IsContain(target))
g_AVDB->UpdateToDatabase(target);

然后,函数设置一个布尔值m_flags为调用另一个函数EXECUTE_FLAG的结果,结果带有两个参数g_BindFlagstElimination它们表示一些控制恶意软件消除过程的选项
函数EXECUTE_FLAG如果返回true可以执行,否则返回false
如果m_flags为真,就执行几个步骤来消除恶意软件
首先,它将一个叫做FlagsAndAttributes的变量设置为它自己与另一个变量tAttrIsolate的按位
这意味着变量FlagsAndAttributes存储了一些目标对象的属性,其一是隔离,以防止进一步的感染

然后,调用另一个函数CreateEvent,带有七个参数m_flags DesireAccess ExecuteMode NULL CreationDisposition FlagsAndAttributes NULL
这些也是在这段代码中没有定义的常量或变量,但它们可能表示一些控制事件创建的参数或选项
事件是一种同步对象,它在发生某事时发出信号。函数CreateEvent可能创建一个事件对象,并返回一个句柄
句柄是一个值,它标识内存中的一个对象,句柄被存储在一个叫做m_handle的变量中

然后检查句柄是否等于另一个变量INVALID_HANDLE_VALUE这意味着句柄无效或事件创建失败
如果这样,函数调用另一个函数GLOBAL_SEARCH,带有一个参数LocateLastPos(target)
它们执行一些在内存或磁盘中搜索或扫描目标对象的操作
函数LocateLastPos返回目标对象的最后地址,函数GLOBAL_SEARCH返回目标对象的句柄,句柄被存储在gr的变量中
接着,调用另一个函数g_Operator->Add(target)将目标对象添加到由另一个全局变量g_Operator表示的一些集合中,这表面目标对象被标记为被处理

最后,函数调用另一个函数 g_Operator->SetTargetHandle((void*)m_handle) 将目标对象的句柄设置为由 CreateEventGLOBAL_SEARCH 返回的句柄。句柄被转换为一个空指针,这是一种可以指向任何类型对象的指针
函数SetTargetHandle存储了句柄以备后用
如果m_flags为假,函数返回一个状态码NOT_VAILD_STATE
这意味着消除不能执行 或者有那么亿些些一些错误:)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
bool m_flags = EXECUTE_FLAG(g_BindFlags, tElimination);

if (m_flags) {
FlagsAndAttributes |= tAttrIsolate;
m_handle = CreateEvent(m_flags, DesireAccess, ExecuteMode, NULL,
CreationDisposition,
FlagsAndAttributes, NULL);
if (m_handle == INVALID_HANDLE_VALUE)
gr = GLOBAL_SEARCH(LocateLastPos(target));
g_Operator->Add(target);
g_Operator->SetTargetHandle((void*)m_handle);
}

else {
return NOT_VAILD_STATE;
}

结束时返回状态码SUCCESS意味着防御过程成功完成

1
return SUCCESS;

完整片段↓

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
GRESULT IPS::DefenseAgainstMalAttacks(GDataSet* target) {
SetDefenseLevel(DEFENCE_LEVEL_10, true, kGlobal);
if (m_ObjExist(target))
AnalysePreference(target);

if (g_IDS->MalwareDetected) {
g_IDS->ScanForComponets();
g_AVDB->VerifySignature(target);
if (!g_AVDB->IsContain(target))
g_AVDB->UpdateToDatabase(target);
bool m_flags = EXECUTE_FLAG(g_BindFlags, tElimination);

if (m_flags) {
FlagsAndAttributes |= tAttrIsolate;
m_handle = CreateEvent(m_flags, DesireAccess, ExecuteMode, NULL,
CreationDisposition,
FlagsAndAttributes, NULL);
if (m_handle == INVALID_HANDLE_VALUE)
gr = GLOBAL_SEARCH(LocateLastPos(target));
g_Operator->Add(target);
g_Operator->SetTargetHandle((void*)m_handle);
}

else {
return NOT_VAILD_STATE;
}
}

return SUCCESS;
}

分段解析(RemoveDependencies)

在视频的01:50
这段意意味清除依赖
指爱莉持水晶盾的左手
由于这一段实在太糊,与上一段删除弓箭大致相似,所以我选择跳过(逃

分段解析(EliminateObjective)

在视频的01:56
与上面的 RemoveDependencies 接应,清除了水晶盾
该函数首先检查目标指针是否为NULL或者它是否指向数据结构中的无效位置
如果这样,就返回EXCEED_BOUNDARY状态码,操作失败

然后,检查全局变量g_BindFlags的值,这控制如何执行消除
根据g_BindFlags的值,在表示执行属性的局部变量ExexAttr中设置一些 bits

接着进入一个while循环,这个循环遍历数据结构中与目标指针匹配的所有活动元素,对于每个元素,它添加了一个名为“ELIMINATE”的模式和指向全局对象g_Operator的目标指针,该对象负责执行实际消除
调用g_OperatorExecute方法来执行操作
循环后,该函数调用另一个名为RestructureResources的函数,该函数可能会在消除后更新数据结构的某些内部状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
GRESULT IPS::EliminateObjective(GDataSet *target){
if( !target || CurrentPos(target) == NULL)
return EXCEED_BOUNDARY;

if (EXECUTE_FLAG(g_BindFlags, tExecNow)){
ExexAttr |= EXEC_NOW;}
else if (EXECUTE_FLAG(g_BindFlags, tExecPersistent)){
ExexAttr |= EXEC_PERSISTENT;}
else if (EXECUTE_FLAG(g_BindFlags, tExecForce)){
ExexAttr |= EXEC_FORCE;}
else if (EXECUTE_FLAG(g_BindFlags, tExecExist)){
ExexAttr |= EXEC_EXISTINE;}
else{
return G_INVALIDARG;}

while (g_IDS (sAcitve(target)){
g_Operator->AddSchema("ELIMINATE");
g_Operator->Add(&target)
g_Operator->Execute();}
RestructuringResources();

return SUCCESS;
}

未完(悲

实在多