gti*_*kok 21
这是C中的代码,它将在执行后删除可执行文件.
#include <Windows.h>
#include <strsafe.h>
#define SELF_REMOVE_STRING TEXT("cmd.exe /C ping 1.1.1.1 -n 1 -w 3000 > Nul & Del /f /q \"%s\"")
void DelMe()
{
TCHAR szModuleName[MAX_PATH];
TCHAR szCmd[2 * MAX_PATH];
STARTUPINFO si = {0};
PROCESS_INFORMATION pi = {0};
GetModuleFileName(NULL, szModuleName, MAX_PATH);
StringCbPrintf(szCmd, 2 * MAX_PATH, SELF_REMOVE_STRING, szModuleName);
CreateProcess(NULL, szCmd, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
}
void main()
{
/* Do what you need */
/* Call this function at the very end of your program to delete itself */
DelMe();
}
Run Code Online (Sandbox Code Playgroud)
在 Unix 上,只需对可执行文件调用 unlink(2) 即可。
在 Windows 上,您需要第二个进程来帮助您。st0le 的响应似乎是取消链接 DLL,但对于可执行文件,您需要启动第二个进程或使用现有进程,然后终止可执行文件并让第二个进程执行删除操作。
一个非常简单的方法是使用 cmd.exe 来提供帮助。
使用任何其他进程的推测方法可能是在另一个进程中分配一些内存,并将要删除的文件名放在那里,然后使用 CreateRemoteThread() 在远程进程中创建一个挂起的线程,其入口点为带有参数的 DeleteFile指向您分配的内存的指针。然后退出进程,线程挂起计数应该递减,然后调用 DeleteFile 来删除文件。
问题:远程进程内存泄漏,混乱。
一种更简单的方法可能就是使用 st0le 的答案中的技术获得一个支持 DLL。
| 归档时间: |
|
| 查看次数: |
17426 次 |
| 最近记录: |