我應該使用哪種WinAPI函數來讓程序解鎖它自己的可執行文件,這樣我即使在運行時也可以在運行時更新或重新編譯它?我應該使用常規的文件解鎖函數嗎?在這種情況下,如何從自己的進程獲取可執行文件的文件句柄?解鎖正在運行的EXE文件
我想做一個存根程序,可以編譯,幷包含實際的程序來運行。它會有相同的圖標,並將相同的參數傳遞給子程序。然後它會自行終止讓孩子跑。
它還包含能夠重新編譯,更新和重新打包自己的源代碼。
我應該使用哪種WinAPI函數來讓程序解鎖它自己的可執行文件,這樣我即使在運行時也可以在運行時更新或重新編譯它?我應該使用常規的文件解鎖函數嗎?在這種情況下,如何從自己的進程獲取可執行文件的文件句柄?解鎖正在運行的EXE文件
我想做一個存根程序,可以編譯,幷包含實際的程序來運行。它會有相同的圖標,並將相同的參數傳遞給子程序。然後它會自行終止讓孩子跑。
它還包含能夠重新編譯,更新和重新打包自己的源代碼。
簡而言之,自從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)。
大概像解鎖的程序可以進行調查使用的API調用序列不涉及終止該進程:
http://www.emptyloop.com/unlocker/#download
這是的解鎖二進制進口API調用列表:
Ç ┤╪☺ 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
這證明事實上是不正確的 –
在CreateProcess from memory buffer
回答「調用CreateProcess的函數的n用CREATE_SUSPENDED標誌,告訴API保持進程掛起,直到ResumeThread函數被調用。
這讓我們有時間搶使用GetThreadContext函數掛起線程的上下文,...利用WriteProcessMemory的內存中的exe文件寫入到掛起的進程的內存空間「。
的另一種方式,當然,是在模擬一個CD驅動器,CD驅動器上的可執行文件無論如何都是從緩存中運行的,而在較早版本的Windows(XP-)上,網絡共享也是這樣,
你不能這樣做。正在運行的過程。 –
確實如此,但您可以在運行時製作其副本,然後根據需要修改該副本。在程序停止運行後,您只需要想出一種方法來用原件替換原件。 –