鱼C论坛

 找回密码
 立即注册
查看: 2778|回复: 1

[技术交流] 文件粉碎机

[复制链接]
发表于 2018-5-6 11:28:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
小弟最近学习了WindowsSDK程序设计,学到了文件操作部分,想复习一下之前的知识,
这个文件粉碎机是一个2.0版本,1.0版本的文件粉碎机不人性化,要是想删除运行中的快捷方式的话还要让用户手动输入快捷方式所指向的真正的目标路径的文件名,所以2.0版本小弟还从网上查资料找到了一个IShellLink中的GetPath,来进行寻找目标的绝对地址,然后再分割出来进程中的名字。

主要思路就是一个文件的删除函数DeleteFile的应用,要是无法恢复数据的删除就要进行对要删除的文件进行覆写,程序中是覆写三遍,要是有快捷方式或者是exe运行的情况下就要先kill掉进程,然后再删除。

这个是一个CUI,有点丑陋,但是小弟花了一晚上写1.0,然后花了一上午写2.0,要是有bug希望指出,同时小弟的水平还有待提高,希望大神们多多指正

运行程序是一个C++文件,因为里面有个函数是获取快捷方式目标的绝对地址的,同时在设置项目属性的时候要选择多字符集
  1. [hide]#include <windows.h>
  2. #include <tlhelp32.h>
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5. #include <ShlObj.h>                        //其中含有获取快捷方式路径的函数
  6. #include <sys/stat.h>                //获取文件相关操作的一些函数


  7. //获取快捷方式的目标路径
  8. BOOL GetShellPath(CHAR *src, CHAR *ShellPath){
  9.         BOOL bRet = FALSE;

  10.         CoInitialize(NULL); //初始化com接口
  11.         IShellLink *psl = NULL;

  12.         //创建COM接口,IShellLink对象创建
  13.         HRESULT hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*)&psl);

  14.         if (SUCCEEDED(hr)){
  15.                 IPersistFile *ppf;
  16.                 hr = psl->QueryInterface(IID_IPersistFile, (LPVOID*)&ppf);
  17.                 if (SUCCEEDED(hr)){
  18.                         WCHAR wsz[MAX_PATH] = { 0 };
  19.                         MultiByteToWideChar(CP_ACP, 0, src, -1, wsz, MAX_PATH);
  20.                         hr = ppf->Load(wsz, STGM_READ);//加载文件
  21.                         if (SUCCEEDED(hr)){
  22.                                 WIN32_FIND_DATA wfd;
  23.                                 psl->GetPath(ShellPath, MAX_PATH, (WIN32_FIND_DATA*)&wfd, SLGP_SHORTPATH);     //获取目标路径

  24.                                 bRet = TRUE;
  25.                         }
  26.                         ppf->Release();
  27.                 }
  28.                 psl->Release();
  29.         }
  30.         CoUninitialize();
  31.         return bRet;
  32. }

  33. void GetProcessFileName(CHAR *szShellPath, CHAR *szTargetExeFile){
  34.         CHAR szExtension[MAX_PATH];                //文件后缀
  35.         CHAR szFileName[MAX_PATH];                //文件名称

  36.         _splitpath(szShellPath, NULL, NULL, szFileName, szExtension);
  37.         lstrcat(szTargetExeFile, szFileName);
  38.         lstrcat(szTargetExeFile, szExtension);
  39.         //这样就获取到了进程中的要删除快捷方式对应的进程名字
  40.         printf("\n\n\n%s\n\n\n", szTargetExeFile);
  41. }



  42. DWORD GetProcessID(LPSTR szProcessName){
  43.         DWORD dwProcessId = 0;                // 用于记录进程的ID号
  44.         PROCESSENTRY32 pe32;
  45.         pe32.dwSize = sizeof(pe32);

  46.         HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  47.         if (hProcessSnap == INVALID_HANDLE_VALUE){
  48.                 printf("CreateToolhelp32Snapshot调用失败:%d\n", GetLastError());
  49.                 return -1;
  50.         }
  51.         else{
  52.                 BOOL bMore = Process32First(hProcessSnap, &pe32);
  53.                 while (bMore){
  54.                         if (lstrcmp(pe32.szExeFile, szProcessName) == 0){
  55.                                 dwProcessId = pe32.th32ProcessID;
  56.                         }
  57.                         bMore = Process32Next(hProcessSnap, &pe32);
  58.                 }
  59.                 CloseHandle(hProcessSnap);
  60.         }
  61.         return dwProcessId;
  62. }


  63. DWORD KillProcess(LPSTR szProcessName){
  64.         if (GetProcessID(szProcessName) != 0){                //判断进程是否存在
  65.                 HANDLE hProcessToKill = OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetProcessID(szProcessName));
  66.                 if (hProcessToKill){
  67.                         TerminateProcess(hProcessToKill, 0);
  68.                 }
  69.                 CloseHandle(hProcessToKill);
  70.         }
  71.         return 0;
  72. }


  73. DWORD DeleteTargetFile(LPSTR szDeleteFile){
  74.         DWORD dwChoose = MessageBox(NULL,
  75.                 TEXT("请问是否要完全清除数据,用专业恢复数据软件也没有办法恢复!"),
  76.                 TEXT("警告"),
  77.                 MB_OKCANCEL | MB_ICONEXCLAMATION);


  78.         if (dwChoose == IDOK){
  79.                 CHAR *buffer[1280] = { "这个文件恢复不了成原先的状态",
  80.                         "数据无价,早知今日,何必当初",
  81.                         "西瓜,苹果,香蕉,菠萝" };

  82.                 HANDLE hFileWrite = CreateFile(szDeleteFile,
  83.                         GENERIC_WRITE,
  84.                         0,
  85.                         NULL,
  86.                         OPEN_ALWAYS,
  87.                         FILE_ATTRIBUTE_NORMAL,
  88.                         NULL);

  89.                 if (hFileWrite == INVALID_HANDLE_VALUE){
  90.                         printf("文件写入句柄创建错误:%d\n", GetLastError());
  91.                         return -1;
  92.                 }

  93.                 DWORD dwWriteDataSize;

  94.                 for (int i = 0; i < 3; i++){
  95.                         printf("进行第%d次覆写\n", i + 1);
  96.                         if (!WriteFile(hFileWrite, buffer[i], lstrlen(buffer[i]), &dwWriteDataSize, NULL)){
  97.                                 printf("写入失败:%d\n", GetLastError());
  98.                                 return -1;
  99.                         }
  100.                         else{
  101.                                 printf("写入%d字节\n", dwWriteDataSize);
  102.                         }
  103.                 }
  104.                 CloseHandle(hFileWrite);                //关闭写入文件的句柄
  105.                 DeleteFile(szDeleteFile);                //删除文件
  106.                 MessageBox(NULL, "彻底删除文件成功", "提示", MB_OK);
  107.         }
  108.         else{
  109.                 if (MessageBox(NULL,
  110.                         "这个数据是可以日后依靠专业的数据恢复软件进行恢复的,但是会直接从您的电脑上删除,不放入回收站,是否继续?",
  111.                         "提示",
  112.                         MB_OKCANCEL | MB_ICONQUESTION) == IDOK){
  113.                         DeleteFile(szDeleteFile);
  114.                         MessageBox(NULL, "删除成功", "提示", MB_OK);
  115.                 }
  116.         }
  117.         return 0;
  118. }



  119. int main(int argc, char *argv[]){
  120.         CHAR* szDeleteFile = (CHAR*)malloc(sizeof(CHAR)*MAX_PATH);
  121.         DWORD dwChoose = MessageBox(NULL, "请问您删除的是快捷方式或者.exe文件么", "提示", MB_OKCANCEL | MB_ICONQUESTION);
  122.         if (dwChoose == IDOK){                                                                                //如果是快捷方式或者.exe文件
  123.                 if (MessageBox(NULL, "请问您要删除的是快捷方式么?", "提示", MB_OKCANCEL | MB_ICONQUESTION) == IDOK){
  124.                         printf("请输入您要删除的快捷方式的绝对路径:");
  125.                         scanf("%s", szDeleteFile);
  126.                         CHAR* szShellPath = (CHAR*)malloc(sizeof(CHAR)*MAX_PATH);
  127.                         if (GetShellPath(szDeleteFile, szShellPath)){                //获取快捷方式对应的目标路径
  128.                                 CHAR* szTargetExeFile = (CHAR*)malloc(sizeof(CHAR)*MAX_PATH);
  129.                                 lstrcpy(szTargetExeFile, "");
  130.                                 GetProcessFileName(szShellPath, szTargetExeFile);
  131.                                 KillProcess(szTargetExeFile);                                        //终止要删除的文件的进程
  132.                                 DeleteTargetFile(szDeleteFile);                                        //删除快捷方式

  133.                                 //释放内存
  134.                                 free(szTargetExeFile);
  135.                                 free(szShellPath);
  136.                                 free(szDeleteFile);
  137.                         }
  138.                 }
  139.                 else{

  140.                         CHAR* szTargetExeFile = (CHAR*)malloc(sizeof(CHAR)*MAX_PATH);
  141.                         lstrcpy(szTargetExeFile, "");
  142.                         printf("请输入您要删除.exe文件的绝对路径:");
  143.                         scanf("%s", szDeleteFile);

  144.                         GetProcessFileName(szDeleteFile, szTargetExeFile);
  145.                         KillProcess(szTargetExeFile);                        //终止进程
  146.                         DeleteTargetFile(szDeleteFile);
  147.                         free(szDeleteFile);
  148.                         free(szTargetExeFile);
  149.                 }
  150.         }
  151.         else{
  152.                 printf("请输入您要删除文件的绝对路径:");
  153.                 scanf("%s", szDeleteFile);
  154.                 DeleteTargetFile(szDeleteFile);
  155.         }
  156.         return 0;
  157. }





  158. [/hide]
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-5-6 12:06:14 | 显示全部楼层
whx2008 发表于 2018-5-6 11:47
你那个是怎么回事?应该是这样写的:
注:为了防止真的隐藏,我在外面弄了一个代码形式。

我也不知道怎么弄那个隐藏,下次还是不搞这个了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-28 21:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表