`
thecloud
  • 浏览: 880529 次
文章分类
社区版块
存档分类
最新评论

一种巧妙的删除程序自己的方法

 
阅读更多
大家都知道,一般的程序运行的时候,可执行文件本身是被操作系统保护的,不能用改写的方式访问,更别提在本身还在运行的时侯删除自己了。在Lu0的主页上看到一种UNDOCUMENT的方法,通过改变系统底层的文件访问模式实现删除自己,那是实在功夫。我看 了很是佩服。但是有没有一种用在MSDN上就能查到的函数实现呢?有!Jeffrey Richter给我们做了一个范例:
 
DeleteMe.CPP
 
Module name: DeleteMe.cpp
Written by: Jeffrey Richter
Description: Allows an EXEcutable file to delete itself
**************************************************/
 
#include <windows.h><br>#include <stdlib.h><br>#include <tchar.h><br> <br>/////////////////////////////////////////////////<br> <br>int WINAPI WinMain(HINSTANCE h, HINSTANCE b, LPSTR psz, int n) {<br>  <br>// Is this the Original EXE or the clone EXE?<br>// If the command-line 1 argument, this is the Original EXE<br>// If the command-line &gt;1 argument, this is the clone EXE<br> <br>if (__argc == 1) {<br> <br>// Original EXE: Spawn clone EXE to delete this EXE<br>// Copy this EXEcutable image into the user's temp directory<br> <br>TCHAR szPathOrig[_MAX_PATH], szPathClone[_MAX_PATH];<br>GetModuleFileName(NULL, szPathOrig, _MAX_PATH);<br>GetTempPath(_MAX_PATH, szPathClone);<br>GetTempFileName(szPathClone, __TEXT("Del"), 0, szPathClone);<br>CopyFile(szPathOrig, szPathClone, FALSE);<br> <br>//***注意了***:<br>// Open the clone EXE using FILE_FLAG_DELETE_ON_CLOSE<br>HANDLE hfile = CreateFile(szPathClone, 0, FILE_SHARE_READ, NULL, OPEN_EXISTI<br>NG, FILE_FLAG_DELETE_ON_CLOSE, NULL);<br> <br>// Spawn the clone EXE passing it our EXE's process handle<br>// and the full path name to the Original EXE file.<br>TCHAR szCmdLine[512];<br>HANDLE hProcessOrig = OpenProcess(SYNCHRONIZE, TRUE, GetCurrentProcessId());<br><br>wsprintf(szCmdLine, __TEXT("%s %d /"%s/""), szPathClone, hProcessOrig, szPat<br>hOrig);<br>STARTUPINFO si;<br>ZeroMemory(&amp;si, sizeof(si));<br>si.cb = sizeof(si);<br>PROCESS_INFORMATION pi;<br>CreateProcess(NULL, szCmdLine, NULL, NULL, TRUE, 0, NULL, NULL, &amp;si, &amp;pi);<br>CloseHandle(hProcessOrig);<br>CloseHandle(hfile);<br> <br>// This original process can now terminate.<br>} else {<br> <br>// Clone EXE: When original EXE terminates, delete it<br>HANDLE hProcessOrig = (HANDLE) _ttoi(__targv[1]);<br>WaitForSingleObject(hProcessOrig, INFINITE);<br>CloseHandle(hProcessOrig);<br>DeleteFile(__targv[2]);<br>// Insert code here to remove the subdirectory too (if desired).<br> <br>// The system will delete the clone EXE automatically<br>// because it was opened with FILE_FLAG_DELETE_ON_CLOSE<br>}<br>return(0);<br>}<br> <br>看懂了吗?<br> <br>这一段程序思路很简单:不是不能在运行时直接删除本身吗?好,那么程序先复制(CLONE)一个自己,用复制品起动另一个进程,然后自己结束运行,则原来的EXE文件不被系统保护.这时由新进程作为杀手删除原来的EXE文件,并且继续完成程序其他的功能。<br><br> <br>新进程在运行结束后,复制品被自动删除。这又是值得介绍的一个把戏了,注意: <br>// Open the clone EXE using FILE_FLAG_DELETE_ON_CLOSE<br>HANDLE hfile = CreateFile(szPathClone, 0, FILE_SHARE_READ, NULL,OPEN_EXISTIN<br>G, FILE_FLAG_DELETE_ON_CLOSE, NULL);<br>这里面的FILE_FLAG_DELETE_ON_CLOSE标志,这个标志是告诉操作系统,当和这个文件相关的所有句柄都被关闭之后(包括上面这个CREATEFILE创建的句炳),就把这个文件删除。几乎所有的临时文件在创建时,都指明了这个标志。另外要注意的是:在复制品进程对原始程序操刀之前,应该等待原进程退出.在这里用的是进程同步技术.用HANDLE hProcessOrig = OpenProcess(SYNCHRONIZE, TRUE,GetCurrentProcessId());得到原进程句柄.SYNCHRONICE标志在NT下有效,作用是使OpenProcess得到的句柄可以做为同步对象.复制品进程用WaitForSingleObject函数进行同步,然后一个DeleteFile,以及进行其它销毁证据(Jeffrey说:比如删目录)的工作,打完收工!<br> <br>程序是基于CONSOLE的,通过传入的参数确定是原始的进程还是复制品新进程,并且得到需要操作的目标文件的信息(主要是路径),复制品放在系统的TEMP目录(GetTempPath得到),你也可以随便找个你认为安全的地方(比如:WINDOWS/SYSTEM32等等)。这里面没有甚么深的技术.再看其他的一些实现删除自己的例子,比如说在进程退出前,用fwrite等方法输出一个.BAT文件,在里面写几句DEL,然后WINEXEC一下这个BAT文件即可.玩儿过DOS的虫虫大多都会。今天又学一招,爽。<br></tchar.h></stdlib.h></windows.h>
分享到:
评论

相关推荐

    一个与窗体框架、图标、光标、工具栏相关的VC++程序

    VC++的一个窗体程序,通过这个小实例程序将了解到如何修改MFC AppWizard向导生成的框架程序的外观和大小,修改图标、光标、背景的三种方法。如何增加和删除工具栏按钮,如何给应用程序增加工具栏,如何显示和隐藏...

    二十三种设计模式【PDF版】

    者将面向对象的思想巧妙的融合在 Java 的具体技术上,潜移默化的让你感觉到了一种新的语言和新的思想方式的诞生。 但是读完这本书,你对书中这些蕴含的思想也许需要一种更明晰更系统更透彻的了解和掌握,那么你就...

    VC学习大纲 VC学习讲义

    实现多个输入文本框间通过回车逐一向下传递焦点的另一种巧妙方法(用缺省按钮来处理)。利用SetWindowLong和定时器轮回改变窗口的图标。如何实现对话框的部分收缩和展开。如何在主对话框程序启动时立即隐藏对话框的...

    电子密码锁设计报告.docx

    b) LED数码显示程序 LED数码显示器是一种应用很普遍的显示器。程序主要负责把要显示的数字或字母对应的显示码送到相应的LED显示管。有多位需要同时显示时,可以采用动态刷新的方法,就可以得到稳定的输出。循环显示...

    PHP中开发XML应用程序之基础篇 添加节点 删除节点 查询节点 查询节

    一、 XML简介 XML(可扩展的标注语言)是一种W3C标准,主要用于Web应用程序和服务器之间实现容易的交互、数据的存储与使用。 使用XML标准编码的数据具有能容易被人和计算机解释的意义和结构。XML数据是平台和应用程序...

    java实现的仿UNIX操作系统课设

    位图区我是使用一个512byte的数组存放,inode区和磁盘块区我采用一种自认为比较巧妙的方法,就是存放对象列表,之前说过,在本次实验的所有的结构都使用对象进行存储,而inode节点和磁盘块就是两个重要的数据结构,...

    绘画工具 MyPaint 2.0.1 + x64 中文多语版.zip

    MyPaint 是一种灵活,无干扰且易于使用的工具,适用于数字画家。 开源免费绘画工具 MyPaint 中文版开源免费绘画工具 MyPaint 中文版 它支持 Wacom 制造的图形输入板以及许多类似的设备。 它的画笔引擎是通用的...

    你必须知道的495个C语言问题

    2.22 有没有一种自动方法来跟踪联合的哪个域在使用? 枚举 2.23 枚举和一组预处理的#define有什么不同? 2.24 枚举可移植吗? 2.25 有什么显示枚举值符号的容易方法吗? 位域 2.26 一些结构声明中的这些...

    PrimoCache V2.6.0 重置试用期

    一种是在本机原系统上操作,先卸载 再清理残留的文件和注册表信息。 软件卸载会清理绝大部分信息,但是为了记住用户使用时间,肯定得留下记录, 由于是卸载软件,相当于内鬼已走,无人看守,不再是被监控,所以只要...

    《你必须知道的495个C语言问题》

    2.22 有没有一种自动方法来跟踪联合的哪个域在使用? 30 枚举 31 2.23 枚举和一组预处理的#define有什么不同? 31 2.24 枚举可移植吗? 31 2.25 有什么显示枚举值符号的容易方法吗? 31 位域 31 2.26 ...

    C语言FAQ 常见问题列表

    o 3.5 在 C 中是否有模拟继承等面向对象程序设计特性的好方法? o 3.6 我遇到这样声明结构的代码: struct name { int namelen; char namestr[1];}; 然后又使用一些内存分配技巧使 namestr 数组用起来好像有多个...

    jQuery权威指南-源代码

    作为一名从事Web开发多年的工作者,我对每一种新技术的出现与应用都充满了渴望与期待,渴望它能解决现存疑难,进一步提高程序开发的效率;期待它能超越旧俗,引领技术未来的发展方向。近年来,Web开发领域的新技术...

    迅雷7 V7.2.10.3694 正式版 光纤版迅雷

     “迅雷7”提供了一个真正意义上的开发平台,例如:“插件可以在不修改主程序代码的条件下自定义自己的加载逻辑,并且插件可以使用一致的方法调整界面中的任何元素。”  在这个开放、自由的平台上,插件的发挥空间...

    你必须知道的495个C语言问题(PDF)

    2.5 在C 中是否有模拟继承等面向对象程序设计特性的好方法? . . . 7 i 目录ii 2.6 我遇到这样声明结构的代码: struct name f int namelen; char namestr[1];g; 然后又使用一些内存分配技巧使namestr 数组用起 来...

    数据库概论参考答案-NO1.doc

    4、以同一种语法结构提供两种使用方式。SQL语言既是自含式语言,又是嵌入式语言 。作为自含式语言,它能够独立地用于联机交互操作使用方式,用户可以在终端键盘上 直接键入SQL命令对数据库进行操作;作为嵌入式语言...

    数据库概论参考材料规范标准答案.doc

    4、以同一种语法结构提供两种使用方式。SQL语言既是自含式语言,又是嵌入式语言 。作为自含式语言,它能够独立地用于联机交互操作使用方式,用户可以在终端键盘上 直接键入SQL命令对数据库进行操作;作为嵌入式语言...

Global site tag (gtag.js) - Google Analytics