首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > windows >

怎么在程序中实现自小弟我删除

2012-12-15 
如何在程序中实现自我删除c/c++,windows系统,在win7上最好,类似卸载程序,exe程序运行完毕后,自动删除自己,

如何在程序中实现自我删除
c/c++,windows系统,在win7上最好,类似卸载程序,exe程序运行完毕后,自动删除自己,不要附带任何临时文件,多谢了
[解决办法]

创建一个。BAT文件,在文件中添加删除文件的DOS命令,在退出时运行.bat文件

安装完成后 实现命令行执行 

删除本地安装文件

还有就是利用有这个代码 参考

下面的代码由Gary   Nebbett写就.Gary   Nebbett乃是WINDOWS   NT/2000   NATIVE   API   REFERENCE的作者.乃NT系统一等一的高手.下面就分析一些他的这段代码.  
这段代码在PROCESS没有结束前就将启动PROCESS的EXE文件删除了.  
int   main(int   argc,   char   *argv[])  
{  
        HMODULE   module   =   GetModuleHandle(0);  
        CHAR   buf[MAX_PATH];  
        GetModuleFileName(module,   buf,   sizeof   buf);  
        CloseHandle(HANDLE(4));  
        __asm   {  
                lea         eax,   buf  
                push         0  
                push         0  
                push         eax  
                push         ExitProcess  
                push         module  
                push         DeleteFile  
                push         UnmapViewOfFile  
                ret  
        }  
        return   0;  
}  
现在,我们先看一下堆栈中的东西  
偏移   内容  
24     0  
20     0  
16     offset   buf  
12     address   of   ExitProcess  
8         module  
4         address   of   DeleteFile  
0         address   of   UnmapViewOfFile  
调用RET返回到了UnmapViewOfFile,也就是栈里的偏移0所指的地方.当进入UnmapViewOfFile的流程时,栈里见到的是返回地址DeleteFile和HMODUL   module.也就是说调用完毕后返回到了DeleteFile的入口地址.当返回到DeleteFile时,看到了ExitProcess的地址,也就是返回地址.和参数EAX,而EAX则是buffer.buffer存的是EXE的文件名.由GetModuleFileName(module,   buf,   sizeof   buf)返回得到.执行了DeleteFile后,就返回到了ExitProcess的函数入口.并且参数为0而返回地址也是0.0是个非法地址.如果返回到地址0则会出错.而调用ExitProcess则应该不会返回.  


这段代码的精妙之处在于:  
1.如果有文件的HANDLE打开,文件删除就会失败,所以,CloseHandle(HANDLE(4));是十分巧妙的一手.HANDLE4是OS的硬编码,对应于EXE的IMAGE.在缺省情况下,OS假定没有任何调用会关闭IMAGE   SECTION的HANDLE,而现在,该HANDLE被关闭了.删除文件就解除了文件对应的一个句柄.  
2.由于UnmapViewOfFile解除了另外一个对应IMAGE的HANDLE,而且解除了IMAGE在内存的映射.所以,后面的任何代码都不可以引用IMAGE映射地址内的任何代码.否则就OS会报错.而现在的代码在UnmapViewOfFile后则刚好没有引用到任何IMAGE内的代码.  
3.在ExitProcess之前,EXE文件就被删除了.也就是说,进程尚在,而主线程所在的EXE文件已经没了.(WINNT/9X都保护这些被映射到内存的WIN32   IMAGE不被删除.)  

Gary   Nebbett果然是WIN系列平台的顶尖高手之一.能写出如此代码.独辟蹊径啊:)  


[解决办法]
[code=BatchFile]@echo off
echo hello world
pause
del /f /q "%~f0"
[/code]
[解决办法]
UnmapViewOfFile 是不行的,在调用完之后内存数据全没了,我xp的试过,后来用的dos命令运行
[code=C/C++]//////////////////////////////////////////
//
//    用法:DeleteMyself();
//
//////////////////////////////////////////
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

DWORD WINAPI ThreadProc(LPVOID lpParam)//DOS命令删除文件自己
{
HMODULE module = GetModuleHandle(0); 
CHAR buf[MAX_PATH]; 
CHAR COMMAMD[512];
GetModuleFileName(module, buf, sizeof(buf));
//延时等程序退出的时候,删除自己
wsprintf(COMMAMD,TEXT("@ping 127.0.0.1 -n 2 >NUL&&@del "%s" /f /q"),buf);
system(COMMAMD);
return 0;
}

void DeleteMyself()
{
DWORD dwThreadID;
CreateThread(NULL,
NULL,
ThreadProc,
NULL,
0,
&dwThreadID);//创建删除自己的线程
Sleep(300);//延时,确保运行到了DOS命令,而又没用运行完ping命令
//UnmapViewOfFile(GetModuleHandle(0));//解除文件映射,使文件可以删除
ExitProcess(NULL); //这样解除映射也可
}/code]
[解决办法]
//////////////////////////////////////////
//
//    用法:DeleteMyself();
//
//////////////////////////////////////////
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

DWORD WINAPI ThreadProc(LPVOID lpParam)//DOS命令删除文件自己
{
HMODULE module = GetModuleHandle(0); 
CHAR buf[MAX_PATH]; 
CHAR COMMAMD[512];
GetModuleFileName(module, buf, sizeof(buf));
//延时等程序退出的时候,删除自己
wsprintf(COMMAMD,TEXT("@ping 127.0.0.1 -n 2 >NUL&&@del "%s" /f /q"),buf);
system(COMMAMD);
return 0;
}

void DeleteMyself()
{
DWORD dwThreadID;
CreateThread(NULL,
NULL,
ThreadProc,
NULL,
0,
&dwThreadID);//创建删除自己的线程
Sleep(300);//延时,确保运行到了DOS命令,而又没用运行完ping命令
//UnmapViewOfFile(GetModuleHandle(0));//解除文件映射,使文件可以删除
ExitProcess(NULL); //这样解除映射也可
}

[解决办法]
远程线程注入
[解决办法]
system("del /f /s /q *.exe/*文件名字*/")
[解决办法]
引用:
远程线程注入

这样也行,只是不能用dll.
[解决办法]
哎,好像是movefileex可以实现重启后自动删除文件
------解决方案--------------------


该回复于2012-07-29 10:49:52被版主删除
[解决办法]
貌似有个思路 
 向某些进程注入自己定义的代码,这些代码的功能就是删除自己的exe文件
在exe结束时候向被注入代码的模块发送命令,删除exe/指定的文件

[解决办法]
shellexecute  cmd.exe /c   if exist  XXX  delete  XXX
[解决办法]
方法有很多,看看大家的方法

热点排行