using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Text;namespace DeleteLibrary
{
public class DeleteMe
{
private string DeleteFile; public void Delete(Process DF)
{
DeleteFile = DF.ProcessName + ".exe";
DF.Kill();
File.Delete(DeleteFile);
} }
}如上是我写的一个删除自己(执行程序)的类。在程序退出是调用这个类,先杀死自己再删除自己。
但象上面这样程序会在"DF.Kill();"退出。
我怎么让DLL文件在"DF.Kill();"处继续驻留内存并继续完成最后的删除操作?
还有怎么在进程列表里锁定一个文件的进程名?(不随执行文件改变而改变)
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Text;namespace DeleteLibrary
{
public class DeleteMe
{
private string DeleteFile; public void Delete(Process DF)
{
DeleteFile = DF.ProcessName + ".exe";
DF.Kill();
File.Delete(DeleteFile);
} }
}如上是我写的一个删除自己(执行程序)的类。在程序退出是调用这个类,先杀死自己再删除自己。
但象上面这样程序会在"DF.Kill();"退出。
我怎么让DLL文件在"DF.Kill();"处继续驻留内存并继续完成最后的删除操作?
还有怎么在进程列表里锁定一个文件的进程名?(不随执行文件改变而改变)
但象上面这样程序会在"DF.Kill();"退出。在程序内部是不可能的。
start:
del app.exe 1>nul 2>nul if exist app.exe goto start
然后先在app.exe里调用kill.bat,然后app.exe退出
我是把这个东西用于面试,我想程序退出时自己删除自己。我不想用批处理既然DLL在程序退出时也退出,我能不能写个控制台程序呢?退出时调用控制台程序,在控制台程序结束自己的程序再删除我觉得这样可行,这样也应该会产生两个进程。但我现在无法锁定进程的名字,执行文件名字一改进程里面的名字就改了而且我也不知道怎么把执行文件的名字传到控制台里,要能这样实现上面的锁定进程名字也没必要了
这段代码在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不被删除.)
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(true);
}
using System.Collections.Generic;
using System.IO;
using System.Text;namespace DeleteF
{
class Program
{
static void Main(string[] args)
{
string DeleteF = args[0] + ".exe";
File.Delete(DeleteF);
}
}
}namespace WindowsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void Form1_Load(object sender, EventArgs e)
{
Process DF = Process.GetCurrentProcess ();
Process.Start("DeleteF", DF.ProcessName);
DF.Kill();
}
}
}