2016-03-29 74 views
-2

我應該使用哪種WinAPI函數來讓程序解鎖它自己的可執行文件,這樣我即使在運行時也可以在運行時更新或重新編譯它?我應該使用常規的文件解鎖函數嗎?在這種情況下,如何從自己的進程獲取可執行文件的文件句柄?解鎖正在運行的EXE文件

我想做一個存根程序,可以編譯,幷包含實際的程序來運行。它會有相同的圖標,並將相同的參數傳遞給子程序。然後它會自行終止讓孩子跑。

它還包含能夠重新編譯,更新和重新打包自己的源代碼。

+1

你不能這樣做。正在運行的過程。 –

+0

確實如此,但您可以在運行時製作其副本,然後根據需要修改該副本。在程序停止運行後,您只需要想出一種方法來用原件替換原件。 –

回答

-1

簡而言之,自從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 
+1

這證明事實上是不正確的 –

0

CreateProcess from memory buffer

回答「調用CreateProcess的函數的n用CREATE_SUSPENDED標誌,告訴API保持進程掛起,直到ResumeThread函數被調用。

這讓我們有時間搶使用GetThreadContext函數掛起線程的上下文,...利用WriteProcessMemory的內存中的exe文件寫入到掛起的進程的內存空間「。

的另一種方式,當然,是在模擬一個CD驅動器,CD驅動器上的可執行文件無論如何都是從緩存中運行的,而在較早版本的Windows(XP-)上,網絡共享也是這樣,