Запись данных в работающий исполняемый файл

#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