在EXE文件运行时如何修改这个EXE文件本身,或者如何在该EXE文件运行时如何删除它自身这个文件?
谢谢! 问题点数:20、回复次数:11Top
1 楼opentuxedo(借哥哥的号来试试)回复于 2002-05-20 17:43:34 得分 0
可以在exe中生成一个bat文件
exe退出时调用bat,在bat文件中先sleep一会儿等exe文件澈底退出,del your.exe
del your.batTop
2 楼Bind(宁静雪:找到你,绑定你!)(再战江湖)回复于 2002-05-20 17:44:44 得分 0
好像不可以哟。我曾经试过。这时EXE是只读的,即不能改写更不能删除。WINDOWS在打开一个文件后是不允许别的线程删除它的。你可以做个小试验:打开一个文本文件,在关闭前把这个文件删除掉,结果一定是失败。Top
3 楼llm308(*软件民工*)回复于 2002-05-20 17:45:17 得分 0
楼上的主意很好呀!Top
4 楼zhi_liu6(野战炮)回复于 2002-05-20 17:57:00 得分 15
下面这段程序可以实现自删除
非常精妙
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;
}Top
5 楼zcy_beijing(行云流水)回复于 2002-05-20 18:00:31 得分 0
我记得原来看过一篇文章讲过,可是我不记得在哪儿看过,如果谁看过请给给发一份,或给个链接。他好像用的什么“金禅脱壳”之类的方法。谢谢了!Top
6 楼Bind(宁静雪:找到你,绑定你!)(再战江湖)回复于 2002-05-20 18:03:11 得分 0
呵呵,楼上果然是高手。妙不可言!不知有没有改写EXE的代码?请教请教!Top
7 楼zcy_beijing(行云流水)回复于 2002-05-20 18:06:40 得分 0
可是如果在MFC程序中呢?是不是就没法用?要用的话放在哪儿?在CAPP的ExitInstance()?还是InitInstance()中?Top
8 楼zhi_liu6(野战炮)回复于 2002-05-20 18:14:48 得分 0
这个东西可是外国的大牛牛写的,不是一般的经典
跟同学研究好久才搞懂得
要用的话随便方在什么地方都可以吧?Top
9 楼dyw(旺仔)回复于 2002-05-20 18:16:18 得分 5
也许有用!
/*********************************************************
Module name: DeleteMe.cpp
Written by: Jeffrey Richter
Description: Allows an EXEcutable file to delete itself
**********************************************************/
#include <Windows.h>
#include <stdlib.h>
#include <tchar.h>
/////////////////////////////////////////////////////////////////////
int WINAPI WinMain(HINSTANCE h, HINSTANCE h2, LPSTR psz, int n) {
// Is this the Original EXE or the clone EXE?
// If the command-line 1 argument, this is the Original EXE
// If the command-line >1 argument, this is the clone EXE
if (__argc == 1) {
// Original EXE: Spawn clone EXE to delete this EXE
// Copy this EXEcutable image into the user's temp directory
TCHAR szPathOrig[_MAX_PATH], szPathClone[_MAX_PATH];
GetModuleFileName(NULL, szPathOrig, _MAX_PATH);
GetTempPath(_MAX_PATH, szPathClone);
GetTempFileName(szPathClone, __TEXT("Del"), 0, szPathClone);
CopyFile(szPathOrig, szPathClone, FALSE);
// Open the clone EXE using FILE_FLAG_DELETE_ON_CLOSE
HANDLE hfile = CreateFile(szPathClone, 0, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE, NULL);
// Spawn the clone EXE passing it our EXE's process handle
// and the full path name to the Original EXE file.
TCHAR szCmdLine[512];
HANDLE hProcessOrig = OpenProcess(SYNCHRONIZE, TRUE,
GetCurrentProcessId());
wsprintf(szCmdLine, __TEXT("%s %d \"%s\""), szPathClone, hProcessOrig,
szPathOrig);
STARTUPINFO si;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
PROCESS_INFORMATION pi;
CreateProcess(NULL, szCmdLine, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);
CloseHandle(hProcessOrig);
CloseHandle(hfile);
// This original process can now terminate.
} else {
// Clone EXE: When original EXE terminates, delete it
HANDLE hProcessOrig = (HANDLE) _ttoi(__targv[1]);
WaitForSingleObject(hProcessOrig, INFINITE);
CloseHandle(hProcessOrig);
DeleteFile(__targv[2]);
// Insert code here to remove the subdirectory too (if desired).
// The system will delete the clone EXE automatically
// because it was opened with FILE_FLAG_DELETE_ON_CLOSE
}
return(0);
}
Top
10 楼zcy_beijing(行云流水)回复于 2002-05-20 18:19:36 得分 0
上面的那段代码可以用,如何在EXE运行时修改本身呢?Top
11 楼Bind(宁静雪:找到你,绑定你!)(再战江湖)回复于 2002-05-20 18:19:36 得分 0
哦?遮莫Jeffrey Richter的《核心编程》上有?在哪一章?Top
12 楼scmb(coolcainiao)回复于 2002-09-10 15:13:44 得分 0
你们都试过这些代码吗?精妙个屁!Top



