QQ登录

只需一步,快速开始

登录 | 立即注册 | 找回密码

主题

帖子

荣誉

鱼友Ⅲ

Rank: 4Rank: 4

积分
303
查看: 204|回复: 2

[技术交流] 文件粉碎机

[复制链接]
最佳答案
10 
累计签到:69 天
连续签到:16 天
溯影 发表于 2018-5-6 11:28:12 2042 | 显示全部楼层 |阅读模式

马上注册加入鱼C,享用更多服务吧^_^

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

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]
复制代码
楼层
跳转到指定楼层
头像被屏蔽
最佳答案
3 
累计签到:17 天
连续签到:1 天
whx2008 发表于 2018-5-6 11:47:45 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
最佳答案
10 
累计签到:69 天
连续签到:16 天
溯影  楼主| 发表于 2018-5-6 12:06:14 | 显示全部楼层
whx2008 发表于 2018-5-6 11:47
你那个是怎么回事?应该是这样写的:
注:为了防止真的隐藏,我在外面弄了一个代码形式。

我也不知道怎么弄那个隐藏,下次还是不搞这个了

发表回复

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

本版积分规则

关闭

小甲鱼强烈推荐 上一条 /1 下一条

    移动客户端下载(未启用)
    微信公众号

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备11014136号

Copyright 2018 鱼C论坛 版权所有 All Rights Reserved.

Powered by Discuz! X3.1 Copyright
© 2001-2018 Comsenz Inc.    All Rights Reserved.

小黑屋|手机版|Archiver|鱼C工作室 ( 粤公网安备 44051102000370号 | 粤ICP备11014136号

GMT+8, 2018-5-24 06:38

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