2011-10-24 30 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が表示されます。

どうしてですか?

考え方&注:実行可能ファイルを開く「ローダー」から別のプロセスを作成して(実行が完了するのを待ってから)、書き込みを実行します。 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