#assembly #process #reverse-engineering #masm32
#сборка #процесс #обратный инжиниринг #masm32
Вопрос:
Я пытаюсь запустить процесс, дождаться его завершения, открыть исполняемый файл и записать в него что-нибудь. Поэтому я создал небольшой «загрузчик», который делает именно это. Это мой код:
;Run the executable
INVOKE GetStartupInfo,OFFSET startInfo
INVOKE CreateProcess, ADDR SomeExecutableFile,
NULL, NULL, NULL, FALSE,
NORMAL_PRIORITY_CLASS, NULL,NULL,
OFFSET startInfo, OFFSET processInfo
INVOKE CloseHandle, processInfo.hThread
;Wait for it to finish amp; Close handle
INVOKE WaitForSingleObjectEx, processInfo.hProcess, INFINITE, FALSE
INVOKE CloseHandle, processInfo.hProcess
;Try to open the same exe file which just finished executing.
INVOKE CreateFile, OFFSET SomeExecutableFile,GENERIC_WRITE
,0, 0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL
MOV hFile, EAX
.IF hFile== INVALID_HANDLE_VALUE
INVOKE MessageBox,NULL, OFFSET Problem, OFFSET Problem, MB_ICONWARNING
.ELSE
INVOKE WriteFile, hFile, Buffer, 5, OFFSET BytesWritten , NULL
INVOKE CloseHandle,hFile
.ENDIF
INVOKE ExitProcess,0
Как вы можете видеть, выполняется файл ‘SomeExecutable’. После того, как он прекращает выполнение, он открывается с помощью CreateFile .
Сбой создания файла, и я получаю INVALID_HANDLE …., Последняя ошибка- 0x20 — ERROR_SHARING_VIOLATION.
Почему это происходит?
Мысли и заметки: 1) Создание другого процесса из «загрузчика», который открывает исполняемый файл (после ожидания его завершения) и записи в него — это работает. 2) Похоже, что процесс все еще открыт, т.Е. Файл все еще сопоставлен, что объясняет ошибку, но я не понимаю, почему он должен быть сопоставлен. 3) Отладка с помощью Olly amp; ProcessExplorer я увидел, что действительно у Olly есть дескриптор этого файла, открытый даже после завершения процесса, и все дескрипторы были закрыты — я не понимаю почему, и как, черт возьми, я могу его закрыть 🙂
Любые идеи приветствуются! 🙂
Ответ №1:
1- Попробуйте использовать:
invoke CreateProcess, ADDR Process, NULL, NULL, NULL, NULL, CREATE_SUSPENDED, NULL, NULL, ADDR startInfo, ADDR processInfo
CREATE_SUSPENDED должен сделать свое дело
2- Нужно ли вам изменять сам файл? Загрузчики обычно используются для изменения программ в памяти. Некоторое время назад я написал загрузчик с помощью WriteProcessMemory:
.586
.model flat,stdcall
option casemap:none
include D:masm32includewindows.inc
include D:masm32includeuser32.inc
include D:masm32includekernel32.inc
includelib D:masm32libuser32.lib
includelib D:masm32libkernel32.lib
.data
Process byte "prog.exe",0
Error byte "Error:",0
ErrorMessage byte "Process not loaded",0
ReplaceBy byte 0Fh,82h
ReplaceSize dword 2
AddressToPatch dword 01003B7Ch
Startup STARTUPINFO <>
processinfo PROCESS_INFORMATION <>
.data?
byteswritten dword ?
.code
start:
invoke CreateProcess, ADDR Process, NULL, NULL, NULL, NULL, CREATE_SUSPENDED, NULL, NULL, ADDR Startup, ADDR processinfo
cmp eax, 0
jne ProcessCreated
push 0
push offset Error
push offset ErrorMessage
push 0
call MessageBox
push 0
call ExitProcess
ProcessCreated:
invoke WriteProcessMemory, processinfo.hProcess, AddressToPatch, ADDR ReplaceBy, ReplaceSize, byteswritten
invoke ResumeThread, processinfo.hThread
push 0
call ExitProcess
end start