我应该使用哪些WinAPI函数来使程序解锁自己的可执行文件以便我可以在运行时更新或重新编译它,即使它正在运行?我应该使用常规文件解锁功能吗?在这种情况下,如何从自己的进程中获取可执行文件的文件句柄?
我想创建一个可以编译的存根程序,它包含要运行的实际程序。它将具有相同的图标,并将相同的参数传递给子程序。然后它会终止自己让孩子跑。
它还包含能够重新编译,更新和重新打包的源代码。
答案 0 :(得分:0)
在CreateProcess from memory buffer
中回答“使用CREATE_SUSPENDED标志调用CreateProcess函数,该标志告诉API在调用ResumeThread函数之前保持进程暂停。
这让我们有时间使用GetThreadContext函数获取挂起线程的上下文,...使用WriteProcessMemory将内存中的exe写入挂起进程的内存空间。“
另一种方式当然是模拟CD驱动器。无论如何,CD驱动器上的可执行文件都是从缓存运行的。在旧版本的Windows(XP-)上,网络共享也是如此。
答案 1 :(得分:-3)
简而言之,自Windows 7以及之后的可执行文件,无论是否加载,都可以解锁,并且需要明确锁定它们以防止修改或删除。
< b>在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
这是Unlocker二进制文件的导入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