Короче говоря, начиная с Windows 7 и, возможно, позже исполняемые файлы всегда разблокируются независимо от того, загружены ли они, и они должны быть явно заблокированы для предотвращения изменения или удаления.
В Windows 9x и NT/XP исполняемые файлы блокируются во время работы, и их нужно разблокировать с помощью какого-либо вызова API.
Вероятно, это очень простой способ определить/определить версию Windows, как грубо приближенной, по крайней мере, на практике (пытается переименовать или написать исполняемый файл из себя).
В Windows 95, 98 (9x) и XP (2000, NT ...) все мы помним, что все исполняемые файлы автоматически блокируются во время их работы.
Но в Windows 7 исполняемые файлы по-прежнему остаются разблокированными по умолчанию, что позволяет постоянно удалять, удалять, изменять, перекомпилировать или изменять их в файловой системе независимо от того, запущены ли они в данный момент.
Просто попробуйте скомпилировать тестовую программу под Windows 7, и вы увидите, что вы можете переименовать и даже удалить ее (попробуйте запустить, а затем удалить программу, например http://devel.archefire.org/tmp/ClockCount.zip).
Вероятно, программа, как Unlocker можно исследовать, чтобы использовать последовательность вызовов API, которая не предполагает завершения процесса:
http://www.emptyloop.com/unlocker/#download
Это список импортируемых API вызовов из Unlocker двоичного файла:
Ç ┤╪☺ n┌☺ \┌☺ ☼ GetModuleFileNameExW ♪ Ge
tModuleBaseNameW ♦ EnumProcessModules PSAPI.DLL^InitCommonControlsEx S Ima
geList_ReplaceIcon T ImageList_SetBkColor 8 ImageList_Create COMCTL32.dll WS
2_32.dll ö SHDeleteKeyA z PathSkipRootW ↨☺StrToIntA 9☺wvnsprintfA 0 PathFindE
xtensionW ¶☺StrStrW D PathIsDirectoryW r PathRemoveFileSpecW ☼☺StrStrA p Path
RemoveExtensionW | PathStripPathW ~ PathStripToRootW SHLWAPI.dll ╬♥lstrcmpiW
¶☺GetCommandLineW ╫♥lstrlenW d☺GetFileAttributesW ç DeleteFileW ┴☻RemoveDire
ctoryW !♥SetFileAttributesW ╕☺GetShortPathNameW ╤♥lstrcpyW m☻MoveFileW ☺☻Glo
balFree ♀☻GlobalUnlock ♣☻GlobalLock ◘☻GlobalReAlloc ·☺GlobalAlloc ╤ FindClos
e α FindNextFileW ╦♥lstrcmpW ╪ FindFirstFileW ü☺GetModuleHandleA 6 CloseHand
le è♥VirtualFreeEx û♥WaitForSingleObject m CreateRemoteThread ╨♥lstrcpyA ó☺Ge
tProcAddress │♥WriteProcessMemory ê♥VirtualAllocEx é☻OpenProcess X☻LocalFree
N☻LoadLibraryA ▒☻ReadFile ╩♥lstrcmpA }☺GetLongPathNameW Y CreateFileW ¬♥Wr
iteFile q☻MultiByteToWideChar δ☺GetVersionExA ╓♥lstrlenA l☻MoveFileExW û Dupli
cateHandle E☺GetCurrentProcess d♥TerminateProcess ò☻Process32NextW i☻Module32
NextW g☻Module32FirstW Ç☺GetModuleFileNameW ô☻Process32FirstW t CreateToolhel
p32Snapshot ¢☻QueryDosDeviceA V CreateFileA ╝ ExitProcess q CreateThread KERN
EL32.dll ▀☻wsprintfW Ö DestroyWindow ♥☻PeekMessageA í DispatchMessageA ▒☻Tra
nslateMessage Ö☻ShowWindow >☻SendMessageA ‼☺GetDlgItem U CreateDialogParamA
Γ☺MessageBoxA ╝ DrawTextA ♫☺GetDC ë☻SetWindowPlacement ╞ EndDialog w☺GetWind
owPlacement x☺GetWindowRect ♣☻PostMessageA ì☻SetWindowTextA Y☻SetDlgItemText
W X☻SetDlgItemTextA û DestroyIcon ┴☺LoadIconA ▬☺GetDlgItemTextW ₧ DialogBoxPara
mA 9☻SendDlgItemMessageA ├☻UpdateWindow û☺InvalidateRect \☺GetSysColor ∩☺Move
Window ☺☺GetClientRect @ ClientToScreen ▐☻wsprintfA 7 CharUpperW ← CallWindo
wProcA ò DestroyCursor å☻SetWindowLongPtrA G☻SetCapture R☻SetCursor ╜☺LoadCurs
orA ☼☻PtInRect ,☻ReleaseCapture _☺GetSystemMetrics USER32.dll ♫☻SelectObjec
t : CreateFontIndirectA ò☺GetObjectA GDI32.dll ♀ GetSaveFileNameW comdlg32.d
ll ♦☻RegSetValueExA ♣☻RegSetValueExW ╦☺RegCloseKey ╤☺RegCreateKeyExA ∞☺RegOp
enKeyExA ≈☺RegQueryValueExA Γ FreeSid 6☻SetNamedSecurityInfoW *☻SetEntriesInAc
lA ↔ AllocateAndInitializeSid ADVAPI32.dll • CommandLineToArgvW ¢ SHFileOpe
rationW å SHCreateDirectoryExW ╜ SHGetPathFromIDListW z SHBrowseForFolderW
╖ SHGetMalloc ◙☺ShellExecuteExW . ExtractIconExW •☺ShellExecuteA SHELL32.dll m
CoUninitialize ? CoInitialize ole32.dll
Вы не можете этого сделать. Вы не можете изменить исполняемый файл работающий процесс. –
Верно, но вы можете сделать его копию во время ее работы, а затем изменить эту копию по мере необходимости. Вам просто нужно придумать способ заменить оригинал копией после того, как программа перестанет работать. –