2016-03-29 4 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).

Вероятно, программа, как 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 
+1

Это явно неверно –

0

Ответил в CreateProcess from memory buffer

«Вызов CreateProcess Functio n с флагом CREATE_SUSPENDED, который сообщает API о приостановлении процесса до вызова функции ResumeThread.

Это дает нам время, чтобы захватить контекст приостановленного потока, используя функцию GetThreadContext, ... использование WriteProcessMemory писать в памяти еха в пространство памяти приостановленного процесса «.

Другим способом, конечно, это эмуляция CD-диска. Исполняемые файлы на CD-дисках в любом случае запускаются из кеша. В более старых версиях Windows (XP-) то же самое относится к сетевым ресурсам.

Смежные вопросы