2011-10-24 82 views
2

我試圖運行一個進程,等待它完成,打開可執行文件並向其中寫入內容。所以我創造了一個小的「裝載機」,正是這個。 這是我的代碼:將數據寫入正在運行的可執行文件

;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 & 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)從打開可執行文件的「loader」中創建另一個進程(等待它完成執行後)並寫入它 - 它的工作原理。 2)看起來過程仍然是開放的,即文件仍然映射,這解釋了錯誤,但我不明白爲什麼它會被映射。 3)使用Olly進行調試& ProcessExplorer我看到,即使在進程終止後,Olly也確實打開了此文件的句柄,並且所有句柄都已關閉 - 我不明白爲什麼,以及我該如何關閉它。

歡迎任何想法! :)

回答

2

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:\masm32\include\windows.inc 
include D:\masm32\include\user32.inc 
include D:\masm32\include\kernel32.inc 
includelib D:\masm32\lib\user32.lib 
includelib D:\masm32\lib\kernel32.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