我正在尝试运行一个进程,等待它完成,打开可执行文件,然后写一些东西。所以我创建了一个小型“装载机”,它就是这样做的。 这是我的代码:
;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& amp; ProcessExplorer我看到确实Olly已经打开了这个文件的句柄,即使在进程终止之后,所有句柄都被关闭了 - 我不明白为什么,以及我该如何关闭它:)
欢迎任何想法! :)
答案 0 :(得分: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