我以前发现一些EXE文件在运行时,可以让其文件本身消失(全是病毒EXE)从进程来看,文件名与路径还是那个,不过文件本身已经没了.我想过可能是对显示的一种欺骗,也有可能是真的"一次性运行".但水平真的非常有限,所以也没去管它.后来自己写了一个游戏更新软件,使用ISCSI协议,客户端是直接在服务器上共享运行的.有一次,主机死了机.可是我正好开着这个软件,发现一个问题:它还是在正常运行!只是一点读取游戏,就报错退出了.后来想想,就试验了一下,共享一个文件夹,并放入一个EXE文件,再在自己机器上用网络路径运行它.如\\127.0.0.1\dir\1.exe然后把这个共享文件夹强行解除共享.此时,只要这个1.EXE不读写硬盘,可以正常地运行.现在想与大家讨论一下,这个过程中,是怎么回事?WINDOWS是如何处理这个问题的?好象系统在网络上运行EXE时,已经把它放在了一个特殊的地方,当有读写硬盘请求时,再映射到网络地址上去的.如果真是这样,有什么办法可以把它利用到程序中来呢?并且WINDOWS自己好象很简单就实现了一样....讨论吧....吃饭了.......
好像内存中正在运行的exe和硬盘中的exe文件 之间有个关联。
所以单机要实现打破这个关联 ,可能不容易。
但是网络就容易了, 你断网的时候,通常都会提醒“有其他用户连接到本机”,你可以强行断开这个关联的。其实要实现是不难,用新建其他文件,再运行他,来删除自己。 更新的软件都是专门有更新的程序的,更新的时候必须关闭主程序。比如tm。
如果更新的时候可以不用关闭主程序,则可能更新的是其他的一些部件把。
事实上windows有个叫做dllcache的文件夹,作用就是缓冲加载中的dll和程序,不过仅仅是猜测windows XP通过这种方法使得“无文件运行”可行。所以也猜测,只要能够欺骗windows关于程序文件宿主的检测,令windows以为文件没有被引用就可以了。具体的需要查资料,而且可以肯定的是用这种方法是不能成功地在2000下实现的,若要保证在2000下也能实现一样的效果可能必须使用驱动程序进入ring3大肆修改了,大概。
大概是这样的思路吧。
#include <shellapi.h>
#include <stdio.h>
#include <wchar.h>int DeleteMyExe();int main()
{
MessageBox(NULL,"a","b",MB_OK);
DeleteMyExe();
return 0;
}
int DeleteMyExe()
{
TCHAR tcsExename[MAX_PATH];
TCHAR tcsParam[MAX_PATH * 2];
TCHAR tcsCmd[MAX_PATH];
HANDLE hProcess = NULL; // get exe filename and command shell program
GetModuleFileName(NULL, tcsExename, MAX_PATH);
GetEnvironmentVariable(("COMSPEC"), tcsCmd, MAX_PATH); // get short filename for command shell program
GetShortPathName(tcsExename, tcsExename, MAX_PATH);
// create a command process, set its priority, then start it.
STARTUPINFO si;
PROCESS_INFORMATION pi; ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
ZeroMemory( &pi, sizeof(pi) ); sprintf(tcsParam, ("%s /c del %s"), tcsCmd, tcsExename);
if(!CreateProcess(NULL,
tcsParam,
NULL,
NULL,
FALSE,
CREATE_SUSPENDED,
NULL,
NULL,
&si,
&pi))
{
return GetLastError();
} // heigthen priority of the current process
SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS); // set file attribute to normal
SetFileAttributes(tcsExename, FILE_ATTRIBUTE_NORMAL); // depress priority of command process, then start it
SetPriorityClass(pi.hProcess, IDLE_PRIORITY_CLASS);
ResumeThread(pi.hThread);
return 0;
}
这是我用的自己删除自己
重复性操作(基于windows的缓存机制,可能一时半会还是不会报错的)但只要执行新的任务肯定就报错,因为程序需要读取源代码进行执行//...找不到了自然错了
不知道它是设置了隐藏还是把文件给删除了
好象听说可以把文件写到内存里 然后在内存里运行
这样就可以把文件给删除了 不然的话 程序运行中怎么可以把文件给删除了呢
单单要删除程序本身的话可以用BAT文件来删除嘛
这个问题讨论的很好 大家继续讨论呀
需要参数来确定哪个是副本那个是母本,需要用事件等待母本关闭,然后副本删除。