當一個進程被終止(未封閉)沒有什麼真的可以做到,除非你開始做一些掛鉤,無論是在任務管理器進程掛鉤TerminateProcess
或NtTerminateProcess
,例如它是如何工作的:
#include <windows.h>
#include <assert.h>
BOOL WINAPI MyTerminateProcess(HANDLE hProcess, UINT uExitCode) {
MessageBox(NULL, TEXT("Do some cleanup"), NULL, MB_OK);
ExitProcess(0);
return TRUE;
}
#pragma pack(1)
typedef struct __PATCHDATA {
BYTE push;
DWORD address;
BYTE ret;
} PATCHDATA;
#pragma pack()
int main(int argc, char **argv) {
HMODULE hModule;
DWORD written;
// This struct contains assembly instruction that do:
// push address ; 0x68 MyTerminateProcess
// ret ; 0xc3
// so the execution will return to our hook
PATCHDATA patch = {0x68, (DWORD) MyTerminateProcess, 0xc3};
// remove this code, the program will terminate itself.
// TODO: check the memory protection and modify it.
WriteProcessMemory(GetCurrentProcess(),
TerminateProcess,
&patch,
sizeof(PATCHDATA),
&written);
TerminateProcess(NULL, 0);
return 0;
}
這個鉤子在同一個進程中掛鉤了TerminateProcess
,你需要將它發佈到一個DLL中,並且它在Task Maneger進程中沒有測試它。但是這種方法過度且不安全,有些AV產品可能會將其視爲有害程序。
一個簡單的解決方案是按照@Martin James的建議清理程序啓動。在程序啓動時創建文件或使用註冊表來存儲一些值,如0
,如果程序關閉,則收到WM_CLOSE
如果是GUI或CTRL_CLOSE_EVENT
如果關閉了命令提示符,則執行清理並存儲1
。
在您查覈一下這個值,如果它劇照0
在下次啓動時,這意味着你的程序沒有正確關閉,不要做清理,如果它是1
無需清理,店0
並繼續前進。
許多程序使用此方法來檢測程序是否正確關閉。
哪個版本的Windows? –
你可以做應用程序重新啓動清理?一般來說,如果用戶從任務管理器中殺死你的應用程序,它已經死了。沒有其他安全措施是可以接受的 - 具有足夠權限的用戶必須能夠在沒有通知的情況下停止應用程序。 –
我明白了。但是我在某個地方看過應用程序需要一些時間,大約10秒鐘才能完成必要的清理工作。另外,正如我最初提到的那樣,爲什麼我能夠在情況1下處理它,而不是上面的情況2呢? – Krishna